【WordPress】投稿一覧に当日分・前日分のPV数を表示する方法

2018年3月31日WordPressWordPressカスタマイズ

※この記事はプラグイン「WordPress Popular Posts」を利用しています

前記事で「WordPress Popular Posts」のデータを取得して管理画面の投稿一覧にページビューを取得して表示するところまでは出来ましたが、投稿一覧ページでアクセス数の変化を簡易的に比較するのに当日分・前日分のデータも欲しかったので続きました

7日分のページビュー表示結果
7日分のページビュー表示結果

データベースのデータにアクセスする事に

「設定」ー「WordPress Popular Posts」で確認できるページビューでは日別のデータも見れるので、その関数にアクセス出来ればと、「WordPress Popular Posts」プラグインのコードをtodayやcustomは確認できるなあ、と、ぼんやり眺めていましたが5分で挫折

これはデータベースにアクセスした方がはやいと、判断しました

「WordPress Popular Posts」で利用されているデータベーステーブルは「wp_popularpostsdata(記事別の全統計データ)」「wp_popularpostssummary(アクセス毎のデータ)」と2種類

使うのは「wp_popularpostssummary(アクセス毎のデータ)」

カラムは「id(キー)」「postid(記事ID)」「pageviews(アクセス毎なので絶対1)」「view_date(日付け)」「view_datetime(日時)」

「postid(記事ID)」「view_date(日付け)」で使えば取得できますね

当日分のアクセス数を表示するサンプル

functions.php

if(function_exists('wpp_get_views')){

    add_filter('manage_posts_columns', function($columns){
            $columns['view'] = "当日view";
            return $columns;
    });

    add_action('manage_posts_custom_column',function($column_name, $post_id){
	global $wpdb;
        date_default_timezone_set('Asia/Tokyo');
	$date = date('Y-m-d');

        if($column_name == 'view'){
	$wpdb->get_results("SELECT * FROM wp_popularpostssummary WHERE postid = $post_id and view_date = '$date'");
	echo $wpdb->num_rows;
        }
    },10,2);

}

保存されているのがアクセス毎のデータなので結果配列は取得せずページIDと日時が一致した分のHIT数だけを取得しています

前日分のアクセス数を表示するサンプル

functions.php

if(function_exists('wpp_get_views')){

    add_filter('manage_posts_columns', function($columns){
            $columns['view'] = "前日view";
            return $columns;
    });

    add_action('manage_posts_custom_column',function($column_name, $post_id){
	global $wpdb;
        date_default_timezone_set('Asia/Tokyo');
	$date = date('Y-m-d', strtotime('-1 day'));

        if($column_name == 'view'){
	$wpdb->get_results("SELECT * FROM wp_popularpostssummary WHERE postid = $post_id and view_date = '$date'");
	echo $wpdb->num_rows;
        }
    },10,2);

}

当日分と前日分のアクセス数を同時に表示するサンプル

当日分と前日分のアクセス数を同時に表示する事で簡単な比較が可能になりますね

if(function_exists('wpp_get_views')){

    add_filter('manage_posts_columns', function($columns){
            $columns['view'] = "View";
            return $columns;
    });

    add_action('manage_posts_custom_column',function($column_name, $post_id){
	global $wpdb;
        date_default_timezone_set('Asia/Tokyo');
	$dateT = date('Y-m-d');
	$dateY = date('Y-m-d', strtotime('-1 day'));

        if($column_name == 'view'){
	$wpdb->get_results("SELECT * FROM wp_popularpostssummary WHERE postid = $post_id and view_date = '$dateT'");
	echo $wpdb->num_rows.'|';
	$wpdb->get_results("SELECT * FROM wp_popularpostssummary WHERE postid = $post_id and view_date = '$dateY'");
	echo $wpdb->num_rows;
        }
    },10,2);

}

わかりやすく比較したい場合「過去24時間」と「その前の24時間」とかも良いかもですね

一週間分の日別ビューを連続して表示するサンプル

7日分のページビュー表示結果
7日分のページビュー表示結果

一週間分くらい見れればアクセス数推移の参考になるかも、と7日分のページビュー表示するタイプです

管理画面だから良いとわいえ、表示が重すぎたら却下かな思いましたが表示速度は特に変わらなのでこれでも良いかなと思ったりです

functions.php

if(function_exists('wpp_get_views')){

    add_filter('manage_posts_columns', function($columns){
            $columns['view'] = "ページビュー";
            return $columns;
    });

    add_action('manage_posts_custom_column',function($column_name, $post_id){
	global $wpdb;
        date_default_timezone_set('Asia/Tokyo');

        if($column_name == 'view'){
	$wpdb->get_results("SELECT * FROM wp_popularpostssummary WHERE postid = $post_id and view_date = '".date('Y-m-d')."'");
	echo $wpdb->num_rows.'|';
	$wpdb->get_results("SELECT * FROM wp_popularpostssummary WHERE postid = $post_id and view_date = '".date('Y-m-d', strtotime('-1 day'))."'");
	echo $wpdb->num_rows.'|';
	$wpdb->get_results("SELECT * FROM wp_popularpostssummary WHERE postid = $post_id and view_date = '".date('Y-m-d', strtotime('-2 day'))."'");
	echo $wpdb->num_rows.'|';
	$wpdb->get_results("SELECT * FROM wp_popularpostssummary WHERE postid = $post_id and view_date = '".date('Y-m-d', strtotime('-3 day'))."'");
	echo $wpdb->num_rows.'|';
	$wpdb->get_results("SELECT * FROM wp_popularpostssummary WHERE postid = $post_id and view_date = '".date('Y-m-d', strtotime('-4 day'))."'");
	echo $wpdb->num_rows.'|';
	$wpdb->get_results("SELECT * FROM wp_popularpostssummary WHERE postid = $post_id and view_date = '".date('Y-m-d', strtotime('-5 day'))."'");
	echo $wpdb->num_rows.'|';
	$wpdb->get_results("SELECT * FROM wp_popularpostssummary WHERE postid = $post_id and view_date = '".date('Y-m-d', strtotime('-6 day'))."'");
	echo $wpdb->num_rows;
        }
    },10,2);

}

7日以前のデータは一致するはずもないのでLIMITで範囲を指定した方が軽量できて良さそうですね

各コードの説明

if(function_exists('wpp_get_views')){...});

wpp_get_viewsが定義されているかどうか判別

プラグインを停止させていたり止まってしまっていた際のエラー回避

add_filter('manage_posts_columns', function($columns){...});

「manage_posts_columns」で投稿一覧ページのカラム列を読み込んで新しいカラム列を追加する無名関数を実行

「$columns」は「manage_posts_columns」で出力される

$date = date('Y-m-d');

当日や前日の日付フォーマットを取得する

global $wpdb;

WordPressはグローバルオブジェクト変数「$wpdb」を利用する

追加したカラムに取得したアクセス数を表示

add_action('manage_posts_custom_column',function($column_name, $post_id){...});

「manage_posts_custom_column」を読み込んで無名関数を実行 「$column_name」と「$post_id」は「manage_posts_custom_column」で出力される

if($column_name == 'view'){
	$wpdb->get_results("SELECT * FROM wp_popularpostssummary WHERE postid = $post_id and view_date = '$date'");
	echo $wpdb->num_rows;
        }
},10,2);

カラム名がviewの時にクエリを投げて当日のアクセス数(一致するデータの数)を取得 テーブル名は「wp_popularpostssummary」

2018年3月31日WordPressWordPressカスタマイズ

Posted by Yousuke.U