Warning: Undefined array key 1 in /home/slashd/slashd.com/public_html/blog/wp-content/themes/arkhe_child/functions.php on line 149
2015年12月にブログのRSSを処理するため使っていた「Google Feed API」が使用停止になりました。
このAPIはクロスドメインの問題を簡単に解決してくれ、なおかつスピードも速い使い勝手の良いものだったのです。
APIのいきなりの停止によって代替プログラムの導入が急務になり、採用したのが「rss-php」ライブラリです。
PHPでsimplexml_load_fileを使うだけでもクロスドメインの問題は解決するのですが、キャッシュの機能は独自に組み込む必要があるので、「rss-php」は利用価値があります。
私は使い勝手の良さも考慮して、RSSをjsonで読み込んで処理を行いました。
なお、「rss-php」については以下のブログを参考にさせて頂きました。
参照 「Google Feed API」の代替として「rss-php」でRSSやAtomフィードを取得・表示する(http://www.lesson5.info/)
WordPressのRSSをjsonデータで処理する
ホームページにニュースフィードを表示させるためにWordPressで作られたニュースブログのRSSを読み込みます。
ニュースのみWordPressというサイトでは有効な手段となります。
RSSをjsonデータで出力するphp(getjson.php)は以下。
<?php // ライブラリの読み込み require_once ('src/Feed.php'); // キャッシュの設定 Feed::$cacheDir = 'temp'; Feed::$cacheExpire = '1 hours'; // rss複数の場合:各feedの取得データ数、1つの場合:表示数 $out_lim = 6; // HTML表示用 //$html = '' ; // 取得するフィードのURLを指定(複数のRSSを指定可能) $urls = array( "http://www.slashd.co.jp/news/feed/", //"http://www.slashd.co.jp/news/feed/", //"http://www.lesson5.info/?feed=rss2", //"http://www.lesson5.info/?feed=rss2", //"http://www.lesson5.info/?feed=rss2", //"http://www.lesson5.info/?feed=rss2" ); // 各rssをまとめた配列 $entrylist = array(); // jSonの配列番号 $cnt = 0; // RSSごとに表示エントリ数ずつ抽出 for ($i = 0; $i < count($urls); $i++) { $url = $urls[$i]; // インスタンスの作成 $feed = new Feed ; // RSSを読み込む $rss = Feed::loadRss($url); // 各RSSから取得するデータ数 // RSSのitem数が表示数より少ない場合はブレーク $num_rss = $out_lim; if ( count($rss->item) < $out_lim ) { $num_rss = count($rss->item); } for ($entry = 0; $entry < $out_lim; $entry++) { if ($entry >= $num_rss) { break; } $item = $rss->item[$entry]; // 各エントリーの処理 $title = $item->title ; $link = $item->link ; $timestamp = strtotime( $item->pubDate ) ; // 配列に $entrylist[$cnt]['title'] = htmlSpecialChars($title); $entrylist[$cnt]['link'] = htmlSpecialChars($link); $entrylist[$cnt]['timestamp'] = $timestamp; $cnt++; } } // 日付でソート foreach ((array)$entrylist as $key => $value) { $sort[$key] = $value['timestamp']; } array_multisort($sort, SORT_DESC, $entrylist); // JSONを返す echo json_encode($entrylist); exit; ?>
htmlのjson処理部分も掲載しておきます。
この部分はホームページの仕様で異なるのですが、json処理のサンプルとしてご参照ください。
<script type="text/JavaScript"> //RSS取得 $(function() { $.ajax({ type: 'GET', url: 'getjson.php', dataType: 'json', success: function(json) { $("#info_more p").hide(); $('#info_more .more').css({"margin-top":"-8px"}); $('#newsTopics').append('<dl>'); var len = json.length; //データが表示数より多い場合は先頭から表示数分処理する //90日前 var kyo = new Date(); var ttime = kyo.getTime() - 90 * 24 * 60 * 60 * 1000; for(var i=0; i < len; i++){ //日付変換 var ts = json[i].timestamp; var d = new Date( ts * 1000 ); var year = d.getFullYear(); var month = d.getMonth() + 1; var day = d.getDate(); if (month < 10) { month = '0' + month; } if (day < 10) { day = '0' + day; } var date = year + '/' + month + '/' + day; //hotアイコン表示 var image = "" if ( ~json[i].title.indexOf('!')) { image = ' <img src="images/hot.png" alt="HOT" />'; } else if ( ~json[i].title.indexOf('!')) { image = ' <img src="images/hot.png" alt="HOT" />'; } //new アイコン表示 else if ( ttime < (json[i].timestamp * 1000) ) { image = ' <img src="images/new.png" alt="NEW" />'; } //dt dd 成形 $('#newsTopics').append('<dt>'+ date + '</dt><dd><a href="' + json[i].link + '" target="_blank">' + json[i].title + '</a>' + image + '</dd>'); } $('#newsTopics').append('</dl>'); }, error: function() { $('#info_more').append('※Newsブログをご覧下さい。'); $("#info_more p").hide(); } }); }); </script>
タイムスタンプはリミットがあるので、少し気になってます。
by T.Y.