mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

WordPress - CounterizeIIから人気記事リスト取得関数作成!

[ ブログ ] [ PHP, WordPress ]

こんばんは。

今更ながら、アクセス数の多い記事の一覧を表示させて見ました。

最初は人気記事リスト取得用のプラグインを探して試用してみましたが、プラグイン導入時からのアクセスを集計しているように見えるし、こんなことごときにプラグインなんてと思い、既に導入済みのアクセス集計プラグイン「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件)

1
2
3
4
5
6
7
8
9
10
11
SELECT B.postID, A.post_title, B.CNT
  FROM </span><span class="n">wp_posts</span><span class="o"> AS A
       INNER JOIN
       ( SELECT postID, SUM( count ) AS cnt
           FROM </span><span class="n">wp_Counterize_Pages</span><span class="o">
          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」に以下のように記述を追加します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  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ソースを記述します。 今回はサイドバーに追加しました。

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件を表示するように指定しています。

参考サイト


今回は人気記事の一覧を取得するだけが目的なので上記の要領で充分でした。 プラグインを使用すれば、他の機能も利用できるというメリットがありますが。。。

以上。

Comments