最近はWordPressのカスタマイズをガッツリやっている。
構造を掴めればかなり色んなところをカスタマイズできるようになっている。
特にデータベース周りをいじるのがものすごく簡単なのを今更知って驚いた。最初は「こんなんでいいんか」と結構違和感があったけど結構慣れてきた。
だいたいやりたいことはプラグインを使えば一瞬で出来るんだけど、最小限の機能をもたせるならカスタマイズしたほうが好きなように変えられるから好き。
今日は練習で投稿一覧の画面にアクセス数(PV)を表示できるようにしてみた。
投稿一覧画面にアクセス数(PV)を表示する
投稿一覧画面にアクセス数を表示する手順としては以下。
- 投稿一覧画面にアクセス数を表示する場所を作る
- アクセス数を記録・取得できるようにする
- カスタマイズした投稿一覧画面にアクセス数を表示する
順にコードを張っていきます。
投稿一覧画面をカスタマイズ
今回書くプログラムのコードはすべて「functions.php」に記載していけば動くはず。
まずは投稿一覧画面をカスタマイズしてアクセス数を表示できる場所を作成してみる。
一番右端に入れるのもつまらないので、タグの右に突っ込んでみることにする。
以下が「アクセス数(PV)」のカラム(列)をタグの右に入れるコード。
// 投稿一覧画面のPV数を表示箇所を作成 function manage_posts_columns($columns) { global $post; if ( $post->post_type == 'post' ) { // 個別投稿時のみ $date_escape = $columns['date']; // 退避 $comm_escape = $columns['comments']; // 退避 unset($columns['date']); unset($columns['comments']); $columns['access_pv'] = 'アクセス数(PV)'; // 追加 $columns['comments'] = $comm_escape; // 追加 $columns['date'] = $date_escape; // 追加 } return $columns; } add_filter( 'manage_posts_columns', 'manage_posts_columns' );
個別投稿の時のみに表示するようにpost_type = ‘post’を指定する。
もともと表示されていた項目の間に入れるには、
- 入れたい項目より右にある項目を消す
- 入れたい項目を追加
- 元々右にあった項目を復活(追加)する
という順序で行う。
今回の場合で言えば「コメント数」と「日時」のカラムを変数に退避させて、「アクセス数(PV)」を追加。その後退避したカラムを復活させるって形。
カスタマイズした画面にPVを表示させる
お次は上で作ったカラムにPVを実際に表示できるようにする。
// 新規追加したPVの列にPV数を取得して表示 function inside_access_column( $column_name ) { global $post; if ( $post->post_type == 'post' && $column_name == 'access_pv' ) { $access = get_post_views($post->ID); if ( !empty($access) ) { echo $access.' views'; } else { echo '0 views'; } } } add_action( 'manage_posts_custom_column', 'inside_access_column' );
カラム名が$column_nameは上で指定したカラム名と通じているので統一する。今回は「access_pv」。
PVが1もない場合は「0 views」と表示されるようにした。
アクセス数を記録・取得できるようにして完成
これでPVを表示できるようになったけど、肝心のPVの記録と取得がまだできてない。
今WordPressでこのページを見てもエラーが表示されると思う。「get_post_views」という関数名がまだないからだ。
ここからはPV数を記録、取得できるようにしていく。
まずは保存から。
//アクセス数の保存 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 ); } } } add_filter( 'the_content', 'set_post_views' );
特にデータベースに接続してゴニョゴニョやる必要もなく、ちょー簡単に記録できてしまう。
add_post_meta、update_post_meta、delete_post_metaで登録も更新も削除も一発。ここが結構感動したしデータベース操作に慣れてる僕が戸惑ったところでもある。
add_filterでコンテンツを表示した時にフックさせてるけど、関数内の最初のif文でis_single()を指定してやれば個別記事のみアクセス数が更新される仕組み。
自分がログインしていたり、BOTからのアクセスの場合はアクセス数の加算対象から除外してやる処理も入れた。
次にアクセス数の取得。
//アクセス数の取得 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 "0 views"; } return $count . ''; }
アクセス数の取得は記録したアクセス数をそのまま取得する。データが無かったら0を登録する処理も入れてある。
最後に「アクセス数の保存」で使ってるis_Bot関数を書いてやれば表示できると思う。
// BOTを除外 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; }
あとはログアウトするかchromeのシークレットモードを使って記事にアクセスしたら投稿一覧画面のPV数が増えていく。
参考:[WordPress]プラグイン無しで記事のアクセス数をカウントする関数と、アクセスランキングの表示を行うスニペット
この記事がなかったらもっと時間かかってただろうなぁ。ありがとうございます!
コメントを残す