前にwordpressでRSSを取得して表示という記事を書いたが、普通のWebサイトでもRSSの表示は出来る。
ヘッドラインとしてトップページにブログのRSS表示するもよし、ニュースリンクとしてランダム表示するもよし。
使うのはWordpressで使われてるのと同じRSSパーサーMagpieRSSです。
手っ取り早く動作を見てみる::
- magpierss-0.72ダウンロードして解凍
- 表示したいページと同じ階層にフォルダUP
- 表示したいページをPHPにする
- 表示したいページに
require('magpierss-0.72/rss_fetch.inc');
を書く $rss = fetch_rss($url);
として、$urlに表示したいRSSのフルパスを書く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[\w\d\W\s]+?\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[\w\d\W\s]+?\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件のフィードバック