WordPress - CounterizeIIから人気記事リスト取得関数作成!
Updated:
今更ながら、アクセス数の多い記事の一覧を表示させて見ました。
最初は人気記事リスト取得用のプラグインを探して試用してみましたが、プラグイン導入時からのアクセスを集計しているように見えるし、こんなことごときにプラグインなんてと思い、既に導入済みのアクセス集計プラグイン「CounterizeII」を利用できないかと考えてみました。
【2011/12/26追記】下記の方法は「投稿日時ベース」となっております。「アクセス日時ベース」で集計するには「WordPress - 人気記事一覧修正!」をご参照ください。
「CounterizeII」導入時からのアクセスデータがMySQLに書き込まれているわけですから、それを利用しない手はありません。意外と簡単に実現可能でした。 テーマフォルダ内にある関数ファイル「functions.php」に関数を追加作成して、それを該当の場所で呼び出せばよいのです。(”wp-includes”フォルダ内の「functions.php」ではありません)
作業記録
1. SQL実行テスト
関数をいきなり作成する前に、前もってSQLを作成してテスト見る必要があります。 phpMyAdmin等でSQL文を作成・実行して、希望通りの結果が得られるか確認します。 今回は投稿記事データが記録されている「wp_posts」とページアクセス状況が記録されている「wp_Counterize_Pages」テーブルをJOINして「投稿ID」・「投稿タイトル」・「アクセス数」を取得します。 以下がテスト用SQLです。(過去30日間のアクセス数の多い上位10件)
SELECT B.postID, A.post_title, B.CNT
FROM `wp_posts` AS A
INNER JOIN
( SELECT postID, SUM( count ) AS cnt
FROM `wp_Counterize_Pages`
GROUP BY postID ) AS B
ON A.ID = B.postID
WHERE B.postID IS NOT NULL
AND A.post_date > date_add( now(), interval -30 day )
ORDER BY B.cnt DESC
LIMIT 10
【2011/09/14修正】wp_Counterize_Pagesには同じ”postID”でも複数レコードが存在するため、同じ”postID”は合算するように修正。 ※「wp_Counterize_Pages」の”postID”カラムがNULLでないレコードの”count”の値が各投稿のアクセス数です。
2. 関数作成
上記のSQLを関数化します。取得件数・取得期間は引数で指定可能にしています。 WordPressの使用中のテーマ内の「functions.php」に以下のように記述を追加します。
function most_popular_post( $cnt, $days = 0 ) {
global $wpdb;
if ( $days == 0 ) {
$day_opt = "";
} else {
$day_opt = " AND A.post_date > date_add( now(), interval -" . $days . " day )";
}
$sql = "SELECT B.postID, A.post_title, B.CNT "
. " FROM `wp_posts` AS A "
. " INNER JOIN "
. " ( SELECT postID, SUM( count ) AS cnt "
. " FROM `wp_Counterize_Pages` "
. " GROUP BY postID ) AS B "
. " ON A.ID = B.postID "
. " WHERE B.postID IS NOT NULL " . $day_opt
. " ORDER BY B.cnt DESC "
. " LIMIT ". $cnt;
$res = $wpdb->get_results( $sql, ARRAY_N );
return $res;
}
【2011/09/14修正】wp_Counterize_Pagesには同じ”postID”でも複数レコードが存在するため、同じ”postID”は合算するように修正。 ※第1引数の取得件数は必須。第2引数の取得期間は指定しない場合は全件対象。
3. 関数使用設定
人気記事リストを表示させたい場所にPHPソースを記述します。 今回はサイドバーに追加しました。
File: </pre>
1
2
3
4
5
6
7
8
9
10
<h2 class="h2-sidebar">人気の記事(過去30日)</h2>
<div id="popular_post">
<ul>
<ul>
<li><a title="<?php echo $post[1]; ?>" href="/wordpress/?p=<?php echo $post[0]; ?>"><!--?php echo $post[1]; ?-->
- <!--?php echo number_format( $post[2] ); ?--> Views</a></li>
</ul>
</ul>
</div>
<pre>
※全投稿記事内からアクセスの多い記事を表示させると旬でないものが上位に来てしまう。旬な話題でもない(大げさに言うと、もはや忘れて欲しい)のにクリックされてさらにアクセス数が増えてしまう、という悪影響を避けるため過去30日間でアクセスの多い10件を表示するように指定しています。
参考サイト
- 関数リファレンス/wpdb Class - WordPress Codex 日本語版
-
[WordPress の設定を使ってデータベースにアクセスする方法 Sun Limited Mt.](http://blog.syuhari.jp/archives/410 “WordPress の設定を使ってデータベースにアクセスする方法 Sun Limited Mt.”)
今回は人気記事の一覧を取得するだけが目的なので上記の要領で充分でした。 プラグインを使用すれば、他の機能も利用できるというメリットがありますが。。。
以上。
Comments