[PHP] XML形式のRSS(RSS2.0)をスクリプトから出力する方法

2018年7月30日(更新: 2018年7月30日)

PHPからXML形式のRSSフィードを出力する方法についてです。サイトでRSSの出力を設定しておくと、RSSリーダー(feedlyなど)の利用者に素早くブログ記事の更新情報などを届けることができます。

必要最低限のRSSを出力するサンプル

以下は、更新情報(新着記事など)の概要のみをRSSとして出力するシンプルなPHPスクリプトです。

<?php

	header("Content-Type: application/rss+xml; charset=utf-8");

	$articles = [
		['title' => '記事1', 'description' => '記事1の説明です。', 'link' => 'https://記事1のURL/', 'date' => '2018/7/27 18:35:20'],
		['title' => '記事2', 'description' => '記事2の説明です。', 'link' => 'https://記事2のURL/', 'date' => '2018/7/28 17:24:43'],
		['title' => '記事3', 'description' => '記事3の説明です。', 'link' => 'https://記事3のURL/', 'date' => '2018/7/30 20:12:25']
	];


	$rssfeed = <<<EOD
<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0">
	<channel>
		<title>RSSのタイトル</title>
		<link>https://joyplot.com/</link>
		<description>ここにRSSの説明を書きます</description>
		<language>ja</language>
		<copyright>Copyright (C) 2018 JoyPlot</copyright>

EOD;

	foreach ($articles as $article) {

		$title = $article['title'];
		$description = $article['description'];
		$link = $article['link'];
		$dateForRSS = date(DATE_RSS, strtotime($article['date']));

		$rssfeed .= <<<EOD
		<item>
			<title>$title</title>
			<description>$description</description>
			<link>$link</link>
			<pubDate>$dateForRSS</pubDate>
		</item>

EOD;
	}

	$rssfeed .= <<<EOD
	</channel>
</rss>
EOD;

	echo $rssfeed;
?>

このスクリプトによって実際に出力されるRSS(XML)は以下のようになります。

<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0">
	<channel>
		<title>RSSのタイトル</title>
		<link>https://joyplot.com/</link>
		<description>ここにRSSの説明を書きます</description>
		<language>ja</language>
		<copyright>Copyright (C) 2018 JoyPlot</copyright>
		<item>
			<title>記事1</title>
			<description>記事1の説明です。</description>
			<link>https://記事1のURL/</link>
			<pubDate>Fri, 27 Jul 2018 18:35:20 +0900</pubDate>
		</item>
		<item>
			<title>記事2</title>
			<description>記事2の説明です。</description>
			<link>https://記事2のURL/</link>
			<pubDate>Sat, 28 Jul 2018 17:24:43 +0900</pubDate>
		</item>
		<item>
			<title>記事3</title>
			<description>記事3の説明です。</description>
			<link>https://記事3のURL/</link>
			<pubDate>Mon, 30 Jul 2018 20:12:25 +0900</pubDate>
		</item>
	</channel>
</rss>

PHPスクリプトの解説

出力をRSSとして扱うための設定

まず、このスクリプトの出力をRSS(XML)として扱われるようにするために、以下のHTTPヘッダーを送信します。

header("Content-Type: application/rss+xml; charset=utf-8");

文字コード(charset)は環境に応じた適切なものに変えて下さい。基本的には UTF-8 で問題ないと思います。

出力する各要素

変数 $articles には、RSSの各アイテム(itemタグの中身)となる情報を設定しています。

この例では定値のデータを利用していますが、実際はデータベースから読み込んだデータなどをその数だけ foreach 等のループで追加することになります。

実際に出力されるテキストは変数 $rssfeed に格納しています。以下のようなRSSの基本構文が構成されるようにヒアドキュメント(<<<EOD 〜 EOD;)を使ってテキストを追加しています。

<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0">
	<channel>
		
		<item></item>

		...

		<item></item>
		
	</channel>
</rss>

各記事の公開日時について

item の中には公開日時を設定するタグ(pubDate)がありますが、以下のような形式で記述する必要があります。

Fri, 27 Jul 2018 18:35:20 +0900

この形式は関数 date の第一引数に DATE_RSS を指定すると、他の日時形式から変換することができます。

date(DATE_RSS, strtotime($article['date']));

以上が、基本的なRSSをPHPで出力する際に最低限必要な記述となります。

画像を追加したRSS

記事のサムネイルを item に追加するには、タグ content:encoded を使用します。

まずタグ rss に xmlns:content=”http://purl.org/rss/1.0/modules/content/ を追記します。

<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">

そして、各 item にCDATAセクションを利用して画像タグを埋め込みます。

<item>

    ...

    <content:encoded><![CDATA[<img src="https://joyplot.com/JoyPlot_document.png" />]]></content:encoded>
</item>

これで、指定した画像がRSSリーダーで表示されます。

RSSで配信された記事にサムネイルを設定した例

このタグは description による簡潔な説明ではなく、本文をそのまま表示したい時にも使えます。

(description に画像タグを埋め込んだり、item が持つオプションタグ enclosure を使用する方法もありますが、RSSリーダーの種類によっては正常に表示されないようです)

コメントを残す

メールアドレスが公開されることはありません。