こんにちは、元調剤薬局の薬剤師、今は福井県でフリーのホームページ制作をやっている@ジョウです。
今回の記事は、備忘録として、『WordPressでプラグインを使わないで人気記事の一覧を表示させる方法』について整理しておこうと思います。
人気記事の一覧を表示させるプラグインは、『WordPress Popular Posts』が超有名ですが、なんでもかんでもプラグインに頼ってしまうのもよろしくないので、コーディングします。
この記事の内容
コピペで人気記事の一覧を実装する
以下のコードを使えば、人気記事の一覧が表示されます。
『functions.php』
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
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); //カスタムフィールドを値0で追加する add_post_meta($postID, $count_key, '0'); }else{ $count++; update_post_meta($postID, $count_key, $count); } } // 人気記事出力用 記事のPVを取得 function getPostViews($postID){ $count_key = 'post_views_count'; //指定したIDの投稿のメタデータを取得する trueは文字列としての取得 $count = get_post_meta($postID, $count_key, true); //カスタムフィールドができてないなら値0で追加 if($count==''){ //念のためにカスタムフィールド情報を削除 delete_post_meta($postID, $count_key); //カスタムフィールド情報を追加 add_post_meta($postID, $count_key, '0'); return "0 View"; } return $count.' Views'; } |
single.php
1 2 3 4 5 6 |
<?php // 記事のビュー数を更新(ログイン中・クローラーは除外) if (!is_user_logged_in() && !is_robots()) { setPostViews(get_the_ID()); } ?> |
人気記事の一覧を表示させたいページ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<?php $args = array( 'post_type' => 'post', 'meta_key' => 'post_views_count',//カスタムフィールドの項目 'orderby' => 'meta_value_num', //meta_valueとするとカスタムフィールドの値が文字列として認識され 2よりも10の方が先に来てしまう。 カスタムフィールドを数字として評価するには「meta_value_num」を利用。 'posts_per_page' => 5, 'order'=>'DESC', ); $the_view_query = new WP_Query( $args ); if ($the_view_query->have_posts()): while($the_view_query->have_posts()): $the_view_query->the_post(); ?> <!-- サムネイルの表示 --> <!-- タイトル表示 --> <!-- PV数表示 --> <p><?php echo getPostViews($post->ID); ?></p> <?php endwhile; ?> <?php endif; ?> <?php wp_reset_postdata(); ?> |
ここからそれぞれのコードを簡単に説明していきます。興味ある方はご覧ください。
全体の流れ
初心者でもわかりやすいように、まず全体のコーディングの流れを整理します。
- 各記事が表示されたとき、PVをカウントするための関数を作る(functions.php)
- 上記関数を記事に入れる(single.php)
- 人気記事の一覧を表示させたいページに出力する
ややこしくなるので、ここでは、PV数の表示はしません。表示する方法は、後述してあります。
1.各記事が表示されたとき、PVをカウントするための関数を作る(functions.php)
PVをカウントするための関数を作ります。関数を作るためのコードを書くファイルは、functions.phpです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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); //カスタムフィールドを値0で追加する add_post_meta($postID, $count_key, '0'); }else{ $count++; update_post_meta($postID, $count_key, $count); } } |
『get_post_meta()』は、カスタムフィールドの値を取り出すための関数です。第一引数は、投稿記事のID、第二引数はキーを入力し、第三引数をtrueとすると、文字列を取り出します。
ここで、get_post_metaで取り出しているのは、PV数($count)です。ifで条件分岐して、PV数がまだない場合、0を設定し、add_post_metaでカスタムフィールドをセットしています。
add_post_metaの前の、delete_post_metaは念のためにカスタム情報を消しているだけです。
条件分岐のelse以降は、$countがあれば、その数字にプラス1をして、update_post_metaでカスタムフィールドの値を更新しています。
2.上記関数を記事に入れる(single.php)
1で作ったPV数をカウントする関数を投稿記事に入れます。投稿記事なので、おそらくsingle.phpファイルに書くことになります。
1 2 3 4 5 6 |
<?php // 記事のビュー数を更新(ログイン中・クローラーは除外) if (!is_user_logged_in() && !is_robots()) { setPostViews(get_the_ID()); } ?> |
is_user_logged_in()は、ログインしているかどうかを意味します。
is_robotts()は、クローラーかどうかを意味します。
今回、PV数のカウントでは、管理人・クローラーを除外しています。
get_the_ID()は、現在の投稿のIDを取得します。
3.人気記事の一覧を表示させたいページに出力する
人気記事の一覧を表示させたいページに以下のようなコードを書いていきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?php $args = array( 'post_type' => 'post', 'meta_key' => 'post_views_count',//カスタムフィールドの項目 'orderby' => 'meta_value_num', //meta_valueとするとカスタムフィールドの値が文字列として認識され 2よりも10の方が先に来てしまう。 カスタムフィールドを数字として評価するには「meta_value_num」を利用。 'posts_per_page' => 5, 'order'=>'DESC', ); $the_view_query = new WP_Query( $args ); if ($the_view_query->have_posts()): while($the_view_query->have_posts()): $the_view_query->the_post(); ?> <!-- サムネイルの表示 --> <!-- タイトル表示 --> <?php endwhile; ?> <?php endif; ?> <?php wp_reset_postdata(); ?> |
meta_keyで設定しているのは、1で設定したカスタムフィールドのキー、『post_views_count』です。
‘orderby’ => ‘meta_value_num’としないと、ちゃんと数字の大きい順に並んでくれません。
人気記事の一覧にPV数を表示させたいならさらに関数を作成
上記までのコードで、人気記事の一覧を表示することはできますが、PV数までは表示されていません。
PV数も表示させたい場合は、さらに関数を作成しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// 人気記事出力用 記事のPVを取得 function getPostViews($postID){ $count_key = 'post_views_count'; //指定したIDの投稿のメタデータを取得する trueは文字列としての取得 $count = get_post_meta($postID, $count_key, true); //カスタムフィールドができてないなら値0で追加 if($count==''){ //念のためにカスタムフィールド情報を削除 delete_post_meta($postID, $count_key); //カスタムフィールド情報を追加 add_post_meta($postID, $count_key, '0'); return "0 View"; } return $count.' Views'; } |
functions.phpで関数を作成します。
カスタムフィールドのキー、post_views_countにPV数が設定されているのでそれを取り出すだけでいいわけです。
取り出す場合、まだ値が設定されていないかもしれないのでそれをifで条件分岐します。
人気記事の一覧をPV数付きで表示させたいページに出力する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<?php $args = array( 'post_type' => 'post', 'meta_key' => 'post_views_count',//カスタムフィールドの項目 'orderby' => 'meta_value_num', //meta_valueとするとカスタムフィールドの値が文字列として認識され 2よりも10の方が先に来てしまう。 カスタムフィールドを数字として評価するには「meta_value_num」を利用。 'posts_per_page' => 5, 'order'=>'DESC', ); $the_view_query = new WP_Query( $args ); if ($the_view_query->have_posts()): while($the_view_query->have_posts()): $the_view_query->the_post(); ?> <!-- サムネイルの表示 --> <!-- タイトル表示 --> <!-- PV数表示 --> <p><?php echo getPostViews($post->ID); ?></p> <?php endwhile; ?> <?php endif; ?> <?php wp_reset_postdata(); ?> |
まとめ
以上です。今回のコードは、こちらの記事を参考にしました。
かなりわかりやすいので、このページの説明でわからないところがあれば、読んでみてください。