概要説明
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' ); }