当サイトには広告が含まれております

simplexml_load_fileでWordPressのRSSを読み込もうとしてエラーになった原因

この記事は最終更新日から10年経過しています。内容が古い可能性があります。

WordPressのRSSフィードをPHPで読むというプログラムをちょこっと書こうと思って、いきなりつまづきました。なぜかエラーが出てしまい、どのサイトで見つけたコードでも上手く行きません。
しかし、エラーメッセージで探してもなかなか同じような事例にあたらず。。結局分かった原因は、意外なところにありましたのでそれについて書きます。

記事をざっと見る

simplexml_load_file でRSSフィードが読み込めなかった状況

こんな感じのコードを書きました。

<?php
$feed = simplexml_load_file("https://usortblog.com//feed/",'SimpleXMLElement',LIBXML_NOCDATA);
echo "<pre>";var_dump($feed);echo "</pre>";

これだけで、このblogのfeedを取得して内容を表示するはずです。(ブラウザでも見ることが出来ます→こちら)

しかし、実行してみたところ

Warning: simplexml_load_file(): https://usortblog.com//feed/:2: parser error : Extra content at the end of the document in C:\xampp54\htdocs\ryustool\mikatest.php on line 9

Warning: simplexml_load_file(): <b>Notice</b>: Undefined index: HTTP_USER_AGENT in <b>/virtual/ryus/ryuscojpblo in C:\xampp54\htdocs\ryustool\mikatest.php on line 9

こんなエラーが出てしまいました。該当している行は、simplexml_load_file を使っているところです。

URLがおかしいのかな?とか見直してみますが、ブラウザではそのときでもちゃんと表示されていたのでURLがおかしいということも無いと思いました。

うーん。。。試しにWordPressで作られていると思われる、他のサイトのFEEDのURL<を入れて、このプログラムで表示したところ、意図通りに表示されました。

同じWordPressのRSSフィードが表示されている、ブラウザでは表示されているけれど プログラムから自分のサイトのfeed取得しようとするとエラーに! なってしまいます(>_<)

simplexml_load_fileではなく、file_get_contentsで確認して原因が判明

何が原因かわからないのですがどうも Undefined index: HTTP_USER_AGENT って…、なんか普通にPHPでよく見るエラーのような。

ということで、file_get_contents で確認してみました。すると、

$content = file_get_contents('https://usortblog.com//feed');
var_dump($content);

string(445) "<br />
<b>Notice</b>:  Undefined index: HTTP_USER_AGENT in <b>/virtual/ryus/ryuscojpblog/wp-content/themes/twentyfourteen-ryus/functions.php</b> on line <b>579</b><br />
<br />
<b>Warning</b>:  Cannot modify header information - headers already sent by (output started at /virtual/ryus/ryuscojpblog/wp-content/themes/twentyfourteen-ryus/functions.php:579) in <b>/virtual/ryus/ryuscojpblog/wp-includes/pluggable.php</b> on line <b>1178</b><br />

うっ… 

themes/twentyfourteen-ryus/functions.php on line 579

なんですと~(>_<)。自分が色々いじっているfunctions.phpで Undefined index: HTTP_USER_AGENT に関する、NoticeやWarningが発生しています。該当する行を見ると、

    return preg_match($pattern, $_SERVER['HTTP_USER_AGENT']);

と、あります。これは…PHPを書く人なら心当たりのある「該当する配列が存在しないのに isset とかで存在を確認せずに、存在するものとして使ったときのワーニング」です。ブラウザからアクセスすればここには HTTP_USER_AGENT の配列が存在するはずですが、PHPから直接呼ばれるのでこの配列は存在しません。

そのためにワーニングメッセージが返されて、ワーニングメッセージはxmlじゃなから、simplexml_load_file がエラーという判定を下してしまうようです。

ということで、この行のコーディングを

    $useragent = '';
    if (isset($_SERVER['HTTP_USER_AGENT'])){
        $useragent = $_SERVER['HTTP_USER_AGENT'];
    }
    return preg_match($pattern, $useragent);

こんな感じに変更して、無事、

object(SimpleXMLElement)#1 (2) {
  ["@attributes"]=>
  array(1) {
    ["version"]=>
    string(3) "2.0"
  }
  ["channel"]=>
  object(SimpleXMLElement)#2 (7) {
    ["title"]=>
    string(9) "RYUS blog"
    ["link"]=>
    string(22) "https://usortblog.com/"
    ["description"]=>
    string(23) "株式会社RYUSのblog"
    ["lastBuildDate"]=>
    string(31) "Fri, 17 Apr 2015 00:30:18 +0000"
    ["language"]=>
    string(2) "ja"
    ["generator"]=>
    string(29) "http://wordpress.org/?v=4.1.1"
    ["item"]=>
    array(10) {
      [0]=>
      object(SimpleXMLElement)#3 (7) {

simplexml_load_file を使って、RSSフィードを読み込むことに成功しました(^^)/

まとめ:functions.phpの利用は気をつけましょう!!!

と、自分が言うのもアレですが(^_^;、つい簡単に手が入れられるので色々追加してしまうfunctions.phpですが、今回のようにすべての場合に通るようなコードを書いた場合はワーニングも出ないように完璧な感じのコードにしておかないと、おもいがけないところでエラーが出てしまうので気をつけましょう!

この記事が気に入ったら
いいね または フォローしてね!

あなたのシェアが励みになります!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントを残す

記事をざっと見る