RSSを自分のサイトに表示させる ITかあさん

ITかあさん

RSSを自分のサイトに表示させる


PHPを使ってRSSを自分のサイトの好きなところに表示させてみよう

PHPを使ってRSSを自分のサイトやブログの好きなところに表示させてみたいと思います。
RSSはXMLという言語を使って出来ています。XMLについての詳しい解説はこちらを確認して下さい。

RSSをXMLとして表示する

RSSを表示してあげるには、
1.表示したいRSSのURLを指定するfile_get_contents関数
2.XMLとして開く関数を実行するsimplexml_load_string関数

$contents = file_get_contents('http://www.kaasan.info/feed');
$xml = simplexml_load_string($contents);

なんと、たったのこれだけで準備は完了です。
$xmlの中身がどうなっているのか、念のために参照してみます。
一つの変数($なんちゃら)に複数の値が入っているデータを配列をいうのですが、この配列構造になっているデータを参照するのに使う関数がprint_rまたはvar_dumpです。私も日ごろPHPで何かプログラミングをしていて、一番お世話になっている関数です。

$contents = file_get_contents('http://www.kaasan.info/feed');
$xml = simplexml_load_string($contents);
//$xmlの中身を参照。preタグで囲うと見やすくなる。
echo '<pre>';
print_r($xml);
echo '</pre>';

$xmlの中身を参照した時の実行結果

もしかしたらこの画面を見たことのある人もいるかもしれません。よくこれだけで『エラーです!どうにかしてください!』といわれるんですが、『あ、これ今デバック中なので・・・・』みたいなやりとりをよくWEBデザイナーの方としていますw
実はこの時点ですでにRSSをHTML内に表示する準備は出来ているんです。
細かい解説は後にして、ひとまず表示だけ先にしたいと思います。

HTML内にRSSを表示してみる

<dl>
<?php for($i = 0; $i <= 9; $i++):?>
<dt><a href="<?php echo $xml->channel->item->$i->link;?>" target="_blank"><?php echo $xml->channel->item->$i->title;?></a></dt>
<dd><?php echo $xml->channel->item->$i->description;?></dd>
<dd><?php echo $xml->channel->item->$i->pubDate;?></dd>
<?php endfor;?>
</dl>

実行結果

RSS表示の仕組みを解説

この画像は$xml->channel->itemの中身です。RSSの中身をprint_rしているURLと合わせて確認して下さい。
print_rで$xmlの中身を参照したとき、RSSをURLで確認して、件数を一つずつ数えると10件ありますが
PHPやJavascriptなどプログラミング言語では配列のカウントは0から数えるという大事な決まりごとがあります。

http://kaasan.biz/print_r.phpの参照

RSSをprint_rの参照結果

$xml->channel->itemの中身

$xml->channel->itemの中身

for文のループの仕組み

$xml->channel->itemの中身は分かっても、それがどういう仕組みでループされているかがピンと来ないかもしれません。私も生まれて初めてPHPでループをした時はピンときませんでした。

$iを出力してみる

そこで$iを出力しながら実行してみましょう。

<dl>
<?php for($i = 0; $i <= 9; $i++):?>
<dt>第<?php echo $i;?>番目のループ</dt>
<dt><a href="<?php echo $xml->channel->item->$i->link;?>" target="_blank"><?php echo $xml->channel->item->$i->title;?></a></dt>
<dd><?php echo $xml->channel->item->$i->description;?></dd>
<dd><?php echo $xml->channel->item->$i->pubDate;?></dd>
<?php endfor;?>
</dl>

実行結果

$xmlをprint_rで参照したものと、比べてみる

$xmlをprint_rで参照したものと、RSSの実行2を比べてみましょう。
$iには数字が1ずつ増加していることが2つを比べると理解できると思います。

好きなところだけ表示するには?

応用編として、好きなところだけを表示したいとします。例えば3番目から6番目。
(プログラム上、配列は0番目からカウントするのをお忘れなく)
for内の数字を変更すればいいだけです。

<dl>
<?php for($i = 3; $i <= 6; $i++):?>
<dt><a href="<?php echo $xml->channel->item->$i->link;?>" target="_blank"><?php echo $xml->channel->item->$i->title;?></a></dt>
<dd><?php echo $xml->channel->item->$i->description;?></dd>
<dd><?php echo $xml->channel->item->$i->pubDate;?></dd>
<?php endfor;?>
</dl>

逆順にしてみる

逆順にする方法もあります。配列の順番を入れ替える関数もあるんですが、もっと簡単に。
$i++で1ずつ増えるので$i–で1ずつマイナスにする方法もあるんです。
こうすればさっきと逆順になりますね!

//10番目から1ずつマイナスに
<dl>
<?php for($i = 9; $i <= 0; $i--):?>
<dt><a href="<?php echo $xml->channel->item->$i->link;?>" target="_blank"><?php echo $xml->channel->item->$i->title;?></a></dt>
<dd><?php echo $xml->channel->item->$i->description;?></dd>
<dd><?php echo $xml->channel->item->$i->pubDate;?></dd>
<?php endfor;?>
</dl>

最新1件だけ表示するには?

ループしないで最新1件だけがほしい!1件だけならループの必要がない?
最新1件だけのタイトルだけを出力するとして・・・

<?php echo $xml->channel->item->0->title;?>

どうでしょう?エラーですね。$ループされていたとき$inには数字が入っていたのだから、そのまま数字を書けばいいんじゃないの?
と思ってしまいますよね。これはちょっとした落とし穴でして。

->はオブジェクト(クラス)のメソッドやフィールド変数を参照するための演算子

演算子って言われてもイマイチピンときませんが、数字はあくまでも数字であることは分かりますよね。数字は数字。それ以上参照のしようがありませんものね。
オブジェクトでもなんでもないただの数字を展開しようとしたのでここではエラーになってしまったのです。
ちょっと面倒なのですが、この場合直前に$iに0を代入して、変数化してあげれば先ほどと同じ書き方で出力可能です。

<?php
$i = 0;
echo $xml->channel->item->0->title
; ?>

以上でRSSの基本的な出力方法についてはおしまいです。