WordPressのサイト更新通知用カテゴリRSSをサイトのトップページに表示する。

とりあえずローカルでの環境なんでさくっと書いてしまいますけども、私の場合、サイトのトップページが http://localhost:8888/WordPressのトップページが http://localhost:8888/blog/ になっています(本当は index.html とか index.php とかつくけど)。
で、WordPressではカテゴリ毎のRSSも生成できるので、WordPress内にサイト更新通知用のカテゴリを作っておけば、そのカテゴリのRSSでサイトの更新を通知できるわけで。
今回はサイト更新カテゴリのカテゴリースラッグを"update"にしているので、そのRSS2.0は http://localhost:8888/blog/category/update/feed/ になりますたぶん。


で、↑のFeedを http://localhost:8888/index.html からlinkタグ使ってrel=alternateなんてしとけば更新通知の出来上がり、でありますが、ついでだからその更新情報を、トップページにAjaxを使って表示してみようという企画。
普通は外部のブログのRSSAjaxで読み込むことはセキュリティの都合でできないんですが、blogとサイトが同一ドメインにあるからサイトからblogのRSSを読み込める。


RSSの読み込みには[ajax] JKL.ParseXML/ajax通信処理ライブラリを使わせていただきます。

JKL.ParseXML クラスは、サーバ上の XML 形式ファイルをダウンロード〜解析して、 JavaScript オブジェクト(配列やマップ)に変換するライブラリです。

通信やJavaScriptのオブジェクトへの変換を一気にやってくれるので、すんごい助かりました。
読み込み処理はこんな感じ。

var url = "./blog/category/update/feed/";
function replaceUpdateInfo(){
  var http = new JKL.ParseXML( url );
  http.async( function(feed){
    /* ここに読み込みした物(feed)を使った処理を書く。 */
  });
  http.parse();
}

async()の引数になっている関数が仕事をする部分です。
feedはRSS2.0なので、エントリーの配列はfeed.rss.channel.itemになるはず。
ただし、JKL.ParseXMLでは(デフォルトでは)RSSの中にitem要素が複数あればitemはfeed.rss.channel.itemは配列になりますが、itemが一つしか無い場合(更新通知がまだ1個しか無い場合)はfeed.rss.channel.itemはそのままitemオブジェクトになります。
なので、処理をちょっと切り分ける必要がありました。feed.rss.channel.itemが配列かどうかを判断するのにinstanseofを使ったりもしたんですけど、feed.rss.channel.item.lengthの有無で判別してもOK。っていうかこっちの方がよりザコいブラウザでもサポートされてるっぽい予感がするのでこっちを採用。駄目です。String.lengthは文字列の長さを返すので、素直にinstanceof使います。


で、そのitem配列の中身から欲しい情報を取り出します。
entry = feed.rss.channel.item[i];
な感じの entry に処理をするつもりで。
記事の題名は entry.title に、更新日は entry.pubDate に、記事のURLは entry.link に入ってます。
ただしこの entry.pubDate はアレな文字列で、そのままだと使い辛いのでJavaScriptのDateオブジェクトに変換しちゃいます。
var date = new Date(Date.parse(item.pubDate));


で、こうやって得られた欲しいデータを適当にHTMLに整形して出力すれば目的は達成できます。できました。
整形のあたりには今回はチャレンジってことでMochiKitを使ったんですけど、その話は眠いから後で書くとか書かないとか。
最初の最初は通信から何から全てMochiKitでやろうと考えたんですけども、XMLを扱うなら
JKL.ParseXML を使った方が圧倒的に楽そうだったので途中で方針変更したとか何とか。