前に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件のフィードバック