mk-mode BLOG

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

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

WordPress - 人気記事一覧修正!

[ ブログ ] [ SQL, WordPress, プラグイン ]

こんばんは。

以前、WordPress のアクセス統計プラグイン「CounterizeII」を使って人気記事一覧を表示する方法(SQL)を紹介しました。

(「CounterizeII」を弄ったことのある方なら、テーブル名・フィールド名に馴染みがあると思います)

しかし、考え方を間違えていたことが発覚!

  • 【誤】過去30日以内に投稿された記事のアクセス数を集計
  • 【正】過去30日以内にアクセスのあった記事のアクセス数を集計

使用するSQLを修正しました。

SQL文の修正

  • 【誤】過去30日以内に投稿された記事のアクセス数を集計

1
2
3
4
5
6
7
8
9
10
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

  • 【正】過去30日以内にアクセスのあった記事のアクセス数を集計

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT B.postID, A.post_title, B.CNT
  FROM </span><span class="n">wp_posts</span><span class="o"> AS A
       INNER JOIN
       ( SELECT BC.postID AS postID, COUNT(*) AS CNT
           FROM ( SELECT BA.pageID AS pageID, BB.postID AS postID
                    FROM ( SELECT timestamp, pageID
                             FROM </span><span class="n">wp_Counterize</span><span class="o">
                            WHERE timestamp > date_add( now(), interval - 30 day )
                         ) AS BA
                         INNER JOIN
                         </span><span class="n">wp_Counterize_Pages</span><span class="o"> AS BB
                      ON BA.pageID = BB.pageID ) AS BC
          GROUP BY BC.postID ) AS B
    ON A.ID = B.postID
 ORDER BY B.cnt DESC
 LIMIT 10

functions.php の修正

関数の使い方は WordPress - CounterizeIIから人気記事リスト取得関数作成! を参照してください。

  • 【誤】

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;
}

  • 【正】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
function most_popular_post( $cnt, $days = 0 ) {
  global $wpdb;
  if ( $days == 0 ) {
    $day_opt = "";
  } else {
    $day_opt = "WHERE timestamp > date_add( now(), interval - " . $days . " day ) ";
  }
  $sql = "SELECT B.postID, A.post_title, B.CNT "
       . "  FROM wp_posts AS A "
       . "       INNER JOIN "
       . "       ( SELECT BC.postID AS postID, COUNT(*) AS CNT "
       . "           FROM ( SELECT BA.pageID AS pageID, BB.postID AS postID "
       . "                    FROM ( SELECT timestamp, pageID "
       . "                             FROM wp_Counterize "
       . "                            " . $day_opt
       . "                         ) AS BA "
       . "                         INNER JOIN "
       . "                         wp_Counterize_Pages AS BB "
       . "                      ON BA.pageID = BB.pageID ) AS BC "
       . "          GROUP BY BC.postID ) AS B "
       . "    ON A.ID = B.postID "
       . " ORDER BY B.cnt DESC "
       . " LIMIT  ". $cnt;
  $res = $wpdb->get_results( $sql, ARRAY_N );
  return $res;
}


修正結果は、このブログのサイドバーでご確認いただけます。

ついでに、Ruby on Rails 製のホームページで公開している統計も修正した。 ※上記で【誤】としているものを「投稿日時ベース」として、【正】としているものを「アクセス日時ベース」として閲覧できるようにした。

以上。

Comments