ブラ三NAVIに設置した、登録ユーザーのRSSをまとめて時系列に表示するページですが、意外とてこずりました。

流れとしては

  1. 登録ユーザーのプロフィールにフィード(RSS)の登録項目の追加
  2. それらのフィードを抽出してリスト化
  3. 複数フィードを1つにまとめたフィードに変換
  4. そのフィードを後は好きに料理

という手順を考えていました。

そしてググってみたところ1つめの新しい登録項目の作成は

これであっさり追加できました。

ついでにAIMとか消そうとしたけど何故か消えないので放置。

そして狙っていた、まとめて1つのフィードに変換ではないけれど、複数外部RSSをまとめて時系列に記事を並べてくれるコードを発見。

あとは上記コードの

$rss_arr = array(
'http://log.maaguu.com/feed/',
'http://wp.maaguu.com/feed/',
'http://pp.maaguu.com/feed/'
);

の部分に自動でユーザーのRSSが挿入されればOKだろう、ということで

この記事とかを参考にコードを改良して完成!と思いきや表示されるフィードとされないフィードがある。

なにやらRSSのバージョンによって日付の書式が違うのが理由らしい。

ということで日付の書式をバージョンによって分岐させるような感じで完成したコードが以下。

include_once(ABSPATH . WPINC . '/rss.php');

//ユーザー登録情報の中からRSSフィードURLを抽出
$userrss = $wpdb->get_results("select * from $wpdb->usermeta where meta_key = 'rss'");

//DBから取得したRSSフィードURLを配列に格納
$arrayRssUrl=array();

foreach ($userrss as $user_rss) {
$arrayRssUrl[]=$user_rss->meta_value;
}

//手動登録用フィードのURI
$rss_arr = array(
//'http://bri3navi.com/josho/feed',
//'http://bri3navi.com/feed'
);

//抽出したリストと手動分をマージ
$rss_arr=array_merge($rss_arr,$arrayRssUrl);

//表示件数
$num = 50;

foreach($rss_arr as $uri)
{
$rss = fetch_rss($uri);

$title = $rss->channel['title'];
$link  = $rss->channel['link'];

if(is_array($rss->items)){
foreach($rss->items as $item)
{
$item_title = $item['title'];
$item_link  = $item['link'];

//バージョンごとに日付け取得
if($item['dc']['date']){
$date = parse_w3cdtf($item['dc']['date']);
}else if($item[pubdate]){
$date = strtotime($item[pubdate]);
}
if($date){
$s_date = date("Y年n月j日 H時i分 ", $date);
}

$out_item = '
	<li>
<div class="bro3rsstitle"><a href="' . $item_link . '" target="_blank">' . $item_title . '</a></div>
<div class="bro3rssmeta">ブログ:<a href="' . $link . '" target="_blank">' . $title . '</a>

更新日時:' . $s_date . '</div></li>
';

if($item['dc']['date']){
$item_date = $item['dc']['date'];
}else if($item[pubdate]){
$item_date = $item[pubdate];
}

$unix_time = date('U', strtotime($item_date));
$item_arr[$unix_time] = $out_item;
}
}
}

//ソート
krsort($item_arr);

//出力
//echo '
<h2>新着ブラ三記事' . $num . '件</h2>
';
//echo '

ブラ三NAVIの登録ユーザーのブログRSSから新着20件を表示しています。

';
echo '
<ul id="bro3rss">';

for(reset($item_arr); $key = key($item_arr); next($item_arr))
{
echo $item_arr[$key];

++$count;

if($count === $num)
{
break;
}
}

echo '</ul>
';
?&gt;

たぶんもっとスマートに書けるんだろうけど私のスキルではこれが限界でした。

ユーザーが登録したものが自動で入りつつ、手動でのフィードURLの追加にも対応しており、なかなかナイスな機能になりました。