

【コピペで完結】プラグイン無しで人気記事をサイドバーなどに表示する - WordPress

WordPressで人気記事を出力する方法としてプラグインの「WordPress Popular Posts」を使うのも一つの選択肢ですが、今回はプラグイン無しで人気記事を表示する方法を解説します。
プラグインを使わないメリットとしては、
- 自由にカスタマイズできる
- プラグインのアップデートによる不具合に左右されない
- サイトが重くならない(「重くならない可能性が高い」という言い方のほうが厳密には正しいです)
などが挙げられます。
WordPressをカスタマイズする知識があれば、誰でも簡単に実現できるので是非試してみてください。
解説
編集するファイルは3つです。
- functions.php
- single.php や single-xxx.php などの投稿のテンプレートページ
- 人気記事一覧を表示するファイル(サイドバーや固定ページなど何でもOK)
functions.php を編集する
以下を追記します。
function set_post_views($postID) {
$count_key = 'post_views_count';
$count = get_post_meta($postID, $count_key, true);
if ($count == '') {
$count = 0;
delete_post_meta($postID, $count_key);
add_post_meta($postID, $count_key, '0');
} else {
$count++;
update_post_meta($postID, $count_key, $count);
}
}
// クローラーやボットのアクセスを判別するための関数
function is_bot() {
$ua = $_SERVER['HTTP_USER_AGENT'];
$bot = array(
'Googlebot', 'Yahoo! Slurp', 'Mediapartners-Google', 'msnbot', 'bingbot', 'MJ12bot', 'Ezooms', 'pirst; MSIE 8.0;', 'Google Web Preview', 'ia_archiver', 'Sogou web spider', 'Googlebot-Mobile', 'AhrefsBot', 'YandexBot', 'Purebot', 'Baiduspider', 'UnwindFetchor', 'TweetmemeBot', 'MetaURI', 'PaperLiBot', 'Showyoubot', 'JS-Kit', 'PostRank', 'Crowsnest', 'PycURL', 'bitlybot', 'Hatena', 'facebookexternalhit', 'NINJA bot', 'YahooCacheSystem', 'NHN Corp.', 'Steeler', 'DoCoMo',
);
foreach ($bot as $bot) {
if (stripos($ua, $bot) !== false) {
return true;
}
}
return false;
}
set_post_views()は投稿ページで実行します(後述)。
実行後、実行した投稿ページにアクセスした回数記録用のカスタムフィールド「post_views_count」を追加して、その数値を+1します。
つまり、人気記事を出力する仕組みは、全ての投稿の中から「カスタムフィールドのpost_views_countの数値の多い順」でソートしてx件表示させるということです。
次に、投稿ページにset_post_views()を実行するコードを追加します。
single.php や single-xxx.php などの投稿のテンプレートページ を編集する
投稿ページのファイルを編集します。
以下コードを、ファイルの一番上に追記します。
<?php
if(!is_user_logged_in() && !is_bot()) {
set_post_views(get_the_ID());
}
?>
set_post_views()は先程解説したので割愛します。
is_bot()はアクセスしたユーザーエージェントを取得して、検索エンジンのクローラーやボットならfalseを返します。
if(!is_user_logged_in() && !is_bot()) {のif文では、「!is_user_logged_in()で管理者としてログインしていない」かつ「ボットではない」ならset_post_views(get_the_ID());を実行するようにしています。
つまり、投稿ページにアクセスした時に、「管理者としてログインしていない & ボットではない」場合は、人気記事用のカスタムフィールドの値を+1 しています。
人気記事一覧を表示するファイル(サイドバーや固定ページなど何でもOK) を編集する
最後に、人気記事一覧を表示するファイルを編集します。どのテンプレートファイルにも表示できます。
以下コードを、ランキングを表示させたい箇所に追記します。
<div class="ranking-wrap">
<?php
$args_ranking = array(
'post_type' => 'post',
'post_status' => 'publish',
'meta_key' => 'post_views_count',
'orderby' => 'meta_value_num',
'posts_per_page' => 5,
);
$the_query = new WP_Query($args_ranking);
if ($the_query->have_posts()) :
while ($the_query->have_posts()) : $the_query->the_post();
get_template_part('parts/entry-compact', null);
endwhile;
else :
echo '<p>現在集計中です。</p>';
endif;
wp_reset_postdata();
?>
</div>
コードの中身はとてもシンプルで、WP_Queryでカスタムフィールドの値をキーにして、多い順で記事を取得&出力しているだけです。
通常の投稿であれば、オプションのpost_typeを'post_type' => 'post'に、カスタム投稿であれば'post_type' => 'カスタム投稿スラッグ'にしてあげます。
表示件数は'posts_per_page' => 5で制御しています。
これで好きな箇所に人気記事が表示されるはずです。
まとめ
人気記事をプラグイン無しで出力するのは意外と簡単です。是非試してみてください。
こちらの初期構築用テーマを使えば、人気記事をはじめ関連記事やページャーなど様々な機能が実装済みなので、WordPressの開発案件で0からテーマを作る時にかなりの工数削減になります。是非ご覧ください!