GUISE KIT

Jetpackの統計情報から人気記事を取得・表示するfunctionを書いたけどうまくいかなかった話

本業でWPを使って記事ランキング作りたいんだよねーと言われ、
ググッた結果出てきたのを参考に作ろうとした話。

とりあえず参考サイトのコードをレビュー

出来るとはわかっていたがやり方は知らなかったのでとりあえずググると以下のサイトが引っかかる
Jetpack By WordPress.comの情報を取得して人気記事を表示する *Ateitexe
恵方巻きの具 » Blog Archive » Jetpack のみで人気TOP10を表示する

わかり易すぎて神かよって思っていたけどこれがほぼ完璧に動くのは 「投稿しかないサイトだけ」 だと判明

何故なのか

sidebar.php

<?php my_pop_list( 7, 5 ); ?>

functions.php

$args = array( 'days'=>$target_days, 'limit'=>$n+2 );
$top_posts = stats_get_csv( 'postviews', $args );

functionのこの部分で記事リストを取得していきている訳だけど、過去7日間の5件なのでCSVにはこう入る。

01.デフォルト投稿記事ページA
02.デフォルト投稿記事ページB
03.デフォルト投稿記事ページC
04.デフォルト投稿記事ページD
05.デフォルト投稿記事ページE

これが固定ページや、カスタム投稿の記事の閲覧数が多かったりすると・・・

01.デフォルト記事ページA
02.固定ページA
03.カスタム投稿A記事ページA
04.カスタム投稿B記事ページB
05.デフォルト記事ページB

こうなる。
本来ならこのまま出力されるはずだが、

if ( $my_id != 0 && $my_id != get_the_ID() && get_post_type($my_id) == 'post' ) {

この分岐により「home」と「今表示しているページ」と「投稿以外のページ」は除外されるので
表示されるのは

01.デフォルト記事ページA
05.デフォルト記事ページB

こうなってしまう。

「5件表示したいのに2件しか出力されねーじゃねーかヽ(`Д´)ノ」

ということでこう書き換えました

function side_pop_list( $target_days, $n ) {
$i = 0;
$args = array( 'days'=>$target_days, 'limit'=>100 );
$top_posts = stats_get_csv( 'postviews', $args );
foreach ( $top_posts as $value ) {
$my_id = $value['post_id'];
if ( $my_id != 0 && $my_id != get_the_ID() && get_post_type($my_id) == 'post' ) {
if ( has_post_thumbnail($my_id) ) {
$pop_img = get_the_post_thumbnail( $my_id, 'side', array('alt'=>get_the_title($my_id)) );
}
echo '<ul><li>'."\n";
echo '<a class="cf" href="'.$value['post_permalink'].'">'."\n";
echo '</a><div class="thumb">'.$pop_img.'</div>'."\n";
echo '<div class="txt">'."\n";
echo '<div class="title">'.$value['post_title'].'</div>'."\n";
echo '<div class="views">'.$value['views'].'views</div>'."\n";
echo '</div>'."\n";
echo ''."\n";
echo '</li></ul>'."\n";
$i++;
if ( $i >= $n ) { break; }
}
}
}

limitの値を100(上限)に固定することによって取得する範囲を拡大し、
「100件取得して、上から5件を表示」という仕組みに変更しました。

これだと取得するCSVのサイズが大きくなるので、ページの読み込み量が増えるけどまぁCSVだし。

まだ謎の問題が発生

これで表示件数の問題は解決したかに見えたが取得範囲を30日にすると何故か動かない・・・

sidebar.php

<?php my_pop_list( 30, 5 ); ?>

理由はわからないけどstats_get_csvのdaysのデフォルト値が30なのでそれが原因???
これはとりあえず29とか31にすることで対処

あとがき

今回はこの2つが合わさって2時間ほど悩みました。
自分への備忘録と同じことで悩む人が出ない為に