SBM Popular Entryのパッチを書いた

このブログでもメニューバーに「ブックマークが多いエントリー」を表示していますが、これはSBM Popular EntryというWordpressプラグインを利用させて頂いています。hatena, delicious, livedoor, yahooそれぞれのSBM数を集計してくれるので、特定のブックマークサービスに偏らずに一番ブックマークされている順で記事を表示できて便利です。ところが各ブックマークサービスのAPI呼出しの形式の変化等により、一部動作がバギーだったのでパッチを書きました。

修正したのは以下の点です。SBM_Popular_Entry1.5をベースに修正しています。

  1. 集計結果に同一エントリが複数回表れる
  2. deliciousのブックマーク数が反映されない
  3. 管理ページからhatenaとlivedoorブックマークへのリンク切れ

以下がパッチになりますが、集計結果に同一エントリが複数回現れるのは、コードではなくMySQLのバージョンが原因かもしれません。僕の場合はMySQL 4.0.26(チカッパレンタルサーバ)で、この現象が発生していたのですが、下記パッチを当て、MySQLを5.0.51にアップデートすることで問題は発生しなくなりました。

--- wp-sbm_popular_entry.php.orig       2010-01-08 17:32:29.000000000 +0900
+++ wp-sbm_popular_entry.php    2010-01-08 17:32:51.000000000 +0900
@@ -9,23 +9,17 @@
 Author URI: http://aoina.com
 */

-
-
-
-
 $SBM_PopularEntry = new SBM_PopularEntry();

 add_filter('manage_posts_columns', array(&$SBM_PopularEntry, 'manage_posts_columns'));
 add_action('manage_posts_custom_column', array(&$SBM_PopularEntry, 'manage_posts_custom_column'));

-add_action('wp_head',  array(&$SBM_PopularEntry, 'wp_head'));
+add_action('wp_head', array(&$SBM_PopularEntry, 'wp_head'));
 add_action('wp_head', array(&$SBM_PopularEntry, 'get_count'));

 unset($SBM_PopularEntry);

-
-class SBM_PopularEntry
-{
+class SBM_PopularEntry {
     var $plugin_url;
     var $post;
     var $post_meta;
@@ -34,22 +28,11 @@
     var $urllink;
     var $key;

-
-    /**
-     *
-     *
-     */
-    function SBM_PopularEntry()
-    {
+    function SBM_PopularEntry() {
         $this->plugin_url = get_option('siteurl')."/wp-content/plugins/wp-sbm_popular_entry/";
         $this->key = "SBM_count";
     }

-
-    /**
-     * 管理画面の記事リストの部分のアイコン
-     *
-     */
     function manage_posts_columns($posts_columns)
     {
         $posts_columns['SBM_hatena']    = 'hatena';
@@ -60,11 +43,6 @@
         return $posts_columns;
     }

-
-    /**
-     * 管理画面の記事リストに被ブックマーク数を表示
-     *
-     */
     function manage_posts_custom_column($column_name)
     {
         global $post;
@@ -72,9 +50,9 @@
         if(@$this->post->ID != $post->ID){
             $this->post = $post;
             $this->permalink   = get_permalink();
-            $this->urllink['hatena']    = "http://b.hatena.ne.jp/entry/".urlencode($this->permalink);
-            $this->urllink['delicious'] = "http://del.icio.us/url/".md5($this->permalink);
-            $this->urllink['livedoor']  = "http://clip.livedoor.com/page/".urlencode($this->permalink);
+            $this->urllink['hatena']    = "http://b.hatena.ne.jp/entry/".substr($this->permalink, 7);
+            $this->urllink['delicious'] = "http://delicious.com/url/".md5($this->permalink);
+                       $this->urllink['livedoor']  = "http://clip.livedoor.com/page/".$this->permalink;
             $this->urllink['yahoo']     = "http://bookmarks.yahoo.co.jp/url?url=".urlencode($this->permalink);

             $meta = get_post_meta($this->post->ID, $this->key, 1);
@@ -104,29 +82,25 @@
     }


-    /**
-     * 記事表示時に各ブクマサイトより被ブックマーク数をGET
-     *
-     */
     function get_count()
     {
         global $post;

-        if (!is_single() && !is_page) return false;
-        if (!$post->ID > 0) return false;
		 +        if (!is_single() && !is_page()) return false;
+        if ($post->ID < = 0) return false;

         $permalink = get_permalink();
-        $flg = get_post_meta($post->ID, $this->key, 1);
+        $flg = get_post_meta($post->ID, $this->key, true);
         if(!$flg){
             $flg = "00000<>0<>0<>0<>0<>0<>0";
-            add_post_meta($post->ID, $this->key, $flg, 1);
         }
-        $meta = explode("<>",$flg);
+        $meta = explode("<>", $flg);

-        if( $meta[1] > time()-60*60 ) return false;
+        if($meta[1] > time() - 60*60)
+                 return false;

         $new_meta['hatena']    = $this->xmlrpc_results('http://b.hatena.ne.jp/xmlrpc', 'bookmark.getCount', $permalink);
-        $new_meta['delicious'] = $this->socket_results('http://del.icio.us/url/'.md5($permalink), '/this url has been saved by ([\d]+?) (person|people)/');
+               $new_meta['delicious'] = $this->socket_results('http://feeds.delicious.com/v2/json/urlinfo/'.md5($permalink), '/"total_posts":([\d]+?),/');
         $new_meta['livedoor']  = $this->xmlrpc_results('http://rpc.clip.livedoor.com/count', 'clip.getCount', $permalink);
         $new_meta['yahoo']     = $this->socket_results('http://bookmarks.yahoo.co.jp/url?url='.urlencode($permalink), '/(\d)人が登録< \/span>/');

@@ -138,7 +112,7 @@

         $meta[0] = $meta[2] + $meta[3] + $meta[4] + $meta[5];
         $meta[0] = substr("00000".$meta[0], -5);
-        $meta[1]  = time();
+        $meta[1] = time();
         update_post_meta($post->ID, $this->key, implode('<>', $meta));
     }

@@ -366,12 +340,12 @@
     $icon['popup']     = $pluginurl."popup.gif";

     $link['hatena']    = 'http://b.hatena.ne.jp/entry/'.$permalink;
-    $link['delicious'] = 'http://del.icio.us/url/'.md5($permalink);
+    $link['delicious'] = 'http://delicious.com/url/'.md5($permalink);
     $link['livedoor']  = 'http://clip.livedoor.com/page/'.$permalink;
     $link['yahoo']     = 'http://bookmarks.yahoo.co.jp/url?url='.$permalink;

     $add['hatena']     = "http://b.hatena.ne.jp/append?".$permalink."&h=".$title;
-    $add['delicious']  = "http://del.icio.us/post?url=".$permalink."&title=".$title;
+    $add['delicious']  = "http://delicious.com/post?url=".$permalink."&title=".$title;
     $add['livedoor']   = "http://clip.livedoor.com/clip/add?jump=myclip&link=".$permalink."&title=".$title;
     $add['yahoo']      = "http://bookmarks.yahoo.co.jp/action/post/done?url=".$permalink."&title=".$title;

コメント文字化けしたので消しちゃいました。ごめんなさい。

1 thought on “SBM Popular Entryのパッチを書いた”

Leave a Reply

Your email address will not be published. Required fields are marked *