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フィードで複数サイトの新着一覧アイコン付

Google Feed API が廃止になったので件数を指定したリスト表示を代替え案での覚え書き

今までも何度か表示されないことがあったけど、微妙に動いていたGoogle Feed APIがとうとうエラーで表示されなくなり、、
幾つかのクライアントのFeed表示をどうしようかと調べていた中で使えそうなライブラリがあったのでそっちで対応。

PHPが動けばこれでいけそうです。

» ダウンロードするライブラリはこれ。feed.php

で、一つphpを用意(get-feed.phpという名前とかにして。)し、中身は下記をペースト。
取得するfeedのURL、件数を指定。
feed.phpの場所は同階層じゃない場合は階層も指定。

<?php
 
	// ライブラリの読み込み
	require_once "feed.php" ;
 
	// 取得するフィードのURLを指定(アメブロだとこんな感じ)
	$url = "http://feedblog.ameba.jp/rss/ameblo/アメブロID/rss20.xml" ;
 
	// インスタンスの作成
	$feed = new Feed ;
 
	// RSSを読み込む
	$rss = $feed->loadRss( $url ) ;
 
	// HTML表示用
	$html = '' ;
 
	$MAX_feed = 10;// 表示させる件数
	$feed_count = 0; $feed = new Feed ; $rss = $feed->loadRss( $url ) ;
 
 
	foreach( $rss->item as $item ){
		if ($feed_count >= $MAX_feed) { break; }
		// 各エントリーの処理
		$feed_count++;
 
		$title = $item->title ;	// タイトル
		$link = $item->link ;	// リンク
		$description = $item->description ;	// 詳細
 
 
		// 日付の取得(UNIX TIMESTAMP)
		foreach( array( "pubDate" , "date_timestamp" , "dc:date" , "published" , "issued" ) as $time )
		{
			if( isset( $item->{ $time } ) && !empty( $item->{ $time } ) )
			{
				$timestamp = ( is_int( $item->{ $time } ) ) ? $item->{ $time } : strtotime( $item->{ $time } ) ;
				break ;
			}
		}
 
 
		// 仮に日付が取得できなかったら現在時刻を表示
		if( !isset( $timestamp ) )
		{
			$timestamp = time() ;
		}
 
		// 表示
		$html .= '<dt>'.date( "Y年m月d日" , $timestamp ) .'</dt><dd><a href="' . $link . '">' . $title . '</a></dd>' ;
	}
?>
 
 
<?php echo $html ?>

後は読み込みたいページのhtmlの記述。

まず、ヘッダでjqueryを読み込む。既に別のライブラリで使ってる場合は不要かも。
ただ、バージョンによってコンフリクトするので、読み込み順、バージョンは注意。

ライブラリの読みこみ。

<!-- rss -->
<script type="text/javascript">
;(function($){
$(function(){
  $.get('get-feed.php',function(data){
    $('#feed').html(data);
  })
})
})(jQuery);
</script>

あとは、bodyの中で

<div id="feed"></div>

で読み込ませればOK。
表示スタイルはget-feed.phpの表示部分で変更すればスタイル変更ができます(^^)

表示件数を指定する部分を変更してますが、ここのブログを参考にさせていただきました。

» PHPでRSSやAtomのフィードを取得する方法
» Google Feed API」の代替として「rss-php」でRSSやAtomフィードを取得・表示する

休日ランチ

IMG_3793
休日はできるだけお友達がいる代々木のドッグランに。

充実して遊んだ後は、永田町のAnchor Pointで、オサレなランチを寒さに震えながらいただきました。
もうね、寒いから。テラスはギブです。

Katieは悠々です。ランチ持って出ていなかったから、慌ててコンビニの小型犬用のオヤツでしのぎました。
だいぶ大人しく待っていられるようになったもんね。1匹だけなら。。