WordPressでプラグインを使わずに人気記事一覧を表示する方法

2017.12.22 WordPress
WordPressでプラグインを使わずに人気記事一覧を表示する方法

『WordPress Popular Posts』というプラグインを使えば、WordPressで人気記事を簡単に表示することができます。

このプラグインではサムネイル画像の表示など詳細な設定ができるため、大抵の場合はこれを使えば問題はないと思います。

参考ページ:WordPress Popular Posts

とはいえ、なるべくプラグインを使いたくない、テーマの方に組み込んで余計な設定の手間を省きたいというようなケースもあると思います。

ということで、今回はWordPressでプラグインを使わずに人気記事一覧を表示する方法をご紹介します。

はじめに言っておくと、ここでご紹介するソースのほとんどはGoogleで「WordPress 人気記事 プラグインなし」などで検索すれば同じようなのが出てきます。

一番分かりやすかったのは『記事のアクセス数をプラグインなしで計測しWordPressの管理画面に表示する』という記事で、人気記事を取得する方法に加え、検索エンジンクローラーや自分がWordPressにログインしているときのアクセスをカウントから除外する方法についても書かれています。

ただこの記事ではタイトル通り「アクセス数を管理画面に表示する手順」を紹介されていますので、ここでは紹介されているソースを叩き台にして、ページ上に人気記事を表示する手順を書いていきたいと思います。

記事閲覧数を取得する

まず、記事閲覧数をカウントするための関数を作成します。テーマ内のfunctions.phpに下記のコードを追記します。

/* 人気記事一覧
---------------------------------------------------------- */
//記事閲覧数を取得する
function getPostViews($postID){
  $count_key = 'post_views_count';
  $count = get_post_meta($postID, $count_key, true);
  if($count==''){
    delete_post_meta($postID, $count_key);
    add_post_meta($postID, $count_key, '0');
    return "0 View";
  }
  return $count.' Views';
}
//記事閲覧数を保存する
function setPostViews($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);
  }
}
//headに出力されるタグを削除(閲覧数を重複してカウントするのを防止するため)
remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0);

参考ページ:How to Track post views without a plugin using post meta

このコードは上記参考ページで紹介されているもので、「getPostViews」という閲覧数を取得する関数を作成し、「setPostViews」で閲覧数をカウント、「post_views_count」というカスタムフィールドに閲覧数を保存しています。

「headに出力されるタグを削除~」となっている部分については未検証なのですが、参考ページのコメントを読む限りでは、head要素内に出力される「前後ページへのリンク」のmetaタグが原因で閲覧数が重複してカウントされてしまうようなので、それを防ぐために該当のmetaタグを削除している、ということのようです。

Hi Andrew, is likely prefetching, or the setViews is added more than once. To solve the one issue try adding this. Note the code above.

// Remove issues with prefetching adding extra views
remove_action( ‘wp_head’, ‘adjacent_posts_rel_link_wp_head’, 10, 0);

投稿の閲覧数をカウントする

記事の閲覧数を取得する設定ができたので、次はその閲覧数を基準に記事を一覧表示していきます。

しかしその前に、より正確な閲覧数を取得するために、検索エンジンのクローラーによるアクセスと自分のアクセスをカウントから除外する処理を追加したいと思います。

まず、クローラーによるアクセスを判別するため、下記のコードをfunctions.phpに追記します。

//クローラーのアクセス判別
function is_bot() {
  $ua = $SERVER[HTTP_USER_AGENT];
  $bot = array(
    "googlebot",
    "msnbot",
    "yahoo"
  );
  foreach( $bot as $bot ) {
    if (stripos( $ua, $bot ) !== false){
      return true;
    }
  }
  return false;
}

こちらのページそのままですが、これでGoogle、MSN、Yahoo!のクローラーによるアクセスを判別する「is_bot」という関数を作成できました。

次に、自分のアクセスを判別する方法ですが、これは閲覧者がWordPressにログインしているかをチェックするis_user_logged_inという関数を使います※。

この「is_bot」と「is_user_logged_in」という2つの関数を使い、single.phpに下記のように記述してクローラーと自分のアクセスを除外します。

<?php
  if( !is_user_logged_in() && !is_bot() ) { //クローラーとログイン時のアクセスをカウントから除外
    setPostViews( get_the_ID() );
  }
?>

ループ内に記述する必要があるので、僕の場合は下記のようにしてループ開始直後に閲覧数をカウントするようにしています(ループ内であればどこでもいいので、同じように書く必要はありません)。

<?php
  if(have_posts()) : while(have_posts()) : the_post();
  if( !is_user_logged_in() && !is_bot() ) { //クローラーとログイン時のアクセスを閲覧数カウントから除外
    setPostViews( get_the_ID() );
  }
?>
※当たり前ですが、自分がWordPressにログインしない状態でサイトにアクセスすれば、閲覧数としてカウントされてしまいます。

人気記事一覧を表示する

ここまでで、投稿の閲覧数を取得し保存する設定と、投稿の閲覧数をカウントするための設定を行いました。

最後に、これまでに設定した閲覧数取得の仕組みを利用して人気記事一覧を表示します。テーマ内の人気記事一覧を表示したい箇所に下記のように追記してください。

ここではサイドバーに表示することを想定して「side_menu」というクラスを付与したulタグの中にliタグで人気記事のタイトルをリスト表示しています。

<ul class="side_menu">
<?php
	setPostViews(get_the_ID());
	query_posts('meta_key=post_views_count&orderby=meta_value_num&posts_per_page=10&order=DESC');
	while(have_posts()) : the_post();
?>

<li><a href="<?php the_permalink(); ?>"><?php
if(mb_strlen($post->post_title)>30):
	$title= mb_substr($post->post_title,0,30) ; echo $title. ・・・ ;
else:
	echo $post->post_title;
endif;
?></a></li>

<?php endwhile; ?>
<?php wp_reset_postdata(); wp_reset_query(); ?>
</ul>

query_postsで投稿の抽出条件を指定しています。

「post_views_count」は上で作成した「getPostViews」という関数で取得した閲覧数を格納しているカスタムフィールドです。「meta_key=post_views_count」でカスタムフィールド「post_views_count」の値を取得します。

その値を参照して「orderby=meta_value_num」と「order=DESC」で上から値(閲覧数)の大きい順に、10件(posts_per_page=10)表示しています。

まとめ

以上、WordPressでプラグインを使わずに人気記事一覧を表示する方法でした。

作業手順としては、

  1. functions.phpに閲覧数を取得&保存するための関数を作成する
  2. single.phpでクローラーと自分のアクセスを除外する設定をする
  3. 人気記事一覧を表示したい箇所にループを設置する

という流れです。別にクローラーのアクセスとか気にしないという場合には、2の作業を省いてしまうのもアリです(正確性は落ちますが)。

WordPressテーマ『HIGHLAND』公開しました

WordPressテーマ『HIGHLAND』を公開しました

このブログで紹介しているカスタマイズを、これでもかと盛り込んだ高性能なテーマになっております。商用・非商用問わず無料、是非ご利用ください。

柴田竹思

柴田竹思

日本&ベトナム二拠点生活中のWeb系フリーランス。最近は育児6:仕事4のバランスで生活してます。これでもかってくらい奥さんの尻に敷かれてる座布団系男子です。

プロフィールはこちら