PHPでRSSフィード作成・出力

何や色々しらべて、いろんなライブラリがあるのは分かった。

んで、さあ実装してみたら、コレができないアレができないプロパティ調整が面倒臭いといい加減いやになったので、

結局自分で作ってみたら全然シンプルにできてしまったw

要はxmlを出力すりゃいいだけの話だし、何よりRSSの仕様なんてよく読んでみりゃ大して難しい事もない。

とりえあずはRSS1.0って事で実際にやってみたら、

変に外部ライブラリで頑張るよりも、ひたすら文字列結合繰り返した用が意外にシンプルに出来上がった。

mb_language(‘Japanese’);
mb_internal_encoding(‘UTF-8’); // phpファイル自体の文字コードも、もちろんUTF-8にしておく
$datas = 【DBからRSSに出力する情報を検索】
$site_url = 【サイトのURL】
$site_image = 【サイトの画像・バナーなどのURL】
$items = array();
foreach ($datas as $data) {
$item = array();
$item[“title”] = htmlspecialchars(mb_substr($data[“title”], 0, 20)); // タイトル。なんか40バイト以下の方が好ましいらしい
$item[“link”] = $site_url.”/xxx_”.$data[“id”].”.html”; // コンテンツのリンク先。httpからはじまる完全なURLで。
$item[“date”] = str_replace(” “, “T”, $data[“create_time”]).”+09:00″; // コンテンツの作成年月日。「年-月-日T時:分:秒+09:00」形式にする
$item[“subject”] = “お知らせ”; // カテゴリみたいなもん
$item[“creator”] = “お知らせ”; // 作成者だけど、RSSリーダで目立る所に表示されやすいので、カテゴリ名を入れておく
$item[“description”] = htmlspecialchars(mb_substr($data[“content”], 0, 250)); // 本文。なんか500バイト以下の方が好ましいらしい
$item[“content”] = htmlspecialchars($data[“content”]); // 本文。descriptionだけでもいいんだろうけど、contentモジュールも使った方がなんかカッコイイ気がするので
$items[] = $item;
}
$links = “”;
foreach ($items as $item) {
$links .= ”  <rdf:li rdf:resource=\”${item[“link”]}\” />\n”;
}
$value = <<<EOT
<?xml version=”1.0″ encoding=”UTF-8″?>
<rdf:RDF
xmlns:rdf=”http://www.w3.org/1999/02/22-rdf-syntax-ns#”
xmlns=”http://purl.org/rss/1.0/”
xmlns:content=”http://purl.org/rss/1.0/modules/content/”
xmlns:taxo=”http://purl.org/rss/1.0/modules/taxonomy/”
xmlns:dc=”http://purl.org/dc/elements/1.1/”
xmlns:syn=”http://purl.org/rss/1.0/modules/syndication/”
xmlns:image=”http://purl.org/rss/1.0/modules/image/”
>
<channel rdf:about=”${site_url}/”>
<title>【サイトタイトル】</title>
<link>${site_url}/</link>
<description>【サイトのdescription】</description>
<dc:language>ja</dc:language>
<image rdf:resource=”${site_image}”/>
<items>
<rdf:Seq>
${links} </rdf:Seq>
</items>
</channel>
<image rdf:about=”${site_image}”>
<title>【サイトタイトル】</title>
<link>${site_url}/</link>
<url>${site_image}</url>
</image>
EOT;
foreach ($items as $item) {
$value .= <<<EOT
<item rdf:about=”${item[“link”]}”>
<title>${item[“title”]}</title>
<link>${item[“link”]}</link>
<description>${item[“description”]}</description>
<dc:creator>${item[“creator”]}</dc:creator>
<dc:date>${item[“date”]}</dc:date>
<dc:subject>${item[“subject”]}</dc:subject>
<content:encoded>${item[“content”]}</content:encoded>
</item>
EOT;
}
$value .= “</rdf:RDF>”;
// ファイルに出力
$fp = fopen(“./rss1_0.xml”, “w”);
fwrite($fp, $value);
fclose($fp);

Comments are closed.