概要説明
WP Super Cacheプラグインを有効にしている状態で投稿ページのPVをカウントさせるカスタマイズ。AjaxでのPVカウント処理から管理画面でページごとのPV数表示まで対応。ログインしていない状態で投稿ページにアクセスした時だけPVカウントしています。
キャッシュ対象ページにてPV表示を行っている場合はページ自体をキャッシュするため、アクセスの度にPV数は更新はされません。
~ 目次 ~
AjaxにてPVカウントさせるためのファイルを追加
ajax_pv_cnt.js
/*----------------------------------------------------
PVカウント更新用のAjax処理
----------------------------------------------------*/
jQuery(function ($) {
var post_id = $(".pv_cnt_up").attr("id");
jQuery.ajax({
type: "POST",
url: ajax_object.ajaxurl,
data: {
action: 'update_pv_cnt',
id: post_id
},
success: function (result) {
}
});
});
テーマディレクトリ\js\ajax_pv_cnt.js にアップロード
Ajaxの呼び出し、AjaxからコールさせるPvカウント処理
functions.php
/*----------------------------------------------------
Ajaxの呼び出し、AjaxからコールさせるPvカウント処理
----------------------------------------------------*/
if ( !function_exists( 'update_pv_cnt' ) ){
function ajax_activation(){
if( ! is_user_logged_in() && is_single() ) {
wp_enqueue_script(
'ajax_script',
get_template_directory_uri() . '/js/ajax_pv_cnt.js?time='.time(),
array( 'jquery' ), false
);
wp_localize_script(
'ajax_script',
'ajax_object',
array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) )
);
}
}
add_action('template_redirect', 'ajax_activation');
function update_pv_cnt() {
$id = isset( $_POST['id'] ) ? $_POST['id'] : false;
$key = 'page_view_cnt';
$cnt = get_post_meta($id, $key, true);
if( empty($cnt) ){ $cnt = 1; } else { $cnt++; }
update_post_meta($id, $key, $cnt);
}
//add_action('wp_ajax_update_pv_cnt', 'update_pv_cnt'); // ログインしている場合
add_action('wp_ajax_nopriv_update_pv_cnt', 'update_pv_cnt'); // ログインしていない場合
}
任意の場所でPV数を取得して表示させる処理
functions.php
/*----------------------------------------------------
ページの表示回数を取得
----------------------------------------------------*/
if ( !function_exists( 'get_view_cnt' ) ){
function get_view_cnt( $post_id ){
$key = 'page_view_cnt';
$cnt = get_post_meta( $post_id, $key, true );
if( $cnt == '' ){
delete_post_meta( $post_id, $key );
add_post_meta( $post_id, $key, '0' );
return '0';
}
return $cnt;
}
}
<?php echo get_view_cnt( $post->ID ); ?>
任意の位置にPVを表示させることができます
テンプレートファイルにajax呼び出し用の処理を追加
<div class="pv_cnt_up" id="<?php echo $post->ID; ?>" style="display:none;"></div>
管理画面投稿一覧に記事ごとのPVを表示させる
functions.php
/*----------------------------------------------------
管理画面 投稿一覧にPVを表示
----------------------------------------------------*/
if ( !function_exists( 'admin_posts_columns' ) ){
// 管理画面 投稿一覧にPV見出しを追加
function admin_posts_columns( $columns ) {
$columns['page_view_cnt'] = 'PV';
return $columns;
}
add_filter('manage_posts_columns', 'admin_posts_columns');
// 管理画面 投稿一覧にPVを追加
function add_manage_posts_custom_column($column_name, $post_id) {
if ($column_name === 'page_view_cnt') {
echo get_view_cnt( $post_id );
}
}
add_action('manage_posts_custom_column', 'add_manage_posts_custom_column', 10, 2);
}
管理画面ではPV数がリアルタイムに加算されていきます
管理画面全体にIP制限をしている場合
<Files ~ "^admin-ajax.php$"> allow from all </Files>
上記で特定のファイルへのアクセスを解除しておきましょう。
投稿一覧の追加項目にソート機能を追加
functions.php
/*----------------------------------------------------
管理画面 投稿一覧のPVをソート可能にする
----------------------------------------------------*/
if ( !function_exists( 'posts_register_sort' ) ){
function posts_register_sort( $columns ) {
$columns['page_view_cnt'] = 'page_view_cnt';
return $columns;
}
add_filter( 'manage_edit-post_sortable_columns', 'posts_register_sort' );
function column_custom_sort_param( $columns ) {
if ( isset( $columns['orderby'] ) && 'page_view_cnt' == $columns['orderby'] ) {
$columns = array_merge( $columns, array(
'meta_key' => 'page_view_cnt',
'orderby' => 'meta_value_num'
));
}
return $columns;
}
add_filter( 'request', 'column_custom_sort_param' );
}



