この記事は公開から10年、最終更新日からも8年経過しています。内容が古くなっている可能性があります。
当サイトはAmazonアソシエイトとして、適格販売により収入を得ています。
simplexml_load_file関数を使用して外部サイトのRSSを読み込み画像付きで表示
概要
外部サイトのRSSを読み込んで画像付きで表示します。
今回は、phpのimplexml_load_file関数を使用しました。
※以前、こちらの記事でGoogle Feed APIを使って同様なことを実現しております。
[Google Feed API]サイトのRSSフィードを取得し画像付きで記事の内容を表示する
前提条件
・画像は、コンテンツ内にある最初のimgタグで記載された箇所の画像を読み込みます。
phpソース
<?php
$rss = simplexml_load_file('https://www.nakamurayuji.com/feed', 'SimpleXMLElement', LIBXML_NOCDATA);
$count = 0;
foreach($rss->channel->item as $item){
$count++;
if ($count > 10) {break;} //10記事まで表示
$title = $item->title;
$date = date("Y年 n月 j日", strtotime($item->pubDate));
$link = $item->link;
$description = mb_strimwidth (strip_tags($item->description), 0 , 110, "…Read More", "utf-8");
preg_match('/<img.*>/i',$item->children('content', true)->encoded, $matches);
?>
<div class="rssreadmain">
<div class="imagebox">
<a href="<?php echo $link; ?>" target="_blank">
<?php if ( $matches[0] ): // サムネイルを持っているときの処理 ?>
<img <?php echo $matches[0]; ?> >
<?php else: // サムネイルを持っていないときの処理 ?>
<img src="<?php echo get_template_directory_uri(); ?>/images/no-img.png" alt="no image" title="no image" width="100" height="100" />
<?php endif; ?>
</a>
</div> <!-- imagebox -->
<p class="boxtitle">
<a href="<?php echo $link; ?>" target="_blank">
<?php echo $title; ?></a> <!-- the_title(); -->
</p>
<p class="boxcontent">
<a href="<?php echo $link; ?>" target="_blank">
<?php echo $description; ?></a>
</p>
</div> <!-- rssreadmain -->
<?php } ?>
コード説明
$rss = simplexml_load_file('https://www.nakamurayuji.com/feed', 'SimpleXMLElement', LIBXML_NOCDATA);
・RSSアドレスを指定し、変数;$rssにRSSを読み込みます。
CDATAセクションの取得
これは、simplexml_load_file関数の第三引数にLIBXML_NOCDATAを指定する事でテキストとして取得できる様になります。
とあるように、第三引数にLIBXML_NOCDATAを指定します。
$count = 0;
foreach($rss->channel->item as $item){
$count++;
if ($count > 10) {break;} //10記事まで表示
$title = $item->title;
$date = date("Y年 n月 j日", strtotime($item->pubDate));
$link = $item->link;
$description = mb_strimwidth (strip_tags($item->description), 0 , 110, "…Read More", "utf-8");
preg_match('/<img.*>/i',$item->children('content', true)->encoded, $matches);
}
・RSSを記事ごとに分割し、ループさせます。今回は10記事表示させます。
・各記事の、タイトル、投稿日付、リンクURL、記事の中味、及び、画像URLを取得します。
・記事の中味は110文字のみ抽出し、最後に、”…Read More”を付与します。
・画像URLはタグで記述されたURLを配列matchesに格納します。※画像が複数あれば複数格納されます。※RSSのdescription要素は概要でありimgタグがないため、content:encoded要素で取得します。
・この箇所で読み込み完了です。
<a href="<?php echo $link; ?>" target="_blank">
<?php if ( $matches[0] ): // サムネイルを持っているときの処理 ?>
<img <?php echo $matches[0]; ?> >
<?php else: // サムネイルを持っていないときの処理 ?>
<img src="<?php echo get_template_directory_uri(); ?>/images/no-img.png" alt="no image" title="no image" width="100" height="100" />
<?php endif; ?>
</a>
・画像を記事のリンクURL付きで出力します。
・$matches[0]は画像のうち最初の画像のリンクURLです。
・画像が見つからなかった時は代替画像を表示します。※本ソースはWordPress内で使用しているため、適宜読み替えて下さい。
<a href="<?php echo $link; ?>" target="_blank"> <?php echo $title; ?></a> <!-- the_title(); --> <a href="<?php echo $link; ?>" target="_blank"> <?php echo $description; ?></a>
・タイトル、記事の中味をそれぞれリンク付きで出力します。
適用サイト
sample2に本サイトの最新10記事を読み込んだ例を表示しています。
■表示例です。

参考サイト(本当に有難うございます!)
・PHP: simplexml_load_file – Manual
・PHP: preg_match – Manual
最後に
・RSSの読み込みが自由に使えるようになったらアンテナサイトやポータルサイト等、色々応用できそうです。
/////

