WordPressのRSSをjsonデータで処理する


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.