今週のトップ10
前回の「閲覧数を記録してみる」で記事の閲覧記録を取ることには成功しましたが、このプラグインでは細かいコントロールはまだ実装されていないようで、週間ランキングなどが実現出来ませんでした、残念。でもここで諦めるのは性に合わないので、自分で実現することにしましたw まずは下調べ。
このプラグインをインストールすると、データベースのテーブルを拡張(作成)します。post_viewsというテーブルがそれです。列はid, type, period, countという至ってシンプルな作りです。idは記事IDが入ります。typeはcountのタイプで、0, 1, 2, 3, 4の分類があります。0は日、1は週、2は月、3は年、4は合計という意味です。つまりID 123のTYPE 4のCOUNTが100だったら、それは記事ID=123の合計のアクセス数が100と言うことです。週間ランキングを表示したいので、TYPE=1を選べば良いことになります。
ただし、週単位の閲覧数は、週番号(weeknumber)毎に集計されているため、記事ID=123のTYPE=1のレコードは週の数(年末には53まで増える)だけあります。通常のSELECT文でWHERE指定でTYPEだけを指定すると、TYPE=1のレコードを全て集計するので、週単位で集計したいのに結果的に合計が表示されてしまいます。前回の記事のコメントで「週はうまくいかなかったのでw」というのはこのことです。
つまり、1つの記事の閲覧数を週単位で取得するには、記事IDに対して、TYPE=1と週番号を条件にしてSELECT文を発行すれば良いことになります。プラグインのincludes/functions.phpを開きます。pvc_get_post_views()関数を丸ごとコピーしてpvc_get_post_views2()関数を作ります。まずはpvc_get_post_views()関数のオリジナルコードから。これでは、すべての週を取得してしまいます。
"SELECT SUM(count) AS views FROM " . $wpdb->prefix . "post_views WHERE id IN (" . $post_id . ") AND type = 1"
こちらが、WHEREに複数条件を指定したSELECT文です。これで、今週の閲覧数のみを取得することが出来ます。WHERE句で列を複数指定するのが今回のポイントです。pvc_get_post_views2()関数にオリジナルコードを残し、pvc_get_post_views()関数はこのように修正します。
$datew = date('oW'); //201546のように、年と週番号を組合せた変数を用意する "SELECT SUM(count) AS views FROM " . $wpdb->prefix . "post_views WHERE (id, period) IN (SELECT " . $post_id . "," . $datew . ") AND type = 1"
これで正しい閲覧数は取得しましたが、もう一つ重要なことがあります。それはランキング形式で閲覧数の多い順に並べ替えることです。
こちらはオリジナルのコードです。作成者が異なるのか、コーディングが全く違います。こちらではJOIN文を使用しています。これも同様の理由で、TYPE=1だけの指定では週単位の合計となってしまい、意図した並び替えは実現出来ません。プラグインのincludes/query.phpを開きます。111行目付近に以下のコードがあるので修正します。
// is it sorted by post views? if ( ( $sql === '' && isset( $query->pvc_orderby ) && $query->pvc_orderby ) || apply_filters( 'pvc_extend_post_object', false, $query ) === true ) $sql = ' AND pvc.type = 1';
これが修正したコードで、同じように週番号を指定して閲覧数を取得しています。TYPE指定が不要なのは、週番号を直接指定しているためです。同一のIDでは週番号は重複しないからです。
// is it sorted by post views? $datew = date('oW'); //201546のように、年と週番号を組合せた変数を用意する if ( ( $sql === '' && isset( $query->pvc_orderby ) && $query->pvc_orderby ) || apply_filters( 'pvc_extend_post_object', false, $query ) === true ) $sql = ' AND pvc.period = ' . $datew;
最後に、今週のトップ10と抜粋を一覧表示するページでは、閲覧数は今週の数字のみを表示し、記事本文では、合計とカッコ内に今週の閲覧数を表示するようにしました。閲覧数: 100(14)のように表示します。
$views2 = pvc_get_post_views2( $post_id ); <-- pvc_get_post_views( $post_id )をコピーして作成する '<span class="post-views-count">' . number_format_i18n( $views2 ) . ' (' . number_format_i18n( $views ) . ') </span>'
pvc_get_post_views()関数を週の合計、pvc_get_post_views2()関数を総合計としたので、記事の編集画面に表示されるPost Viewsが週の合計となってしまうため、columns.phpを修正します。41行目辺りです。
// get total post views // $count = pvc_get_post_views( $post->ID ); $count = pvc_get_post_views2( $post->ID );
これで編集画面のPost Viewsの数値が総合計で表示されます。
最終更新日: 2018年2月7日