WordPress キャッシュが有効でもPVカウントができる処理をAjaxを使用して実装 ( WP Super Cache )

概要説明

WP Super Cacheプラグインを有効にしている状態で投稿ページのPVをカウントさせるカスタマイズ。AjaxでのPVカウント処理から管理画面でページごとのPV数表示まで対応。ログインしていない状態で投稿ページにアクセスした時だけPVカウントしています。

キャッシュ対象ページにてPV表示を行っている場合はページ自体をキャッシュするため、アクセスの度に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);
}
WordPress キャッシュが有効でもPVカウントができる処理をAjaxを使用して実装 ( WP Super Cache )

管理画面では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' );
}
WordPress キャッシュが有効でもPVカウントができる処理をAjaxを使用して実装 ( WP Super Cache )

関連機能

  1. WordPress 見積書・請求書が作成、管理できる無料のWordPressテーマ

  2. WordPress ユーザーごとに管理画面メニューの表示・非表示を設定できるプラグイン User Admin Simplifier

  3. WordPress 固定ページの投稿画面に新規作成したテンプレートファイルを追加する

サイドバー

よく使うカスタマイズ

最近の記事

アニメの名言集

俺は俺の責務を全うする!
ここにいる者は誰も死なせない!!

鬼滅の刃
by 煉獄杏寿郎

Profile

PAGE TOP
Amazon プライム対象