simplepie.phpで複数サイトのRSS一覧をアイコンを付けて表示させる覚え書き

イベントのサイトや幾つかのブランドがあるサイトで一つの場所に全部のRSS情報を最新5件、一覧で表示させるというミッションがあり、四苦八苦。
いくつかのrssプラグインを使ってみたものの、個別にアイコンを付ける機能がついているようなプラグインなど無く、wpにもとからあるclass-simplepie.phpを使って表示させることに。

最終的なコードはこちら。

FEED A URL,FEED B URL、、と複数のフィードするURLを指定する。
ここでハマったのが、キャッシュするフォルダを指定していなかったので、エラーが表示されてしまった。
ディレクトリのトップにcacheフォルダを作り、パーミッションを700に指定すればOK。

一覧では、複数のサイトの最新5件を一覧させたかったので、そのように。

<?php include_once(ABSPATH . WPINC . '/class-simplepie.php');
	$feed = new SimplePie();
	$feed->set_feed_url(array(
	'FEED A URL', // サイトAのフィードURL
	'FEED B URL', // サイトBのフィードURL
	'FEED C URL', // サイトCのフィードURL
	));
	 $feed->set_cache_location('./cache');
	 $feed->set_cache_duration(600);
	 $feed->set_item_limit(5);
	 $feed->init();
	 $items = $feed->get_items(0, 5); // 最新5件表示
	 foreach($items as $item)
: ?>

で、後はそのデータを表示させるだけなのだけど、ここでもトラップがいくつか。

1)それぞれのサイト専用のアイコンを表示させるため、preg_matchでアイコンを指定

if(preg_match("/FEED-A/",$item->get_permalink()

とすると、パーマリンク(URL)の中の任意の文字列「FEED-A」が入っている場合は「ic_a.png」をタイトルの横に表示させることになる。
ただ、同じドメインにいくつかのサイトやサービスがある場合、ドメインの文字列を使うと全部同じアイコンになってしまったり、ページタイトルにその文字列が入ってるとややこしくなってしまうため、

if(preg_match("/FEED-B/",$item->get_feed()->get_title()

として、サイトのタイトルを指定して、そこにある文字列で分けることで同じドメインでもOKに!(下のコードでは一応両方設定。)

2)get_descriptionでコンテンツの中身を一部表示させた際、最後の文字が文字化けしてしまった。

通常は echo mb_substr で中身を表示させるのが一般的みたいだけど、日本語は2バイト言語なので、echo mb_strimwidth
の関数を使い、その前で言語とエンコードも指定。

本来は

$len = 10;
echo mb_strimwidth(strip_tags($item->get_description()), 0, $len, "...", "UTF-8"); ?>

とかのほうがいいのかも?

ま、動いたので今回はこれで、、

<dl>	
	<dt><?php echo $item->get_date("Y.n.j"); ?></dt>
	<dd><a href='<?php echo $item->get_permalink(); ?>' title=''>
	<?php echo $item->get_title(); ?></a>&nbsp;&nbsp;&nbsp;
	<?php if(preg_match("/FEED-A/",$item->get_permalink())){echo '<img src="img/ic_a.png" alt="">';}
	else if(preg_match("/FEED-B/",$item->get_feed()->get_title())){echo '<img src="img/ic_b.png" alt="">';}
	else if(preg_match("/FEED-C/",$item->get_permalink())){echo '<img src="img/ic_c" alt="">';} ?><br>
	<p class="siteinfo">by <?php echo $item->get_feed()->get_title(); ?></p>
	<span class="desc">
	<?php mb_language('Japanese');
	mb_internal_encoding('UTF-8'); 
	echo mb_strimwidth(strip_tags($item->get_description()), 0, 360, "..."); ?>
	<a href='<?php echo $item->get_permalink(); ?>' target="_blank">続きを読む</a>
	</span>
	</dd>	
</dl>

基本のコードはこちらのサイトを参考にさせていただきました。ありがとうございます。

» Website Creating RSSフィードで複数サイトの新着一覧アイコン付

Leave a Reply

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です