ブログ等では記事を書くと勝手にRSS生成されるが、自前HPなどでRSS対応したい場合、自力で作る必要がある。
例えば、Osada’s Software!では、シェアウェアであるRSSエディタ Headline-Editorを使用しRSSを作成している。作成していた。
これはこれで大変便利で重宝している。
しかし、動的にページ更新されるようなサイトには不向き。
そんな訳で、RSSを作成するためのPHPプログラムを作ってみた。
仕様は以下の通り。
# 更に細かな仕様はソース参照。
・PHPバージョン:PHP4、PHP5
・RSSバージョン:RSS2.0
・文字コード:UTF-8
<?php rssWrite(“タイトル”,”説明”); /******************/ /* RSS2.0保存処理 */ /******************/ function rssWrite($item_title, // 追加アイテムのタイトル名 $item_description) // 追加アイテムの説明 { // RSS出力ファイル名 $rss_file = “index.xml”; // サイト名 $site_name = “RSSテスト用サイト”; // サイト説明 $site_description = “RSS2.0保存テスト用のサイト”; // サイトURL $url = “http://”.$_SERVER["HTTP_HOST"].$reqdir.”/”; if(substr(PHP_VERSION, 0, 1) >= 5){ /******************/ /* PHP5以降の場合 */ /******************/ // RSSファイルが存在するか確認 if(file_exists($rss_file)){ // 存在する場合は読み込む $dom = new DOMDocument(“1.0″, “utf-8″); $dom->load($rss_file); // <channel>ノード $channelNodeList = $dom->getElementsByTagName(“channel”); $channelNode = $channelNodeList->item(0); }else{ // 存在しない場合は新たに作成する $dom = new DOMDocument(“1.0″, “utf-8″); // <rss>ルートノード $rssNode = $dom->createElement(“rss”); $rssNode->setAttribute(“version”,”2.0″); $dom->appendChild($rssNode); // <channel>を作成し、<rss>に追加 $channelNode = $dom->createElement(“channel”); $rssNode->appendChild($channelNode); // <title>を作成し、<channel>に追加 $titleNode = $dom->createElement( “title”, mb_convert_encoding($site_name,”UTF-8″, “auto”)); $channelNode->appendChild( $titleNode ); // <link>を作成し、<channel>に追加 $linkNode = $dom->createElement(“link”,$url); $channelNode->appendChild( $linkNode ); // <description>を作成し、<channel>に追加 $descriptionNode = $dom->createElement( “description”, $site_description); $channelNode->appendChild( $descriptionNode ); // <lastBuildDate>を作成し、<channel>に追加 // <lastBuildDate>には、現在日時を格納する $lastBuildDateNode = $dom->createElement( “lastBuildDate”, date(“D, d M Y H:i:s +0900″)); $channelNode->appendChild( $lastBuildDateNode ); // <language>を作成し、<channel>に追加 $languageNode = $dom->createElement(“language”,”ja”); $channelNode->appendChild( $languageNode ); } // <item>を作成し、<channel>に追加 $itemNode = $dom->createElement(“item”); $channelNode->appendChild($itemNode); // <title>を作成し、<item>に追加 $titleItemNode = $dom->createElement( “title”, $site_name.” – “.$item_title); $itemNode->appendChild($titleItemNode); // <description>を作成し、<item>に追加 $descriptionItemNode = $dom->createElement( “description”, $item_description); $itemNode->appendChild($descriptionItemNode); // <link>を作成し、<item>に追加 $linkItemNode = $dom->createElement( ”link”, $url.”tmp/”.urlencode(urlencode($item_title)).”.htm”); $itemNode->appendChild($linkItemNode); // <pubDate>を作成、<item>に追加 $pubDateItemNode = $dom->createElement( “pubDate”, date(“D, d M Y H:i:s +0900″)); $itemNode->appendChild($pubDateItemNode); // <item>タグが10個以上あるなら古い<item>を削除する $max = 10; $itemNodeList = $dom->getElementsByTagName(“item”); if($itemNodeList->length > $max){ $loops = $itemNodeList->length; for($i=$max ;$i<=$loops; $i++){ $delNode = $itemNodeList->item(0); $delNode->parentNode->removeChild($delNode); } } // 保存 $dom->save( $rss_file ); }else{ /******************/ /* PHP4以降の場合 */ /******************/ // RSSファイルが存在するか確認 if(file_exists($rss_file)){ // 存在する場合は読み込む $dom = domxml_open_file($rss_file); // <channel>ノード $channelNodeList = $dom->get_elements_by_tagname(“channel”); $channelNode = $channelNodeList[0]; }else{ // 存在しない場合は新たに作成する $dom = domxml_new_doc(“1.0″); // <rss>ルートノード $rssNode = $dom->create_element(“rss”); $rssNode->set_attribute(“version”,”2.0″); $dom->append_child($rssNode); // <channel>を作成し、<rss>に追加 $channelNode = $dom->create_element(“channel”); $rssNode->append_child($channelNode); // <title>を作成し、<channel>に追加 $titleNode = $dom->create_element(“title”); $titleNode->set_content(mb_convert_encoding($site_name,”UTF-8″)); $channelNode->append_child( $titleNode ); // <link>を作成し、<channel>に追加 $linkNode = $dom->create_element(“link”); $linkNode->set_content($url); $channelNode->append_child( $linkNode ); // <description>を作成し、<channel>に追加 $descriptionNode = $dom->create_element(“description”); $descriptionNode->set_content($site_description); $channelNode->append_child( $descriptionNode ); // <lastBuildDate>を作成し、<channel>に追加 // <lastBuildDate>には、現在日時を格納する $lastBuildDateNode = $dom->create_element(“lastBuildDate”); $lastBuildDateNode->set_content(date(“D, d M Y H:i:s +0900″)); $channelNode->append_child( $lastBuildDateNode ); // <language>を作成し、<channel>に追加 $languageNode = $dom->create_element(“language”); $languageNode->set_content(“ja”); $channelNode->append_child( $languageNode ); } // <item>を作成し、<channel>に追加 $itemNode = $dom->create_element(“item”); $channelNode->append_child($itemNode); // <title>を作成し、<item>に追加 $titleItemNode = $dom->create_element(“title”); $titleItemNode->set_content( mb_convert_encoding($site_name.” – “.$item_title,”UTF-8″)); $itemNode->append_child($titleItemNode); // <description>を作成し、<item>に追加 $descriptionItemNode = $dom->create_element(“description”); $descriptionItemNode->set_content( mb_convert_encoding($item_description,”UTF-8″)); $itemNode->append_child($descriptionItemNode); // <link>を作成し、<item>に追加 $linkItemNode = $dom->create_element(“link”); $linkItemNode->set_content( $url.”tmp/”.urlencode(urlencode($item_title)).”.htm”); $itemNode->append_child($linkItemNode); // <pubDate>を作成、<item>に追加 $pubDateItemNode = $dom->create_element(“pubDate”); $pubDateItemNode->set_content(date(“D, d M Y H:i:s +0900″)); $itemNode->append_child($pubDateItemNode); // <item>タグが10個以上あるなら古い<item>を削除する $max = 10; $itemNodeList = $dom->get_elements_by_tagname(“item”); if(count($itemNodeList) > $max){ $loops = count($itemNodeList); for($i=$max ;$i<=$loops; $i++){ $delNode = $itemNodeList[$i-$max]; $parentNode = $delNode->parent_node(); $parentNode->remove_child($delNode); } } // 保存 $dom->dump_file( $rss_file ); } } ?>
で、↑これを実行すると、↓こんな感じのRSS(index.xml)が作成される。
<?xml version=”1.0″ ?> <rss version=”2.0″> <channel> <title>RSSテスト用サイト</title> <link>http://localhost/</link> <description>RSS2.0保存テスト用のサイト</description> <lastBuildDate>Sat, 03 Nov 2007 00:27:18 +0900</lastBuildDate> <language>ja</language> <item> <title>RSSテスト用サイト – タイトル</title> <description>説明</description> <link>http://localhost/tmp/%25E3%2582%25BF%25E3%2582%25A4%25E3%2583%2588%25E3%2583%25AB.htm</link> <pubDate>Sat, 03 Nov 2007 00:27:18 +0900</pubDate> </item> <item> <title>RSSテスト用サイト – タイトル</title> <description>説明</description> <link>http://localhost/tmp/%25E3%2582%25BF%25E3%2582%25A4%25E3%2583%2588%25E3%2583%25AB.htm</link> <pubDate>Sat, 03 Nov 2007 00:54:37 +0900</pubDate> </item> </channel> </rss>
でも、↑コレ追加された項目(<item>タグ)は、古い順に並ぶ(普通は新しい順に並ぶ)。
XSLTはソート機能はあるが、DOMはソート機能が無いので作ってません。
ちなみに、このRSS生成プログラムはくしけん用に作ったモノです。