PHPマスター様
実はあっさりブログの存在を忘れていました。
そして必要に迫られて書いております。
【質問】
WordPressで書いてるブログの最新記事を、別サイトのサイドバーに表示したいと考えています。(多分、よくあることですよね?)
というわけで、PHPでWPのブログのRSSを取りに行って表示させようとしているのですが。
取得できません。
[別サイトのサイドバーのソース]
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
<?php $rssurl = "http://her.her.jp/hershop/feed/"; //echo file_get_contents("http://her.her.jp/hershop/feed/"); $rssdata = simplexml_load_file($rssurl); $outdata = ""; $outdata .= "<a href=\""; $outdata .= $rssdata->item[0]->link; $outdata .= "\">"; $outdata .= $rssdata->item[0]->title; $outdata .= "</a>\n"; $outdata .= $rssdata->item[0]->description; ?>
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
ソース四行目のように $rssdataにsimplexml_load_file($rssurl)を代入しています。
が中身は空です。
実行後のhtmlでは
<a href=""></a>
と見事にrssdataの中身をスルーです。
エラーにもなりません。
ちなみにコメントアウトしていますがfile_get_contentsでは中身が(エンコードは別にして)きれいに表示されています。
というわけでURL間違いなどではないと思うのですが・・・。
PHPのバージョンは5.2.17 サーバーのOSはLinux、動作確認はGoogleChromeでしてます。
理由や対処法をどなたか教えてください。。。
教えてくれたら一杯おごります。
↓解決しました!
原因は一言で言うとsimplexml_load_fileの戻り値であるSimpleXMLElementオブジェクトの仕様を理解していなかったことです。
このSimpleXMLElementはxmlファイルの構造をそのまま持ったオブジェクトなのでxmlのもつツリー構造をそのままたどっていかないと値が取得できないという今回のような結果になってしまうのです。
今回の場合、指定URLのxmlの構造は以下のような構造でした。
<channel> <item> <link> <title> <description> </item> <item> ... </item> <item> ... </item> </channel>
ですから
$rssdata->item[0]->link
というのはツリーの構造上正しくないので、そういうデータはありませんよ、というわけでスルーされたんですね。
$rssdata->channel->item[0]->link
が正解です。
戻り値がStringじゃなくてもしかしてArray?Hash?とか思いましたがそんなことはなかったみたいです^^;
私の場合最新の(一番上の)データだけあればいいのでitem[0]でちゃんと取得できました。
あとエンコーディングも違って文字化けしていたので修正後のソースはこうなりました。
<?php ini_set("default_charset", "Shift_JIS"); $rssurl = "http://her.her.jp/hershop/feed/"; $rssdata = simplexml_load_file($rssurl); $outdata = ""; $tmp=$rssdata->channel->item[0]; $outdata .= "<a href=\""; $outdata .= $tmp->link; $outdata .= "\">"; $outdata .= $tmp->title; $outdata .= "</a>\n"; $outdata .= $tmp->description; echo mb_convert_encoding($outdata, "SJIS", "auto"); ?>
というわけで気にかけてくださったみなさま本当にありがとうございました。
飲みに行きましょう!