今週のトップ10

閲覧数: 145(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)タグ, , ,
ElasticPress日本語設定

前回の「検索結果の期待値」では「日本人としては長い休み」で検索出来ないと言うところまで話をしました。  続きを読む

究極のt2.nanoインスタ...
blank

EC2の中で最小インスタンスタイプである「t2.nano」はCPUが1コアでメモリは512MBです。  続きを読む

非互換対応再び
blank

サイトのお守りというのは、言い換えれば「それらを構成するソフトウェア群とそれらが稼働するハードウェア  続きを読む

SWIPER実装CSS編
blank

テーマ側のレスポンシブとSWIPERの微調整です。これまではスマホの縦画面を中心に調整してきましたが  続きを読む

大事件の後始末?
blank

年末と年始に起こしてしまった大事件の後始末がまだだったので、ここで片づけます。事件の顛末は「年末の大  続きを読む

プラグインの脆弱性
blank

トップページから記事を選択して個別のページへ飛んだ後、本文の下に関連記事を表示するために使用していた  続きを読む

スポンサーリンク

コメントを残す

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