このブログでもメニューバーに「ブックマークが多いエントリー」を表示していますが、これはSBM Popular EntryというWordpressプラグインを利用させて頂いています。hatena, delicious, livedoor, yahooそれぞれのSBM数を集計してくれるので、特定のブックマークサービスに偏らずに一番ブックマークされている順で記事を表示できて便利です。ところが各ブックマークサービスのAPI呼出しの形式の変化等により、一部動作がバギーだったのでパッチを書きました。
修正したのは以下の点です。SBM_Popular_Entry1.5をベースに修正しています。
- 集計結果に同一エントリが複数回表れる
- deliciousのブックマーク数が反映されない
- 管理ページから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"; } - - /** - * 管理画面の記事リストの<th>部分のアイコン - * - */ function manage_posts_columns($posts_columns) { $posts_columns['SBM_hatena'] = '<img src="'.$this-/>plugin_url.'hatena.gif" alt="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), '/<span class="nosaved\d">(\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; </span></th>
コメント文字化けしたので消しちゃいました。ごめんなさい。




