前に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');
を追加する。
ほかの設定は前の記事に少し書いてあります。
ここまでのまとめソース
1 2 3 4 5 6 7 8 | <?php define( 'MAGPIE_OUTPUT_ENCODING' , 'UTF-8' ); require ( 'magpierss-0.72/rss_fetch.inc' ); print "<pre>" ; print_r( $rss ); print "</pre>" ; ?> |
出力形式はMagpieRSS Objectの中に、[items]として配列で各記事の情報が入っています。
このブログ(wordpress)の場合はこんな感じ
1 2 3 4 5 6 7 8 9 10 11 12 13 | [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ブログの場合はこんな感じ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | [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で。
1 2 | foreach ( $rss ->items as $item ) { } |
インスタンス$rssのitemsに入ってる配列を1つずつアレコレするよ、っていう繰り返し文。
タイトルに記事へのリンクを貼ってみる
1 2 3 4 5 | 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ブログ用に適当に書いてみたソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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の形にする
1 2 3 4 5 | $times = strtotime ( $item [pubdate]); $time = date ( 'Y/m/d' , $times ); //時間まで出すならこっち $time = date ( 'Y/m/d H:i:s' , $times ); print $time ; |
経過時間で表示
WP-MakuPuppetでやってる、投稿日時からの経過時間を表示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | $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の記事だけとか
1 2 | if ( strpos ( $item [category], "wordpress" )){ } |
記事内の画像を取得
RSSに画像タグが入ってれば抜き出せます。下記ソースはFC2ブログ用。
wordpressは全文配信なら出来る…?このブログは抜粋配信なのでタグ除去されてました。
1 2 3 | $encoded = $item [content][encoded]; preg_match( "/<img[\w\d\W\s]+?\s\/>/i" , $encoded , $matches ); print ( $matches [0]); |
正規表現はだいぶ適当です。
for文
foreachの代わりにfor文使えば取得数とか決めれます。
若干書き方が変わるので次のソースを参考にしてください
1 2 3 4 | for ( $i =0; $i <5; $i ++){ $title = $rss ->items[ $i ][title]; print $title . "<br />" ; } |
「[PHP]サイト内のページに外部のRSSを表示する」への4件のフィードバック