この記事は公開から9年、最終更新日からも6年経過しています。内容が古くなっている可能性があります。
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の読み込みが自由に使えるようになったらアンテナサイトやポータルサイト等、色々応用できそうです。
/////