今週のトップ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)タグ, , ,
おすすめ記事

テーマのカスタマイズで「Featured Content」というオプションがあります。日本語では「お  続きを読む

ElasticPress 4.3
blank

ElasticPressは、WordPressでElasticsearchを使うためのプラグインとい  続きを読む

Todo’s
blank

スペイン語なら「全ての」って感じ?英語なら「To Do List」で「やるべきこと一覧」といったとこ  続きを読む

最近の更新とかいろいろ
blank

忙しいを言い訳にしてこのブログを放置すること一年強、先日やっと今年最初の記事を書いた。実はその前に放  続きを読む

HHVMとPHP
blank

去年の夏「RedHat系LinuxからDebian系Linuxへ移行」した時、言語処理系もPHPから  続きを読む

トリミング3
blank

先日から投稿ページ下部に、関連記事を表示するプラグインを導入しました。人気プラグインである、Word  続きを読む

スポンサーリンク

コメントを残す

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