[PHP]サイト内のページに外部のRSSを表示する

前にwordpressでRSSを取得して表示という記事を書いたが、普通のWebサイトでもRSSの表示は出来る。
ヘッドラインとしてトップページにブログのRSS表示するもよし、ニュースリンクとしてランダム表示するもよし。
使うのはWordpressで使われてるのと同じRSSパーサーMagpieRSSです。

手っ取り早く動作を見てみる::

  1. magpierss-0.72ダウンロードして解凍
  2. 表示したいページと同じ階層にフォルダUP
  3. 表示したいページをPHPにする
  4. 表示したいページにrequire('magpierss-0.72/rss_fetch.inc');を書く
  5. $rss = fetch_rss($url);として、$urlに表示したいRSSのフルパスを書く
  6. print_r($rss);を書く

cacheディレクトリは自動的に作成される。(magpierssフォルダ内の不必要なものは削除してもいい)
ずらずらっとRSSが表示されると思います。が、多分文字化けしてるはず。

デフォルトの文字コードがISO-8859-1になってるので、
define('MAGPIE_OUTPUT_ENCODING', 'UTF-8');を追加する。
ほかの設定は前の記事に少し書いてあります。

ここまでのまとめソース

<?php
define('MAGPIE_OUTPUT_ENCODING', 'UTF-8');
require('magpierss-0.72/rss_fetch.inc');
$rss = fetch_rss("https://tenderfeel.xsrv.jp/feed/");
print "<pre>";
print_r($rss);
print "</pre>";
?>

出力形式はMagpieRSS Objectの中に、[items]として配列で各記事の情報が入っています。

このブログ(wordpress)の場合はこんな感じ

  [items] => Array
        (
            [0] => Array
                (
                    [title] => FireFox3正式版リリース(FireFox2との併用)
                    [link] => https://tenderfeel.xsrv.jp/memo/185/
                    [comments] => https://tenderfeel.xsrv.jp/memo/185/#comments
                    [pubdate] => Wed, 18 Jun 2008 02:52:22 +0000
                    [dc] => Array
                        (
                            [creator] => Tenderfeel
                        )
....以下省略

FC2ブログの場合はこんな感じ

    [items] => Array
        (
            [0] => Array
                (
                    [about] => http://ex.blog.fc2.com/blog-entry-1.html
                    [link] => http://ex.blog.fc2.com/blog-entry-1.html
                    [title] => テスト
                    [description] =>  ああああああ
 
                    [content] => Array
                        (
                            [encoded] => 
 ああああああ
                        )

                    [dc] => Array
                        (
                            [subject] => 未分類
                            [date] => 2008-06-10T20:16:56+09:00
....以下省略

配列のkeyとか並び順が全然違うのが分かると思います。

各記事のRSS情報を処理するためにはforeachで。

foreach ($rss->items as $item ) {
}

インスタンス$rssのitemsに入ってる配列を1つずつアレコレするよ、っていう繰り返し文。

タイトルに記事へのリンクを貼ってみる

foreach ($rss->items as $item ) {
	$title = $item[title];
	$url   = $item[link];
	echo "<li><a href=$url>$title</a></li><br>";
}

$itemは[0] => Array()の部分になるので、値を取り出すには配列のkeyを[]に入れて$itemの後につけます。
さらに配列になってる場合は、$item[dc][creator]のように書きます。

以下はFC2ブログ用に適当に書いてみたソース

foreach ($rss->items as $item){
		$title = $item[title];
		$url   = $item[link];
		$times = strtotime($item[date]);
		$time = date('Y/m/d', $times);
			
		print "<div class=\"blog\">";
		echo "<h2><a href=\"$url\">$title</a></h2>";
		echo "<p class=\"date\">".$time."</p>";

		$encoded = $item[content][encoded];
		$summary = $item[summary];
		preg_match("/<img&#91;\w\d\W\s&#93;+?\s\/>/i",$encoded, $matches);
		print ($matches[0]);
		print "<p>".$summary."</p>";
		print "</div>";
}

日時の整形

上のソースで言うと$item[pubdate]を2008/00/00の形にする

$times = strtotime($item[pubdate]);
$time = date('Y/m/d', $times);
//時間まで出すならこっち
$time = date('Y/m/d H:i:s', $times);
print $time;

経過時間で表示

WP-MakuPuppetでやってる、投稿日時からの経過時間を表示

$time = strtotime($item[pubdate]);
if($time!=null){
	if ( ( abs( time() - $time) ) < 86400 ){
		$h_time = sprintf( '%s 前', human_time_diff( $time ) );
	}else{
		$h_time = date('Y/m/d', $time);
	}
	$timestamp = sprintf( '%s','<a title="' . date('Y/m/d H:i:s', $time) . '" href="'.$link.'">(' . $h_time . ')</a>' );
		
}else{
		
	$timestamp='';
}
echo $timestamp;

ある条件に当てはまる記事だけ表示

たとえばカテゴリーがwordpressの記事だけとか

if(strpos($item[category],"wordpress")){
}

記事内の画像を取得

RSSに画像タグが入ってれば抜き出せます。下記ソースはFC2ブログ用。
wordpressは全文配信なら出来る…?このブログは抜粋配信なのでタグ除去されてました。

$encoded = $item[content][encoded];
preg_match("/<img&#91;\w\d\W\s&#93;+?\s\/>/i",$encoded, $matches);
print ($matches[0]);

正規表現はだいぶ適当です。

for文

foreachの代わりにfor文使えば取得数とか決めれます。
若干書き方が変わるので次のソースを参考にしてください

for($i=0;$i<5;$i++){
	$title = $rss->items[$i][title];
	print $title."<br />";
}

「[PHP]サイト内のページに外部のRSSを表示する」への4件のフィードバック

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください