【WP】はてブされた記事をサムネイル付きでランキング表示するプラグイン
今回のエントリーはWordpressのプラグインです
今回も、前回に引き続き、web屋らしいエントリーをしたいと思います。
私の仕事は主にプログラムを作ったり、サーバを管理する事が多いのですが、Wordpressのテンプレートを作っているという業務もあるため、Wordpressをクライアント様の案件に利用する機会が多くあります。
このblogがWordpressを利用しているのは、「こんな機能あれば良くない?」というアイデアが出てきた際、実際に動いているblogでデバッグするという場というのが理由だったりします。
そして、時々、アイデア出しの雑談の中で「こんな機能があれば良いよね」と誰かが言ったのを受けて「じゃ、そういうウィジェットを作れば汎用性があっていいよね」という流れになったりするわけです。
今回ご紹介するwordpressウィジェットは「自分がエントリーした記事で、はてなブックマーク数の多い順ランキングが、サムネイル(アイキャッチ)付きでサイドバーに表示できれば便利やんね?」というアイデアから生まれたものです。
「お、面白そうなプラグインやん!」というwordpressユーザーの方、宜しければ使ってみて下さい。
使い方
まずは、こちらからプログラムのダウンロードをして下さい。
はてブ数が記事ランキングを表示するWordpressプラグイン
ダウンロードされるファイルはHatenaBookmarkRanking.zipというzip圧縮されたファイルになります。
このファイルを、wodpressの管理画面にある「プラグイン」→「新規追加」で、アップロードをします。
アップロードが終わったら、プラグインのリストから、「HatenaBookmark Ranking」のプラグインを有効化して下さい。
有効化すると、ウィジェットのリストの中に、「はてなブックマークランキング」が追加されているので、表示をしたい領域にドラッグします。
例として「メインサイドバー」にドラッグをしてみました。
ドラッグ後、メニュー右の▼を押すと、設定メニューが表示されるので、枠に表示したい名称を「タイトル」の枠に、ランキングとして表示をしたい件数を「表示ランキング数」に入力して下さい。
(表示ランキング数の最大値は10です)
あとは「保存」ボタンを押せば設定完了です。
対象のサイトのURL配下にある、はてなブックマークに入れられた記事が、指定された件数分だけ表示されます。
ただし、はてなブックマークに入れられている記事が、指定された記事よりも少ない場合は、入っている記事数までの表示となります。
プログラムの解説
「使い方はこんなに簡単ですから、ダウンロードして使ってみて下さい」だけでは面白くないので、少しだけプログラムの解説をしておきたいと思います。
WordPressのプラグインを作成してみたいんだけど難しそう…と思っている方でも、こんなに簡単に作れるんだ!と思えてしまうくらいシンプルですので、ぜひ参考にして頂ければと思います。
WordPressの宣言をする
まずは、このファイルがWordpressのプラグインであるという宣言をしています。
下記のように、各項目を記述することで、Wordpressがプラグインの情報を読み取って、プラグインリストの中で情報を出力してくれるようになります。
2 3 4 5 6 7 8 9 |
/* Plugin Name: HatenaBookmark Ranking Plugin URI: http://www.kyoto-life.com/blog/951 Description: はてなブックマークにランキングされている記事リストを出力するプラグイン Author: @e_clouds Kyoto-life.com Version: 1.0 Author URI: http://www.kyoto-life.com/ */ |
クラスの宣言
クラスを宣言します。
class の後に「このプラグインのクラス名」を入力し、extends WP_Widget で、WP_Widgetを継承するようにします。
$name = の後の名称は、ウィジェットを配置する画面での表示名称になります。
11 12 13 14 |
class HatenaBmRkg extends WP_Widget { function HatenaBmRkg() { parent::WP_Widget(false, $name = 'はてなブックマークランキング'); } |
このクラスは、他のプラグインと重複しない名称を付ける必要があるので、唯一無二のクラス名になるように、このプラグインの内容を示すような名称となるよう「HatenaBmRkg」としてあります。
ウィジェット表示部分のプログラム
表画面にウィジェットを表示させる宣言をしています。
この表記はお決まりという部分ですので、「定型文」としてとらえて下さい。
16 |
function widget($args, $instance) { |
データベースに登録された、設定内容を読み込みます。
今回は、「タイトル」と「表示ランキング数」を、ウィジェットの設定項目にしていますので、この2つを読み込みます。
17 18 19 |
extract( $args ); $title = apply_filters( 'widget_title', $instance['title'] ); $rows = apply_filters( 'widget_rows', $instance['rows'] ); |
はてなブックマークのAPIに、このblogのURLをパラメータとして渡し、JSONPで受け取ります。
取得したデータを、preg_match_allで、各blog毎に分解し、$json変数に配列として取得します。
APIで正常に取得でき、$json[1]の配列にデータが存在する場合に、下記の表示処理を始めますが、まず最初に「現在の表示件数」を0件でリセットしておきます。
21 22 23 24 25 |
$jsonp = @file_get_contents("http://b.hatena.ne.jp/entrylist/json?url=".urlencode(get_bloginfo('siteurl'))."&sort=count&callback=json"); preg_match_all("/({.*?})/", $jsonp, $json); if (isset($json[1])) { $now_count = 0; |
表示をするエリアに、<div>を入れて、表示エリアの装飾をし、そのエリア中に、タイトルなどを表示するようにしています。
26 27 28 |
echo "<div class=\"widget widget_hbmr\">\n"; echo $before_title.$title.$after_title."\n"; echo "<ol class=\"hbmr-list\">\n"; |
$json[1]の配列をforeachのループ処理をします。
現在の表示件数と、データベースから取得した表示ランキング数を比較し、設定件数に達していない場合は、データの表示をします。
url_to_postid関数を利用し、URLから記事のIDを取得しておきます。
29 30 31 32 33 |
foreach ($json[1] as $no => $line) { if ($rows > $now_count) { $line_val = json_decode($line, true); $postid = url_to_postid( $line_val['link'] ); echo '<li class="hbmr-list-item hbmr-list-item'.$no.'">'; |
取得しておいた記事IDを指定し、記事にアイキャッチ画像が設定されている場合は、アイキャッチを表示するようにします。
表示をする際、アイキャッチの画像サイズを、80×80のサイズにしています。
もし、アイキャッチ画像のサイズを変更したい場合は、下記のいずれかを指定して下さい。
get_the_post_thumbnail($postid, ‘thumbnail’); // サムネイル
get_the_post_thumbnail($postid, ‘medium’); // 中サイズ
get_the_post_thumbnail($postid, ‘large’); // 大サイズ
34 35 36 |
if (get_the_post_thumbnail($postid) != "") { echo '<span class="hbmr-image">'.get_the_post_thumbnail($postid,array(80,80))."</span>\n"; } |
記事IDを指定して、記事のタイトルを取得します。
はてなブックマークのAPIからもタイトルを取得することは出来るのですが、はてなブックマークの仕様で、<title>に記述された内容が記事のタイトルとなるため、記事の文字だけでなく、サイト名などが入った文字が返却されてきたり、タイトルが長いと途中で省略されてしまいます。
そこで、get_the_titleを用いて、記事のタイトルを再取得するという処理をし、記事のリンクを設定します。
37 38 39 40 41 42 43 44 45 46 47 48 |
echo '<a class="hbmr-entry" href="'.$line_val['link'].'" title="'.get_the_title($postid).'"><span class="hbmr-entrytitle">'.get_the_title($postid).'</span></a><a href="http://b.hatena.ne.jp/entry/'.$line_val['link'].'"><span class="hbmr-count">'.$line_val['count']; if ($line_val['count'] > 1) { echo "users"; } else { echo "user"; } echo "</span></a></li>\n"; } else { break; } $now_count++; } |
表示エリアを終了するためのタグ表示をします。
49 |
echo "</ol>\n</div>\n"; |
最後に、同梱しているcssファイルを読み込む処理をします。
50 51 52 |
echo '<link rel="stylesheet" href="'.WP_PLUGIN_URL.'/hatenaBookmark_ranking/hatenaBookmark_ranking.css" type="text/css" media="all" />' . "\n"; } } |
管理画面の設定ボタンでデータベースに書き込む処理
管理画面上でpostされた「タイトル」と「表示ランキング数」をデータベースに登録する関数です。
function update の記述などは定型文としてとらえて下さい。
なお、今回のはてなブックマークAPIは、最大で10件の件数を返却しますので、それ以上の件数が入力された場合は、10件となるように補正をかける処理を入れています。
56 57 58 59 60 61 62 63 64 65 66 |
function update($new_instance, $old_instance) { $instance = $old_instance; $instance['title'] = strip_tags($new_instance['title']); $rows = trim($new_instance['rows']); if ($rows > 10) { $rows = 10; } $instance['rows'] = $rows; return $instance; } |
フォームエリアを表示する
ウィジェットのフォームエリアを表示するための処理です。
データベースから、登録されている「タイトル」と「表示ランキング数」を取得し、フォームの初期値として表示するというだけの処理です。
function form($instance) { も定型文としてとらえて下さい。
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
function form($instance) { $title = esc_attr($instance['title']); $rows = esc_attr($instance['rows']); echo "<p>\n<label for=\"".$this->get_field_id('title')."\">"; _e('タイトル:'); echo "</label>\n"; echo "<input id=\"".$this->get_field_id('title')."\" name=\"".$this->get_field_name('title')."\" type=\"text\" value=\"".$title."\" />\n</p>\n"; echo "<p>\n<label for=\"".$this->get_field_id('rows')."\">"; _e('表示ランキング数(最大10):'); echo "</label>\n"; echo "<input id=\"".$this->get_field_id('rows')."\" name=\"".$this->get_field_name('rows')."\" type=\"text\" value=\"".$rows."\" size=\"3\" />\n"; echo "</p>\n"; } } |
ウィジェットにクラスを読み込みさせる宣言をする
ここまで記述したクラスを、Wordpressのウィジェットとして利用できるように宣言をします。
87 |
add_action('widgets_init', create_function('', 'return register_widget("HatenaBmRkg");')); |
以上、簡単にプログラムの解説をしてきましたが、非常にシンプルなウィジェットですので、特に難しい部分はなかったかと思います。
また、同梱しているcssも非常にシンプルな設定しか記述しておりませんので、classを追加して表示のカスタマイズをするといった場合でも、簡単に出来るのではないかと思います。
ここまで読んで頂いて恐縮ですが、実はオフィシャルのJSあります
さて、ここまでWordpressのウィジェットについて記述してきましたが、実は、はてなブックマークのランキングを表示するJSスクリプトがオフィシャルで用意されています。
はてなブックマークヘルプ
ブログの人気記事を貼り付ける
つまり、このJSを利用すれば、今回のウィジェットを利用しなくても、人気記事ランキングを表示することは可能なのです。
今回のスクリプトは、「JSで表示するのではなく、htmlソースに記述して表示したい」とか「アイキャッチを表示したい」「タイトルを全部表示したい」といったカスタマイズが必要な場合に利用して頂けるのではないかと思います。
今回のシステム系blog、いかがだったでしょうか。
また「あれば便利かな?」と思うようなプログラムを思いついたら、また記事にするかもしれません。
もし「こんな機能は出来ないですか?」などアイデアやご要望があれば、コメント頂ければ次回エントリーの参考にさせて頂きたいと思います。
(あくまでも参考なので、出来るかどうかは保証出来ませんので、あらかじめご了承下さい)
便利なプラグイン早速使わせていただきます。
さて、ショートコード等でテーマ中の任意の場所に表示出来る機能があれば、自分の場合より柔軟に使えて便利だと思いました。乱筆失礼します。