WordPressで複数外部RSSフィードを取得し、統合して更新日時順に表示する
サイト構成
root/ ├ aaa ├ bbb ├ ccc ├ ddd └ eee
AAA〜EEEの投稿を、サイト関係なく新着順でrootサイトに出したい。という要望に対応しましたので備忘録として。
※AAA〜EEEのサイトは全てWordPressです。
要は、別サイトの複数のRSSを取得してきて、一つに統合の後、更新日時順で指定箇所に出したい ということです。
rootのfunction.php
/** 複数RSS取得と出力 **/ function fetch_rss_items(array $urls) { /* 0. 配列の初期化 */ $items = array(); if(!$urls) { return $items; } /* 1. cURLリソースの準備 */ $mh = curl_multi_init(); foreach($urls as $url) { $ch = curl_init(); curl_setopt_array($ch, array( CURLOPT_URL => filter_var($url), CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 5, CURLOPT_CONNECTTIMEOUT => 5, CURLOPT_ENCODING => 'gzip', )); curl_multi_add_handle($mh, $ch); } /* 2. リクエストの開始 */ while(curl_multi_exec($mh, $running) === CURLM_CALL_MULTI_PERFORM); /* 3. レスポンスの待機 */ do switch (curl_multi_select($mh, 5)) { case -1: /* 失敗 */ usleep(10); while(curl_multi_exec($mh, $running) === CURLM_CALL_MULTI_PERFORM); case 0: /* タイムアウト */ continue 2; default: /* どれかが読み取り可能な状態になった */ while(curl_multi_exec($mh, $running) === CURLM_CALL_MULTI_PERFORM); do if($info = curl_multi_info_read($mh, $remains)) { $xml = curl_multi_getcontent($info['handle']); curl_multi_remove_handle($mh, $info['handle']); if(!$xml = @simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)) { continue; } foreach($xml->channel->item as $item) { /* NEWアイコン */ $today = date_i18n('U'); $entry = strtotime((string)$item->pubDate); $kiji = date('U',($today - $entry)) / 86400 ; if(6 > $kiji) { $new = '<span class="new">new</span>'; } else { $new = ''; } /* 一番最初の画像取得 */ if(preg_match_all('/<img(.+?)>/is', (string)$item->description, $matches)){ foreach($matches[0] as $img){ if(preg_match('/src=[\'"](.+?(jpe?g|png))[\'"]/', $img, $m)){ $item->thumbnail = $m[1]; } } } /* サイト名取得 */ if(preg_match("/aaa/",(string)$item->link)){ $site = 'AAA'; } elseif(preg_match("/bbb/",(string)$item->link)){ $site = 'BBB'; } elseif(preg_match("/ccc/",(string)$item->link)){ $site = 'CCC'; } elseif(preg_match("/ddd/",(string)$item->link)){ $site = 'DDD'; } elseif(preg_match("/eee/",(string)$item->link)){ $site = 'EEE'; } else {$site = 'ブログ';} /* 配列にセット */ $items[] = array( 'site' => $site, 'date' => date("Y.m.d", strtotime($item->pubDate)), 'title' => (string)$item->title, 'link' => (string)$item->link, 'thumbnail' => (string)$item->thumbnail, 'timestamp' => strtotime((string)$item->pubDate), 'new' => $new ); } } while($remains); } while($running); /* 4. タイムスタンプが新しい順にソート */ usort($items, function ($a, $b) { return $b['timestamp'] - $a['timestamp']; }); /* 5. 配列をHTMLに整えて返す */ print '<ul>'; print '<li><a href="'.$items[0]['link'].'"><div class="photoarea"><img src="'.$items[0]['thumbnail'].'" alt="" /></div><div class="textarea"><span class="data">'.$items[0]['date'].'</span><span class="cat">'.$items[0]['site'].'</span><br>'.$items[0]['title'].$items[0]['new'].'</div></a></li>'; print '<li><a href="'.$items[1]['link'].'"><div class="photoarea"><img src="'.$items[1]['thumbnail'].'" alt="" /></div><div class="textarea"><span class="data">'.$items[1]['date'].'</span><span class="cat">'.$items[1]['site'].'</span><br>'.$items[1]['title'].$items[1]['new'].'</div></a></li>'; print '<li><a href="'.$items[2]['link'].'"><div class="photoarea"><img src="'.$items[2]['thumbnail'].'" alt="" /></div><div class="textarea"><span class="data">'.$items[2]['date'].'</span><span class="cat">'.$items[2]['site'].'</span><br>'.$items[2]['title'].$items[2]['new'].'</div></a></li>'; print '</ul>'; }
rootのindex.phpなど出力したい場所に
print_r(fetch_rss_items(array( 'https://www.sendai-kuraso.com/aaa/feed', 'https://www.sendai-kuraso.com/bbb/feed', 'https://www.sendai-kuraso.com/ccc/feed', 'https://www.sendai-kuraso.com/ddd/feed', 'https://www.sendai-kuraso.com/eee/feed' )));
MovableType/WordPressを使ったホームページ制作、機能追加や設置代行などの改修、システム開発、サイトの保守を手掛けております。
アナタが実現させたい機能、やりたい事をお聞かせいただけませんか? そのイメージを一緒に実現しましょう!
お問い合わせは以下のページから!!