WordPressで記事を新着順ではなく人気順・ページビュー数順で表示するためのソースコードをメモしていきます。プラグインを使用しなくてもかなり簡単に実装できちゃいます。
ざっくりとした実装の処理内容は以下の流れとなります。
- 記事が初めて読まれた時にビュー数をカウントするメタデータ(カスタムフィールド)を、
add_post_meta()
で作成 - 記事が読まれるたびに
update_post_meta()
でビュー数のメタデータを上昇させる(ログイン時やロボットを除く) - WP_Queryでビュー数のメタデータでソートさせて表示する。
これだけ。以外と簡単です。
WordPressでは投稿に任意のメタデータを追加できるカスタムフィールドを追加することができるので、それを活用します。
ただ、管理画面からカスタムフィールドを扱うのではなく、関数で作成から値の更新までやってしまうだけ。
ちなみに、メタデータはwp_postmetaテーブルに保存されます。
手順1:ビュー数メタデータを作成・更新するための関数を用意しておく
冒頭で説明した処理内容1・2をそのまま記述すると長くなってしまうので、先に、これらの処理をまとめた関数を作成しておきます。
ページ数を取得してくれる関数を作成しておきます。
functions.phpに以下を記述しておきます。
//記事のビュー数メタデータを作成・更新する関数
function setPostViews() {
$post_id = get_the_ID();
$custom_key = 'post_views_count';
$view_count = get_post_meta($post_id, $custom_key, true); //現在のビュー数を取得
//すでにメタデータがあるかどうかで処理を分ける
if ($view_count === '') {
delete_post_meta($post_id, $custom_key);
add_post_meta($post_id, $custom_key, '0');
} else {
$view_count++;
update_post_meta($post_id, $custom_key, $view_count);
}
}
すでにメタデータがあればupdate_post_meta()
で値の更新を、まだメタデータが存在していなければadd_post_meta()
で新規に作成する、といった処理内容になります。
また、上記の例では'post_views_count'
というキーでビュー数を保存していますが、ここは好きな名前に変えてください。
保存されたビュー数を取得するには
ビュー数の取得は、通常のカスタムフィールドの値を取得する方法と同じですので、post_custom()
やget_post_meta()
といった関数が使用できます。
例:クエリループ内で現在の投稿のビュー数を表示
//post_customを使う場合
echo post_custom('post_views_count');
//get_post_metaを使う場合
echo get_post_meta(get_the_ID(), 'post_views_count', true);
setPostViews()
のように関数にしておいてもいいでしょう。
記事のビュー数を取得する関数を作成
//functions.phpにて定義
function getPostViews($post_id = null) {
$post_id = $post_id ? $post_id : get_the_ID();
$custom_key = 'post_views_count';
$view_count = get_post_meta($post_id, $custom_key, true);
if ($view_count === '') {
//まだメタデータが存在していなければ
delete_post_meta($post_id, $custom_key);
add_post_meta($post_id, $custom_key, '0');
$view_count = 0;
}
return $view_count.' Views'; //'Views' の部分は好きな表示に変えてください。
}
ビュー数を表示したい場所で上記の関数を echo すると「〇〇 Views」と表示されます。
getPostViewsでビュー数を出力
//ループ内の場合
echo getPostViews();
//投稿IDを指定して、その投稿のビュー数を表示することも可
echo getPostViews(50); //投稿ID 50 の記事のビュー数を表示
post_custom()
やget_post_meta()
でカスタムフィールドの値を取得する方法について、詳しくは以下の記事でメモしてあります。
参考にしてみてください。
手順2:記事内(single.php)で先ほど作成した関数を呼び出す
先ほど作成した関数、setPostViews()
をsingle.phpで呼び出すことで、記事が閲覧されるたびにビュー数を更新していきます。
呼び出す場所はget_header() 以降であればどこでも問題ありません。
また、自分やロボットの閲覧によって値が更新されないように条件分岐をしておくと、より純粋なデータが取得できます。
single.php内の任意の場所に追記
<?php
// 記事のビュー数を更新(ログイン中・ロボットによる閲覧時は除く)
if (!is_user_logged_in() && !is_robots()) {
setPostViews(get_the_ID());
}
?>
自分で記事を確認する時は、ビュー数を上げてしまわないように先にログインしておきましょう。
手順3:WP_Queryを使ってビュー数順に記事を表示させる
WP_Queryを使用して、ビュー数のメタデータの値でソートさせましょう。
手順1で作成したsetPostViews()
で設定したビュー数のキー'post_views_count'
を使用します。
例 : ビュー数順で記事タイトルを10件表示(ビュー数付き)
<ul>
<?php
$args = array(
'post_type' => 'post',
'meta_key' => 'post_views_count',
'orderby' => 'meta_value_num',
'order'=>'DESC',
'posts_per_page' => 10,
);
$the_query = new WP_Query( $args );
if($the_query->have_posts()):
while($the_query->have_posts()): $the_query->the_post();
echo '<li><a href="'.get_permalink().'">'.get_the_title().'<span>'.getPostViews().'</span></a></li>';
endwhile;
endif;
wp_reset_postdata();
?>
</ul>
以上になります!
これで、簡単に記事をページビュー数順で表示させることができました!
出力するタグを好きなようにカスタマイズして使用してください。
また、WP_Queryを使用してカスタムフィールドの値でソートさせる方法は以下でメモしてありますので、イメージがしにくい方は参考にしてみてください。
コメント
コメント一覧 (3件)
setPostViewsの12行目、$countではなく$view_countではないでしょうか。
getPostViewsの6行目、====ではなく===ではないでしょうか。
ご指摘ありがとうございます。修正しておきました!
はじめまして。
wordpressのカスタマイズをしていると、よく了さんのサイトに辿り着きます。
初心者でもわかるように丁寧に解説していただけているので、本当にいつも助かっています。
感謝しかありません。ありがとうございます。