プラグインを使えば簡単ですが
ワードプレスでランキングを載せるならプラグインを使うほうが便利だと思います。ただ少し重くなったりします。
このサイトのランキングページはプラグインなしで作っています。意外と簡単だったりしますが「カスタム投稿の場合は?」とか、なんだかんだと時間がかかってしまったので備忘録です。何か参考になれば嬉しいです。
今回のテーマ
- ユーザーからのアクセスのみをカウントする。
- クローラーからのアクセスをカウントしない。
- ログイン中のアクセスをカウントしない。
『functions.php』記事のアクセス数を計測するために追記
カスタムフィールドに「post_views_count」を追加する。
アクセスがあったら値が+1。
//記事のアクセス数を計測するために追記
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);
}
}
『functions.php』クローラーのアクセスを判別するために追記
なんでもカウントOKってことなら以下は不要。
クローラー、いっぱいあるので必要なものだけでOK。
//クローラーのアクセスを判別するために追記
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;
}
『single.php』に追記する
追記する場所はsingle.php内ならどこでもOK。
「!is_user_logged_in()」→ログイン中以外
「!is_bot()」→クローラー以外
<?php if( !is_user_logged_in() && !is_bot() ) { set_post_views( get_the_ID() ); } ?>
人気記事(ランキング)を表示する
- 5件表示する。
- カスタム投稿の場合
<ol>
<?php
$popular = new WP_Query(array(
'posts_per_page' => 5,
'meta_key' => 'post_views_count',//投稿数をカウントするカスタムフィールド名
'orderby' => 'meta_value_num',
'order' => 'DESC',
'post_type' => array('カスタム投稿名','カスタム投稿名','カスタム投稿名'),
'post_status' => 'publish',
'caller_get_posts' => 1,
'offset' => 0,
));
while ($popular->have_posts()) : $popular->the_post();
?>
<li>
<div class="popular_thumbnail">
<a href="<?php the_permalink() ?>" title="<?php the_title_attribute(); ?>">
<?php if ( has_post_thumbnail() ): ?>
<?php echo get_the_post_thumbnail(); ?>
<?php else: ?>
No image
<?php endif; ?>
</a>
</div>
<div class="popular_entrytitle">
<a href="<?php the_permalink() ?>" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a>
</div>
</li>
<?php endwhile; wp_reset_postdata(); ?>
</ol>
注意点
- 『functins.php』と『single.php』の関数名を同じにすること。