1. TOP
  2. WordPress
  3. 【コピペで完結】プラグイン無しで人気記事をサイドバーなどに表示する - WordPress
詳しくはこちら
WordPress
 | 

【コピペで完結】プラグイン無しで人気記事をサイドバーなどに表示する - 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からテーマを作る時にかなりの工数削減になります。是非ご覧ください!

    関連記事