[WPプラグイン]複数のRSSをまとめて表示するWordPress用ウィジェット「Multi-RSS Reader」を作ってみた


ひとつのRSSを読み込んで表示するウィジェットはありますが、複数のRSSを読み込めるものがなかったので、勉強がてら作ってみました。

機能・特徴

複数のRSSを読み込み、時系列で新しい方から並べ、タイトルとそのサイト名を表示します。

  • ・読み込めるRSSは10個まで可能。
  • ・キャッシュを使用するので、多数のアクセスがあっても、読み込みに時間がかかって重くなったり、RSS提供先のサーバーに負担をかけません。
  • ・WordPressプラグインになっているので導入が簡単。

注意:まだベータ版ですので、仕様が変わることがあります。

WordPress 2.8以降対応
WordPress 3.2.1、 PHP Version 5.2.6で開発
PHPのバージョンが低いと日付正しく解釈されないかも

RSSに日付が無かった場合は表示されません。
RSSに日付が有り、時間が無かった場合は、0時+タイムゾーンの時間が表示されます。日本なら+9時間ですので、10/2 9:00等と表示されます。

ダウンロード

Multi-RSS-Reader05.zipをダウンロード

インストール方法・設置方法

ダウンロードしたzipファイルを、WordPressの管理ツールのメニュー「プラグイン」→「新規追加」→「アップロード」→「ZIP 形式のプラグインをインストール」からインストールして「有効」にしてください。

「外観」から「ウィジェット」を開き、「利用できるウィジェット」の中から「Multi-RSS Reader」をサイドバーなどにドラッグします。

タイトル

サイドバーに表示させたときのタイトルです。

表示する件数

新しい順番に表示する件数です。

キャッシュ時間

外部サーバにアクセスが行き過ぎないようにRSSはキャッシュされます。そのキャッシュが有効な時間です。0にするとキャッシュを行いません。(ページを表示するたびに外部サーバのRSSを呼び出す為、作動が遅くなります。お勧めできません)

RSS URL

読み込みたいRSSのアドレスをhttp://~から入力します。対応している形式は、RSS0.9/2.0・RSS1.0・atom1.0です。
URLを削除する場合は、消してなにも入力していない状態にしてください。上から順番に並んでいる必要はなく、途中があいていてもかまいません。

 

入力が終わったら「保存」を押してください。

 

 

 

 

 

表示例

 

表示方法の改良ポイント

表示部分はul・li・divタグなどを単に入れているだけで、凝った表示がされるわけではありません。ですので、自分のテーマにあったように改良をお勧めします。208行あたりが表示に関するところです。

プログラムの仕組み

WordPressで使える関数、fetch_rss()でURL分のRSSを読み込み、時間情報を秒数に変換してソートをかけ、表示件数分を表示させているだけです。

このプログラムは日時時間がキーになることから、時間計算はちゃんと行っています。
たとえばRSS1.0の時間情報は<dc:date>タグで囲われており、

<dc:date>2011-10-01T22:35:08+09:00</dc:date>

このようなになっています。最後の+9:00はUTC(標準時)から9時間早いということを意味しています。つまり日本時間で22:35:08ということをあらわしています。なら、「+09:00」は無視でおk、という処理もできますが、(実際、この手の処理方法を検索すると、タイムゾーンを無視するやり方が多い)RSS配信者が日本人とは限りません。書かれている時間は現地の時間ということが多いですから、日本より先行しているタイムゾーンのRSSは最新の情報に載らないことになってしまいます。
また、WordPressが生成するRSSでは、「2011-10-01T01:35:08+00:00」のような標準時で配信する仕様になったようです。

2011-10-01T22:35:08+09:00 = 2011-10-01T01:35:08+00:00

これを回避するために、一度UTCに時間を直し、WordPressで設定したタイムゾーンを足してやるという方法をとっています。
これで、地球の裏側で夜中に更新したRSSが昼間の日本でちゃんと表示されるわけです。

プログラムの処理ではこの部分です

$utcsec = strtotime($v['pubdate']);			//2011-10-01T22:35:08+09:00をUTCの秒に変換
$wptimezonesec = $utcsec + get_option('gmt_offset') * 60 * 60;	//wp設定のタイムゾーンだけオフセット
$v["sec"] = $wptimezonesec;

UTCに直すのは、PHPにオマカセしています。ここが、「注意:」に書きましたが、古いphpのバージョンだと挙動が怪しい部分です。

緩募

今回初めてWordPressのウィジェットを書いたので至らない点が多々あります。バグがありましたら教えていただければと思います。
このサイトのコメント欄でもよいですが、Twitterが一番早く連絡が取れると思います。

このサイトのRSSの時間・タイトル・リンクがおかしい

RSSのURLを教えてください。解析します。

表示側で発生したエラー(RSS読み込みエラー等)を管理画面に戻す方法

PHPでガリガリ書いてしまえばできるんでしょうが、WordPressには何かスマートな方法があるのではないかなあと思っています。

プラグインの表示部分で発生したエラーを管理画面で知る方法

これもおんなじでスマートな方法があればぜひ。管理画面で設定値がおかしい場合に保存時に何かしらのエラーを表示させたいと67行目に書いているのですが、なぜか表示されません。

RSSURLフィールドを無限に増やす方法

現在は読み込めるRSSが10件と固定ですが、「さらに追加」ボタンみたいのを用意してフィールドがどんどん出来ていく方法がわからなかっただけで、本望ではありません。

_eを使っている

プログラムを見た方はわかると思いますが、日本語版しかないのにマルチランゲージ用の_eを使って文章を出力しています。単に英語に自信がなかっただけですorz

PHPをスマートに書きたい

45行目・98行目あたり、コピペの嵐です。instanceで多次元配列を使う方法が分からなかったからなのですが、もうちょっと何とかならんかなあ・・・

謝辞

このプラグインを書くにあたって以下のサイトを参考にさせていただきました。ありがとうございました。

外部複数ブログのRSS情報をWordPress上で表示する[WordPress] | QUALL – blog:

WordPress 2.8でウィジェット作成(2) – 簡単なウィジェットを完成させる | とりさんのソフト屋さん:

WordPress カスタムウィジェットの作り方 | nulldesign:

WordPress のウィジェットを自作してみる(ただし 2.8以降用) – digitalbox:

コメントはありません
コメントをどうぞ

*