プラグインなしで人気記事一覧ウィジェット化-PV計測保存とPV取得

2018年2月5日

プラグインなしで人気記事一覧ウィジェット化

WordPressプラグインなしでページビューを計測し、サムネイル付きの人気記事ランキングウィジェットを作成しサイドバーに表示させる。また各投稿ページには属するカテゴリー内での人気記事ランキングウィジェット、カテゴリー別人気記事ウィジェットを作成し表示する。

PVをずっと累計していくとずっと同じランキングで面白くない可能性があるので(何かの間違いでバズったら突然ランクインもあるだろうけど)、月初めにPVをリセットする様にしてある。

長くなりそうなので何回かに分けて備忘録にする。とりあえずページビューを計測しないと何も始まらないということで、第一回はPV計測保存とPV取得の備忘録。

素直にSimple GA Ranking使っておけば?

プラグインなしで人気記事一覧ウィジェット化
プラグインなしで人気記事一覧ウィジェット化

WordPressの人気記事一覧表示プラグインと言えば「WordPress Popular Posts」ですが、記事数が多くなったりアクセスが増えるとサーバーへの負荷が増えレンタルサーバー側から「WordPress Popular Postsは使うな!」と警告がきたり、最悪サイトにアクセス不能に陥りレンタルサーバーから追い出されるはめに。

現在ではGoogleアナリティクスの解析結果を用い低負荷なプラグイン「Simple GA Ranking」を人気記事一覧表示に使ってくださいとこぞって皆さんおすすめしている様子。皆さんおすすめしてるんだから素直にSimple GA Rankingを使っておけばいいものを設定が面倒だから嫌だと、余計に面倒な「プラグインなしで人気記事一覧ウィジェット化する」なることをする私であった。

ここで説明するプラグインなしで人気記事一覧を表示する方法はカスタムフィールドの値を操作して使うので、アクセスがある度にカスタムフィールドの値を書き換えることになり、その度にデータベースにアクセス、結局はWordPress Popular Postsと同じでサーバー負荷増大となるんではなかろうかと思う。まあ、当サイトはアクセスないからその心配はないけど。

PV計測保存とPV取得する関数コード

長い前フリはこのあたりにして、まずはページビューを計測しないと何も始まらないのでPV計測と表示する関数コードを作成する。なお、クローラーやBOTのアクセスとログインユーザーのアクセスは除外するようになってる。

クローラーやBOTのアクセスを除外 isBot()

function isBot() {
    $bot_list = 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',
                       );
     
    $is_bot = false;
    foreach ($bot_list as $bot) {
        if (stripos($_SERVER['HTTP_USER_AGENT'], $bot) !== false) {
            $is_bot = true;
            break;
        }
    }
    return $is_bot;
}

上のコードを使ってるテーマのfunctions.phpに書き込む。isBot()は、BOTやクローラーのアクセスかどうか判定している。ここから先、functions.phpにいくつかコードを書き込むのでfunctions.phpが肥大化するので下の記事の方法で整理整頓した方がよいのではないかな。

ページビューの取得コード get_post_views()

//ページビューの取得
function get_post_views( $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 "まだアクセスがありません";
    }
    return $count . '';
}

上のコードを使ってるテーマのfunctions.phpに書き込む。post_views_countというのが、PVの値を書き込むカスタムフィールドのフィールド名(key)になる。

<?php  echo 'アクセス数: ' .  get_post_views(get_the_ID()); ?>

個別投稿(single.php)テンプレートに上のコードを貼り付けると、貼り付けたところに「アクセス数:●●」といった感じでページビューが表示される。

ページビューの計測保存コード set_post_views()

//ページビューの計測保存//
function set_post_views( $postID ) {
	if( is_single() && !is_user_logged_in() && !isBot() ) {
	  $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 );
	  }
	}
}

remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0);

上のコードを使ってるテーマのfunctions.phpに書き込む。アクセスがある度にカスタムフィールドpost_views_countの値をプラスしていく。

17行目は、この方法でPVを取得するとWordPressがヘッダーに出力する前の投稿次の投稿のリンクがあると勝手にカウントがあがってしまうそうで、勝手にカウントがあがらない様にするためリンクをヘッダーに出力しないようにリムーブしている。

3行目のis_single() && の部分は場合によってはいらない。詳しくは次で説明。

<?php set_post_views( get_the_ID() );  ?>

個別投稿(single.php)テンプレートに上のコードを貼り付ける。上で3行目のis_single() && の部分は場合によってはいらないといったのはこのため。個別投稿(single.php)テンプレートに貼り付けるのだからis_single() && はいらないということ。

当サイトの場合、使っているテーマの関係上シングルページの時という条件が必要だったのでis_single() && という条件をつけているということ。

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に上のように追加して、下のように個別投稿(single.phpp)テンプレートに追加してもいいかもしれない。

<?php if( !is_user_logged_in() && !isBot() ) {
              set_post_views( get_the_ID() ); 
} ?>

ダッシュボードの投稿一覧にPV数とサムネイルを表示する

ダッシュボードの投稿一覧にPV数とサムネイルを表示する
ダッシュボードの投稿一覧にPV数とサムネイルを表示する
function manage_posts_columns($columns) {
$columns['post_views_count'] = 'PV数';
$columns['thumbnail'] = 'サムネイル';
return $columns;
}
function add_column($column_name, $post_id) {
if ( $column_name == 'post_views_count' ) {	
$stitle = get_post_meta($post_id, 'post_views_count', true);
}
if ( $column_name == 'thumbnail') {	
$thumb = get_the_post_thumbnail($post_id, array(100,100), 'thumbnail');	
}
if ( isset($stitle) && $stitle ) {
echo attribute_escape($stitle);
}
else if ( isset($thumb) && $thumb ) {
echo $thumb;
}
else {
echo __('None');
}
}	
add_filter( 'manage_posts_columns', 'manage_posts_columns' );
add_action( 'manage_posts_custom_column', 'add_column', 10, 2 );

投稿一覧にPV数とサムネイルを表示してみる。上のコードを使ってるテーマのfunctions.phpに追加する。

以上、プラグインなしで人気記事一覧ウィジェット化の準備、PV計測保存とPV取得でした。次は一月に一回PV数をリセットする方法を備忘録。まだまだプラグインなしで人気記事一覧ウィジェット化の道のりは長い。