WordPress Popular Postsでタグ毎の人気記事を表示させる方法

この記事は最終更新から2年以上が経過しています。情報が古くなっている可能性があります。

前回に引き続いてwpp関連です。
今回オリジナルテーマ作成にあたりwppを使用したのは全4箇所で、それぞれ以下のような仕様でした。

  • 全記事中上位n件の中からランダムでx件表示
  • 全記事中上位n件を表示
  • カテゴリ毎に上位n件を表示
  • タグ毎に上位n件を表示

この中で、「タグ毎に上位n件を表示」を実装する方法が巷で見つからなかったのでご紹介します。

今回は以下の記事を参考にさせていただきました。

カテゴリ毎の人気記事を表示する方法

wppは外観<メニューから設定する他に、ショートコードやphpに直接記述できる関数が用意されています。
例えば、カテゴリ毎の人気ランキングというのはphpで以下のように記述すれば実装が可能です。

<?php
 $wpp = array (
 'cat' => "'.$categoryid.'", //集計対象のカテゴリID
 'limit' => '5', //表示件数
 'range' => 'all', //PV集計期間
 'order_by' => 'views', //並び順
 'post_type' => 'post', //集計対象
 'thumbnail_width' => '70', //サムネイルの幅
 'thumbnail_height' => '70', //サムネイルの高さ
 'wpp_start' => '<div id="popular-post"><ul class="wpp-list">', // HTMLのラッパー 開始タグ
 'wpp_end=' => '</ul></div>', // HTMLのラッパー 終了タグ
 'post_html' => '<li>{thumb} {title} <span class="post-stats">{stats}</span><div class="clear"> </div></li>' //HTML部分
); ?>
<?php wpp_get_mostpopular($wpp); ?>

このようなやり方で、
「全記事中上位n件を表示」
「カテゴリ毎に上位n件を表示」
この2つまでは特に問題なく実装できました。

しかし、この関数ですが実はタグ用のパラメータが用意されていません。
どうするか…と調べたところ、どうやら無理やりquery_postsで取得する方法があるらしい!

query_postsでランキングデータを取得する

試しにやってみました。

<?php if (function_exists('wpp_get_mostpopular')) { 
//ショートコードを$shortcodeに代入
$shortcode = '[wpp';
    $atts = 'post_html="{url},"            
 wpp_start=""
 wpp_end=""
 order_by="views"
 range="weekly"
 stats_comments=0
 stats_views=1
 limit=100
';
$shortcode .= ' ' . $atts . ']';

//ショートコードを実行し、結果を$resultへ。
//記事のURLがランキングの順で取得される
$result = preg_split('/,/', strip_tags(do_shortcode( $shortcode )));

$ranked_post_ids = array();

//記事のURLから投稿IDを取得し、$ranked_post_idsへ代入
foreach($result as $_url){        
    if(!empty($_url) && trim($_url) != ''){
       $replaced_url = preg_replace("/.*\/archives\/([0-9]+).*/", "$1", $_url);
       $id_string = url_to_postid($replaced_url);
       if($id_string) {
            array_push ($ranked_post_ids, intval($id_string));
       }
    }
}

$args = array(
    'posts_per_page' => 5,//表示件数
    'post__in' => $ranked_post_ids, //取得する投稿IDの配列
    'orderby' => 'post__in' //並び順
);
query_posts($args);

if ( have_posts() ) : while ( have_posts() ) : the_post();?>

**ループ処理**

<?php
endwhile;endif;
wp_reset_query();
} ?>

参考)[カスタマイズ]WordPress Popular Posts をquery_postsで取得出来るようにする1つの方法()

問題なく表示ができることを確認! ヽ(*´∀`)ノ

ちなみにパーマリンクの中に「%postname%」を使った場合記事毎にパーマリンクの編集ができますが、日本語だったり、コピーしたページだったりでパーマリンクとスラッグが一致していない場合があるようです。(たまたまなのか、よくある事なのかは分からないのですが)
そうなっていると、url_to_postidでURLから投稿IDをうまく取得できないので注意が必要です。

タグ毎の人気記事を表示する

query_postsに入ってさえしまえば、タグでの絞り込みも容易です。
上記コードの32行め〜36行めを以下に変更します。

$tags = get_query_var('tag');
$args = array(
    'posts_per_page' => 5,
    'post__in' => $ranked_post_ids,
    'tag' => $tags,
    'orderby' => 'post__in'
);

こちらで、投稿タグの人気記事ランキングが表示できるようになりました!

注意点として、wppによって$shortcodeに代入したパラメータlimitの件数が取得された後にquery_postsで出力する件数(‘posts_per_page’)に絞り込まれるため、出力したい件数分がlimitに入ってるとは限らないことです。

例えば、タグ「hogehoge」のランキングを出したいとき、
limit = 100
posts_per_page = 5
このような指定で$shortcodeのlimit分の記事(=全記事中上位100件)にタグ「hogehoge」の記事が1件しかなかった場合、quesry_postのposts_per_pageが5件でも、取得できているのが1件しかないので1件しか表示されません。

あまりビュー数が少ない記事のタグだと、$shortcodeのlimitを大きい値にする必要があります。

おまけ「全記事中上位n件の中からランダムでx件表示」

ちなみに、「全記事中上位n件の中からランダムでx件表示」する場合は32行め〜36行めを以下に変更するとできます!

$args = array(
    'posts_per_page' => 5,
    'post__in' => $ranked_post_ids,。
    'orderby' => 'rand'
);