今週のトップ10

閲覧数: 132(0)

前回の「閲覧数を記録してみる」で記事の閲覧記録を取ることには成功しましたが、このプラグインでは細かいコントロールはまだ実装されていないようで、週間ランキングなどが実現出来ませんでした、残念。でもここで諦めるのは性に合わないので、自分で実現することにしました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日】
カテゴリーIT閑話, 公開タグ, ,
パンくずリスト詳細
2020年5月12日

テーマの「マイナーチェンジ」に伴って「パンくずリスト」の仕様を若干変更しました。一つ前のテーマではパ  続きを読む

関連記事の大原則
blank
2019年6月16日

ググったりしてあるページにたどり着いた閲覧者に対して、それに関連する記事を提示して少しでもサイトの滞  続きを読む

関連記事プラグイン
blank
2019年6月14日

脆弱性のため公開中止となったプラグインの代わりに選んだ、現在の「関連記事」用プラグインの設定を保存し  続きを読む

ElasticsearchとWordPress
blank
2019年6月7日

(とついでに「Mediawiki」)関連情報があちこちにとっちらかっちゃったので、一旦整理する意味で  続きを読む

カテゴリー制限
blank
2019年6月6日

カテゴリー制限はこのサイトでは過去に何度も出題された「頻出過去問題」です。初期の頃は「Allow C  続きを読む

PageSpeed Insights
blank
2019年6月5日

はGoogleが提供する「ウェブページのコンテンツを解析し、ページの読み込み時間を短くするための方法  続きを読む

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください