WordPressでプラグインなしで人気記事ランキングを作るまで

f:id:masa381man:20160307225919j:plain

こんにちは。
302inc.の宮地です。

弊社では、福井のメディアサイト「フクブロ」を運営しています。
こちらは、全てWordPressで制作しています。
WordPressの組み込み自体はそんなに難しくないのですが、
どうしても、人気記事ランキングの実装だけが、かなり四苦八苦しました。

人気記事ランキングを作るプラグイン

人気記事ランキング。
大抵、ブログサイトには、
サイドバーに人気記事ランキングを置いています。
おそらく、ほとんどがプラグインで回していると思うのですが、
代表的なのが、
「WP-PostViews」
「WordPress Popular Posts」
の2つのプラグイン。

これを入れれば、基本的な人気記事ランキングは、
何の苦なくいれこむことが可能です。

しかし、プラグインは、便利な半面カスタマイズがしづらく、
WP-PostViewsは、
サムネイルの表示やカテゴリ出力に難があり、
WordPress Popular Postsは、
HTMLマークアップ欄があるなど、
カスタマイズに優れていますが、今回実装したい形ができなかったので、
どちらも使わない結論に至りました。

人気記事ランキングの機能

フクブロに設置したい人気記事ランキングは、
<a>のリンクタグでランキング自体を囲み、
サムネイル、順位、所属カテゴリ、記事名
を出力すること。
WordPress Popular Postsでは、
<a>タグをマークアップすることが難しく、
カテゴリや記事名にそれぞれリンクが貼られるため、
使用は難しいと判断しました。
プラグイン自体を改造すればできないことはないのでしょうが、
そこまでの知識はないので断念です。

ということで、プラグインなしで実装する方法を模索しなければいけないのですが、
なかなか検索しても出てこないのです。
大抵、上記2つのプラグインを使う前提でやられており、
望む結果が出てきません。

Google AnalyticsのAPIを使う方法など、
ないことはないのですが、
プログラムの知識皆無の僕にとって、
かなり試行錯誤で、つまづき、その方法も捨てました。
おそらく、この辺りわかる人ならちゃっちゃとやれるんだろうなぁ、、、と思いつつ。。。

WP-PostViewsを使えばできる

そんな時、ひとつの光が見えます。

WP ページビューを統計して自由にランキング表示 WP-PostViews

な、なんと・・・!
WP-PostViewsでは、投稿した記事に、
新しく「views」というカスタムフィールドが生成されます。
この「views」というカスタムフィールドに、
記事の閲覧カウント数を保存しているので、
要は、それを呼び出せばいい、と。

すなわち、
あくまで、「WP-PostViews」のプラグインは、
記事ランキングを表示するのではなく、閲覧数を保存するキーを作るために使う。

完全に盲点でした。
このプラグイン自体も、生成したカスタムフィールドを呼び出して使ってるんです。
だから、自由に記事ランキングを作る際も、そのカスタムフィールドを呼び出してあげればいい。

ということで、

<?php
$args = array( 'posts_per_page' => 10,
    'orderby' => 'meta_value_num',//meta_valueではないので注意
    'meta_key' =>'views',
    'order' => 'DESC',
    );
    $my_query = new WP_Query( $args );
 if($my_query->have_posts()) : while($my_query->have_posts()) : $my_query->the_post(); ?>
<article class="rank_box clearfix">
    <a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>" class="clearfix">
    <div class="figure"><?php the_post_thumbnail('サムネイル呼び出し'); ?></div>
    <div class="text">
        <div class="spec clearfix">
            <div class="number"><?php echo $my_query->current_post+1; ?></div>
            <div class="cat <?php
            $cats = get_the_category();
            $cat = $cats[0];
            if($cat->parent){
            $parent = get_category($cat->parent);
            echo $parent->slug;
            }
            else{
            echo $cat->slug;
            }
            ?>"><?php $cat = get_the_category(); ?><?php $cat = $cat[0]; ?><?php echo get_cat_name($cat->term_id); ?></div>
        </div>
        <h6><?php the_title(); ?></h6>
    </div>
    </a>
</article>
<?php endwhile; endif; wp_reset_postdata(); ?>

ができました。
カウント数を呼び出す場所は、

<?php
$args = array( 'posts_per_page' => 10,
    'orderby' => 'meta_value_num',//meta_valueではないので注意
    'meta_key' =>'views',
    'order' => 'DESC',
    );

です。
10件表示で、viewsを呼び出していることがわかります。
その下のカテゴリの箇所は、
カテゴリのスラッグをclassにあてているので、
それを呼び出す箇所です。

<?php echo $my_query->current_post+1; ?>

これで順位を1~10で表示させてます。

以上、これで無事人気記事ランキングを出力することが出来ました。
無駄な記述があると思いますが、
それはご愛嬌ということで。。。