意外と簡単にphpでRSS2.0とAtomのフィードを生成できた

自前で構築中のサイトの記事作成時にRSS2.0とAtomのフィードを生成する機能を追加してみました。

使ったのはPHP Universal Feed Generatorというライブラリ

github.com

記事データ
実際はデータベース等から取得して連想配列に格納します

<?php

$item1 = array();
$item2 = array();

$item1["title"] = "タイトル2";
$item1["link"] = "http://otaku.kansai-fan.com/content/20170502";
$item1["date"] = strtotime(date('Y-m-d G:i:s', time()));
$item1["author"] = "投稿者2";
$item1["description"] = "投稿内容2";

$item2["title"] = "タイトル1";
$item2["link"] = "http://otaku.kansai-fan.com/content/20170501";
$item2["date"] = strtotime(date('Y-m-d G:i:s', time()));
$item2["author"] = "投稿者1";
$item2["description"] = "投稿内容1";

$list = array();
$list["20170502100000"] = $item1;
$list["20170502090000"] = $item2;

?>

RSS2.0

<?php

// ライブラリの読み込み
use \FeedWriter\RSS2;

// チャンネル情報の登録
$feed = new RSS2;
$feed->setTitle("とあるオタクの備忘録");
$feed->setLink("http://otaku.kansai-fan.com/");
$feed->setDate(new DateTime());
$feed->setDescription("プレイ中のゲームのプレイ日記等");
$feed->setImage("http://otaku.kansai-fan.com/" , "とあるオタクの備忘録", "http://otaku.kansai-fan.com/image/logo.png" );
$feed->setChannelElement( "language" , "ja-JP" );
$feed->setChannelElement( "pubDate" , date(\DATE_RSS , time()));
$feed->setChannelElement( "category" , "Blog" );

// 記事の分だけ、フィードのアイテムを追加する
foreach ($list as $key => $value){
    $data = $value;
    $item = $feed->createNewItem();
    $item->setTitle($data["title"]);
    $item->setLink($data["link"]);
    $item->setDate($data["date"]);
    $item->setAuthor($data["author"]);
    $item->setDescription($data["description"]);
    $item->setId($data["link"], true) ;
    $feed->addItem($item);
}

// xml形式の文字列を出力
$xml = $feed->generateFeed();

// ファイルの保存場所を設定
$file = "/home/aaa/bbb/rss2.xml";

// ファイルの保存を実行
@file_put_contents($file, $xml);

?>

Atom

<?php

// ライブラリの読み込み
use \FeedWriter\ATOM;

// チャンネル情報を登録
$feed = new ATOM;
$feed->setTitle("とあるオタクの備忘録");
$feed->setLink("http://otaku.kansai-fan.com/");
$feed->setDate(new DateTime());

// 記事の分だけ、フィードのアイテムを追加する
foreach ($list as $key => $value){
    $data = $value;
    $item = $feed->createNewItem();
    $item->setTitle($data["title"]);
    $item->setLink($data["link"]);
    $item->setDate($data["date"]);
    $item->setAuthor($data["author"]);
    $item->setDescription($data["description"]);
    $feed->addItem($item);
}

// xml形式の文字列を出力
$xml = $feed->generateFeed();

// ファイルの保存場所を設定
$file = "/home/aaa/bbb/atom.xml";

// ファイルの保存を実行
@file_put_contents($file, $xml) ;

?>

RSS2.0とAtomで設定する項目が少し異なるくらいで処理はほぼ変わりません。
RSS1.0は今回作成してませんが、ほぼ同じ流れで簡単に作成できそうです。

気を付けないといけないのは日付関連の項目
値が不正だとgenerateFeedメソッドでエラーが発生します

実際に出力したものがこちら

RSS2.0

ATOM