スポンサーリンク

【PHP】複数のRSSを結合して最新日付順にリストで表示する

ブログを複数のCMSに分けたので、RSSが複数になりました。それぞれのRSSを結合する方法は以下の通り。これで複数のRSSの中身を日付順に入れ替えて、記事リストを表示することができます。

PHPソース

<?php
 // 2つのRSSフィードのURL
 $url1 = 'http://example.com/rss1.xml';
 $url2 = 'http://example.com/rss2.xml';

 // 2つのRSSフィードを取得してSimpleXMLElementオブジェクトに変換
 $xml1 = simplexml_load_file($url1);
 $xml2 = simplexml_load_file($url2);

 // 2つのRSSフィードを結合して、日付で降順にソート
 $items = array_merge($xml1->channel->item, $xml2->channel->item);
 usort($items, function($a, $b) {
   return strtotime($b->pubDate) - strtotime($a->pubDate);
 });

 // リスト形式で記事のタイトルとURLを表示
 echo '<ul>';
 foreach ($items as $item) {
   $title = $item->title;
   $url = $item->link;
   $date = date('Y年m月d日', strtotime($item->pubDate));
   echo '<li>' . $date . ' <a href="' . $url . '">' . $title . '</a></li>';
 }
 echo '</ul>';
 ?>

説明

上記のコードでは、simplexml_load_file関数を使用してRSSフィードをSimpleXMLElementオブジェクトに変換し、array_merge関数を使用して2つのRSSフィードを結合しています。その後、usort関数を使用して記事を日付で降順にソートします。

最後に、foreachループを使用して、記事のタイトル、URL、および日付をリスト形式で表示しています。ここで、date関数を使用して日付を表示しています。

これで2つのブログの最新記事が日付順に表示されるはずです。

表示されない場合

item要素がchannelの直下に無いなど、ウェブサイトによってRSSフィードの構造が異なる場合があります。その場合、以下2つのコードのどちらかを追加すると解決できるはずです。

xpathでitemを取得する場合

item要素がchannelの直下にない場合は、以下のようにxpath関数を使用して、item要素を取得することができます。

$items1 = $xml1->xpath('//item');
$items2 = $xml2->xpath('//item');
$items = array_merge($items1, $items2);

当ブログはこちらを追加して解決できました。

Qwerty.Work
コマンドやスクリプト、エラーやトラブル解決、ベンチマーク,高速化など、主にパソコンのこといろいろ書いています。

children()で取得する場合

item要素がchannelの直下にある場合は、item要素が含まれている配列を取得するために、$xml1->channel->itemという形式ではなく、$xml1->channel->children()という形式を使用することもできます。

$items1 = $xml1->channel->children();
$items2 = $xml2->channel->children();
$items = array_merge($items1->item, $items2->item);
タイトルとURLをコピーしました