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

前回に引き続いてwpp関連です。
今回オリジナルテーマ作成にあたりwppを使用したのは全4箇所で、それぞれ以下のような仕様でした。
- 全記事中上位n件の中からランダムでx件表示
- 全記事中上位n件を表示
- カテゴリ毎に上位n件を表示
- タグ毎に上位n件を表示
この中で、「タグ毎に上位n件を表示」を実装する方法が巷で見つからなかったのでご紹介します。
今回は以下の記事を参考にさせていただきました。
- WordPress Popular Posts のランキングを無理やりquery_postsで取得し直す | hacknote(2014/2/28)
- wp_WordPress Popular Postsをquery_postsで出そうとしたらちょっと詰まった話。 (2017/7/5)-listreme-wordpress
- [カスタマイズ]WordPress Popular Posts をquery_postsで取得出来るようにする1つの方法()
カテゴリ毎の人気記事を表示する方法
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'
);