2014年11月18日

ブログもだいぶん放置気味になってしまっていましたが、そろそろアドベントカレンダーの時期ということもあり、これを機にまた、できる限り続けて書いていきたいと思います。

自作テンプレート

再開にあたってブログのデザインを更新しました。CMSはWordpressを使用していたのですが、どうせならということで、テンプレートの自作に挑戦してみました。

流れとしては、

  1. HTMLとLESSでモック を作成
  2. index.php, header.php, footer.php, sidebar.php, footer.phpに分解
  3. WordPressの関数でゴリゴリと実装
  4. functions.phpで追加機能実装

といった感じです。

変更したいときはMonacoでソースを書き換えたほうが早いなと感じてウィジェットは使用していません。ブラウザで編集できるので便利ですねMonaco。

デザインは今風にカードスタイルです。読みやすい読みにくのフィードバックもらえるとうれしいです。

Brandoo WordPress

Clear DBの無料試用枠20MBの使用量が95%を超えていたので、これを機にMSSQL用のBrandoo WordPressに変更しました。

Brandooの配布されているバージョンは3.6なのですが、最新の4.x系にアップデートしたいです。

試しにアップデートしてみたら動かなかったので、おいおい修正してコミットできたらなと思ってます。

プラグインがエラー

プラグインはほとんど使っていなかったのですが、唯一導入したのが、WordPress-popular-postsです。

このプラグインは3.8以上で導入された関数が使われているようで、$wp_min_versionが3.8でした。このままでは有効化できないので、これを3.6に変更し、足りないとエラーが出ていた次のwp_normalize_path関数をWordpressの最新版からコピーしてwp-includes/functions.phpに追加します。

でも、この関数Since3.9なんですよね。3.8じゃない。でも動いたのでいいとします。

/**
 * Normalize a filesystem path.
 *
 * Replaces backslashes with forward slashes for Windows systems, and ensures
 * no duplicate slashes exist.
 *
 * @since 3.9.0
 *
 * @param string $path Path to normalize.
 * @return string Normalized path.
 */
function wp_normalize_path( $path ) {
	$path = str_replace( '\\', '/', $path );
	$path = preg_replace( '|/+|','/', $path );
	return $path;
}

このプラグインはView数を基準に人気のポストを取得できるようにするプラグインなのですが、View数はWPのテーブルには保存されないので独自にテーブルを作成します。

そのSQL文にMySQL用の構文があったのでMSSQLでエラーになっていました。

エラーになっている箇所は頑張って見つけてT-SQL文に直しました。

@@ -1023,7 +1023,7 @@ if ( !class_exists('WordpressPopularPosts') ) {
       global $wp_version;
 
       $php_min_version = '5.2';
-      $wp_min_version = '3.8';
+      $wp_min_version = '3.6';
       $php_current_version = phpversion();
       $errors = array();
 
@@ -1293,10 +1293,25 @@ if ( !class_exists('WordpressPopularPosts') ) {
       $curdate = $this->__curdate();
 
       // Update all-time table
-      $result1 = $wpdb->query( $wpdb->prepare(
-        "INSERT INTO {$table}data
-        (postid, day, last_viewed, pageviews) VALUES (%d, %s, %s, %d)
-        ON DUPLICATE KEY UPDATE pageviews = pageviews + 1, last_viewed = '%3\$s';",
+//      $result1 = $wpdb->query( $wpdb->prepare(
+//        "REPLACE INTO {$table}data
+//        (postid, day, last_viewed, pageviews) VALUES (%d, %s, %s, %d)
+//        ON DUPLICATE KEY UPDATE pageviews = pageviews + 1, last_viewed = '%3\$s';",
+//        $id,
+//        $now,
+//        $now,
+//        1
+//      ));
+      $result1 = $wpdb->query($wpdb->prepare(
+        "MERGE INTO {$table}data AS A
+         USING (SELECT %d AS postid, %s AS day, %s AS last_viewed, %d AS pageviews) AS B
+         ON (A.postid = B.postid)
+         WHEN MATCHED THEN
+           UPDATE SET
+           A.pageviews = A.pageviews + 1, last_viewed = '%3\$s'
+         WHEN NOT MATCHED THEN
+           INSERT (postid, day, last_viewed, pageviews)
+          VALUES (B.postid, B.day, B.last_viewed, B.pageviews);",
         $id,
         $now,
         $now,
@@ -1304,10 +1319,25 @@ if ( !class_exists('WordpressPopularPosts') ) {
       ));
 
       // Update range (summary) table
-      $result2 = $wpdb->query( $wpdb->prepare(
-        "INSERT INTO {$table}summary
-        (postid, pageviews, view_date, last_viewed) VALUES (%d, %d, %s, %s)
-        ON DUPLICATE KEY UPDATE pageviews = pageviews + 1, last_viewed = '%4\$s';",
+//      $result2 = $wpdb->query( $wpdb->prepare(
+//        "INSERT INTO {$table}summary
+//        (postid, pageviews, view_date, last_viewed) VALUES (%d, %d, %s, %s)
+//        ON DUPLICATE KEY UPDATE pageviews = pageviews + 1, last_viewed = '%4\$s';",
+//        $id,
+//        1,
+//        $curdate,
+//        $now
+//      ));
+      $result2 = $wpdb->query($wpdb->prepare(
+        "MERGE INTO {$table}summary AS A
+         USING (SELECT %d AS postid, %d AS pageviews, %s AS view_date, %s AS last_viewed) AS B
+         ON (A.postid = B.postid)
+         WHEN MATCHED THEN
+           UPDATE SET
+           A.pageviews = A.pageviews + 1, A.last_viewed = '%4\$s'
+         WHEN NOT MATCHED THEN
+           INSERT (postid, pageviews, view_date, last_viewed)
+          VALUES (B.postid, B.pageviews, B.view_date, B.last_viewed);",
         $id,
         1,
         $curdate,
@@ -1506,7 +1536,7 @@ if ( !class_exists('WordpressPopularPosts') ) {
           // get views, too
           if ( $instance['stats_tag']['views'] ) {
 
-            $fields .= ", IFNULL(v.pageviews, 0) AS 'pageviews'";
+            $fields .= ", ISNULL(v.pageviews, 0) AS 'pageviews'";
             $from .= " LEFT JOIN {$prefix}data v ON p.ID = v.postid";
 
           }
@@ -1565,12 +1595,12 @@ if ( !class_exists('WordpressPopularPosts') ) {
         if ( "comments" == $instance['order_by'] ) {
 
           $fields .= ", c.comment_count AS 'comment_count'";
-          $from = "(SELECT comment_post_ID AS 'id', COUNT(comment_post_ID) AS 'comment_count' FROM {$wpdb->comments} WHERE comment_date > DATE_SUB('{$now}', INTERVAL {$interval}) AND comment_approved = 1 GROUP BY id ORDER BY comment_count DESC) c LEFT JOIN {$wpdb->posts} p ON c.id = p.ID";
+          $from = "(SELECT comment_post_ID AS 'id', COUNT(comment_post_ID) AS 'comment_count' FROM {$wpdb->comments} WHERE comment_date > DATE_SUB('{$now}', INTERVAL {$interval}) AND comment_approved = 1 GROUP BY comment_post_ID ORDER BY comment_count DESC) c LEFT JOIN {$wpdb->posts} p ON c.id = p.ID";
           $where .= " AND p.post_password = '' AND p.post_status = 'publish'";
 
           if ( $instance['stats_tag']['views'] ) { // get views, too
 
-            $fields .= ", IFNULL(v.pageviews, 0) AS 'pageviews'";
+            $fields .= ", ISNULL(v.pageviews, 0) AS 'pageviews'";
             $from .= " LEFT JOIN (SELECT postid, SUM(pageviews) AS pageviews FROM {$prefix}summary WHERE last_viewed > DATE_SUB('{$now}', INTERVAL {$interval}) GROUP BY postid ORDER BY pageviews DESC) v ON p.ID = v.postid";
 
           }
@@ -1579,7 +1609,7 @@ if ( !class_exists('WordpressPopularPosts') ) {
         // ordered by views / avg
         else {
 
-          $from = "(SELECT postid, IFNULL(SUM(pageviews), 0) AS pageviews FROM {$prefix}summary WHERE last_viewed > DATE_SUB('{$now}', INTERVAL {$interval}) GROUP BY postid ORDER BY pageviews DESC) v LEFT JOIN {$wpdb->posts} p ON v.postid = p.ID";
+          $from = "(SELECT postid, ISNULL(SUM(pageviews), 0) AS pageviews FROM {$prefix}summary WHERE last_viewed > DATE_SUB('{$now}', INTERVAL {$interval}) GROUP BY postid ORDER BY pageviews DESC) v LEFT JOIN {$wpdb->posts} p ON v.postid = p.ID";
           $where .= " AND p.post_password = '' AND p.post_status = 'publish'";
 
           // ordered by views
@@ -1598,8 +1628,8 @@ if ( !class_exists('WordpressPopularPosts') ) {
           // get comments, too
           if ( $instance['stats_tag']['comment_count'] ) {
 
-            $fields .= ", IFNULL(c.comment_count, 0) AS 'comment_count'";
-            $from .= " LEFT JOIN (SELECT comment_post_ID AS 'id', COUNT(comment_post_ID) AS 'comment_count' FROM {$wpdb->comments} WHERE comment_date > DATE_SUB('{$now}', INTERVAL {$interval}) AND comment_approved = 1 GROUP BY id ORDER BY comment_count DESC) c ON p.ID = c.id";
+            $fields .= ", ISNULL(c.comment_count, 0) AS 'comment_count'";
+            $from .= " LEFT JOIN (SELECT comment_post_ID AS 'id', COUNT(comment_post_ID) AS 'comment_count' FROM {$wpdb->comments} WHERE comment_date > DATE_SUB('{$now}', INTERVAL {$interval}) AND comment_approved = 1 GROUP BY comment_post_ID ORDER BY comment_count DESC) c ON p.ID = c.id";
 
           }

まとめ

Brandoo WordPress大変です。MySQL前提のプラグインとか結構多そうなので安易に変えないほうがいいかもしれません。

今、コメントアウトして動かしているのもはたしてほんとにコメントアウトしていいものなのか怪しいですし、ソースコードちゃんと読み込む必要がありそうです。

あと、このブログ、更新速度あげるために友人3人で書いてますが、参加したい人いたらお声掛けください。

まだ、昔の記事の修正が間に合ってませんが、ちょくちょく直していきます。

CATEGORIES