WordPressにおいてプラグインなしで、記事の読まれた回数をカウントし、ランキングとして表示させる方法をご紹介します。
プラグインを導入するとより手軽にランキングを表示できますが、なにかと不便だったり、サイト自体が重くなったり動かなくなることもあるので、なるべくプラグインは使用しないのが賢明かと思います。
当サイトもほぼプラグインなしで構築しています。コピペで実装できますので、参考になれば幸いです。
「functions.php」に追加
記事の閲覧回数をカウントする関数をfunctions.phpに追加します。
※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);
}
}
記事ランキングを表示する
- 5件表示
- 記事のタイトル
- 投稿された日時
- アイキャッチ画像
- 登録カテゴリ
<ol>
<?php
$popular = new WP_Query(array(
'posts_per_page' => 5,
'meta_key' => 'post_views_count',//投稿数をカウントするカスタムフィールド名
'orderby' => 'meta_value_num',
'order' => 'DESC',
'post_status' => 'publish',
'caller_get_posts' => 1,
'offset' => 0,
));
while ($popular->have_posts()) : $popular->the_post();
?>
<li>
<a href="<?php the_permalink() ?>" title="<?php the_title_attribute(); ?>">
<?php the_title(); ?>
<?php the_time('Y.m.d'); ?>
<!-- アイキャッチ画像が登録されているか -->
<?php if(has_post_thumbnail()): ?>
<?php the_post_thumbnail('index_thumbnail'); ?>
<!-- ないときは記事の最初の写真、それもないときはfunctionsに設定したパスの画像 -->
<?php else: ?>
<img src="<?php echo catch_that_image(); ?>" alt="<?php the_title(); ?>">
<?php endif; ?>
<?php if( has_category() ){ ?>
<span class="cat-data">
<?php $postcat=get_the_category(); echo $postcat[0]->name; ?>
</span>
<?php } ?>
</a>
</li>
<?php endwhile; wp_reset_postdata(); ?>
</ol>
$popular = new WP_Query(array());内に下記を追加すると特定のカテゴリに追加された投稿は除外されます。
'category__not_in' => array(5),//特定のカテゴリを外す
「single.php」にカウンターを追加
記事にアクセスがあったときにpost_viewa_countの値を+1する記述をsingle.phpに追加します。
<?php set_post_views( get_the_ID() ); ?>
しかし上記コードでは記事を確認するためにプレビュー表示した場合やクローラーが巡回した場合も回数がカウントされてしまいます。
なんでもカウントしてOKならば、上記で大丈夫です。
「functions.php」に追加
クローラーかどうかを識別するための関数を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;
}
「single.php」に追加
<?php if( !is_user_logged_in() && !is_bot() ) { set_post_views( get_the_ID() ); } ?>
CSSで装飾
出力しているところに好きなスタイルを適応させると完成です。