質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.00%

【WordPress】rssの始まりに空行が入って取得できない

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 476

taro_nii_chan

score 191

https://teratail.com/questions/85883
様を参考にさせていただいた上での質問です。

自分で作った WordPress (A) のサイトから rss を引っ張って来て、別の自分で作る WordPress (B) に表示しようと思っています。

(B)のフロントページを

<?php
include_once( ABSPATH . WPINC . '/feed.php' );
$feeduri = '[ (A)のURL ]/feed/';
$rss = fetch_feed($feeduri);

// print_r($rss);

if (!is_wp_error($rss)) {
    $maxitems = $rss->get_item_quantity(3);
    $rss_items = $rss->get_items( 0, $maxitems );
}

foreach ( $rss_items as $item ) : ?>
    <!-- 記事へのリンクを表示 -->
    <a href="<?php echo $item->get_permalink(); ?>">

    <!-- 記事の最初の画像を表示 -->
    <?php
    $first_img = '';
    if ( preg_match( '/<img.+?src=[\'"]([^\'"]+?)[\'"].*?>/msi', $item->get_content(), $matches ) ) {
        $first_img = $matches[1];
    }
    ?>
        <img src="<?php echo esc_attr( $first_img ); ?>" alt="">

    <!-- 記事タイトルを表示 -->
    <?php
    $title = $item->get_title();
    if(mb_strlen( $title ) > 40 ):
    ?>
        <p class="title"><?php echo mb_substr( $title,0,40 );?>...</p>
    <?php else : ?>
        <p class="title"><?php echo $title ;?></p>
    <?php endif; ?>

    <!-- 投稿日を表示 -->
    <?php 
    $item_date = $item->get_date();
    $date = date('Y/m/d',strtotime( $item_date )); ?>
        <p class="date"><?php echo $date; ?></p>
    </a>
<?php
endforeach;
wp_reset_postdata();
?>

とすると、何もない白いページが表示され、5行目のprint_rをのコメントアウトを外してやると、

WP_Error Object
(
    [errors] => Array
        (
            [simplepie-error] => Array
                (
                    [0] => This XML document is invalid, likely due to invalid characters. XML error: XML or text declaration not at start of entity at line 4, column 0
                )

        )

    [error_data] => Array
        (
        )

)


と出ます。
つまり、XMLが始まる前に空行があるから invalid だと言われてるのだと思っているのですが、(A) の方で何か rss に関する設定がおかしいのでしょうか?

問題判別の方法など教えていただけるとありがたいです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+3

まずは、実際に取得された feed のデータが、どのような状態か確認された方が良いと思います。


質問には、エラーメッセージだけで、実際の feed がどうなっているかの記載がなかったので、新規インストールしただけの「WordPress 4.9.8-ja + TwentySeventeen テーマ」の環境で確認してみました。

まず、RSS をそのまま取得。

$ curl -D - -s https://example.com/feed/

HTTP/1.1 200 OK
Date: Wed, 28 Nov 2018 12:34:04 GMT
Server: Apache
X-Powered-By: PHP/7.2.12
Last-Modified: Thu, 25 Oct 2018 00:34:34 GMT
ETag: "e4d1ff390c2503e13d1c78f6a03d2677"
X-Robots-Tag: noindex, follow
Link: <https://example.com/wp-json/>; rel="https://api.w.org/"
Transfer-Encoding: chunked
Content-Type: application/rss+xml; charset=UTF-8

<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
    xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:wfw="http://wellformedweb.org/CommentAPI/"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:atom="http://www.w3.org/2005/Atom"
    xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
    xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
    >

<channel>
    <title>WordPress</title>
    <atom:link href="https://example.com/feed/" rel="self" type="application/rss+xml" />
(以下略)


となっていました。ざっとみた感じでは、問題はなさそうです。

次に 質問に記載されている PHP スクリプトの 取得した RSS を表示する部分までを実行してみました。

<?php
require_once( dirname( __FILE__ ) . '/wp-load.php' );
include_once( ABSPATH . WPINC . '/feed.php' );
$feeduri = 'https://example.com/feed/';
$rss = fetch_feed($feeduri);
print_r($rss);


結果は、問題なく取得されていました。

SimplePie Object
(
  [data] => Array
    (
      [child] => Array
        (
          [] => Array
            (
              [rss] => Array
                (
                  [0] => Array
                    (
                      [data] =>

                      [attribs] => Array
                        (
                          [] => Array
                            (
                              [version] => 2.0
                            )

                        )

                      [xml_base] =>
                      [xml_base_explicit] =>
                      [xml_lang] =>
                      [child] => Array
                        (
                          [] => Array
                            (
                              [channel] => Array
                                (
                                  [0] => Array
                                    (
                                      [data] =>


                                      [attribs] => Array
                                        (
                                        )

                                      [xml_base] =>
                                      [xml_base_explicit] =>
                                      [xml_lang] =>
                                      [child] => Array
                                        (
                                          [] => Array
                                            (
                                              [title] => Array
                                                (
                                                  [0] => Array
                                                    (
                                                      [data] => WordPress
                                                      [attribs] => Array
                                                        (
                                                        )

                                                      [xml_base] =>
                                                      [xml_base_explicit] =>
                                                      [xml_lang] =>
                                                    )

                                                )

                                              [link] => Array
                                                (
                                                  [0] => Array
                                                    (
                                                      [data] => https://example.com
                                                      [attribs] => Array
                                                        (
                                                        )

                                                      [xml_base] =>
                                                      [xml_base_explicit] =>
                                                      [xml_lang] =>
                                                    )

                                                )

                                              [description] => Array
                                                (
                                                  [0] => Array
                                                    (
                                                      [data] => Just another WordPress site
                                                      [attribs] => Array
                                                        (
                                                        )

                                                      [xml_base] =>
                                                      [xml_base_explicit] =>
                                                      [xml_lang] =>
                                                    )

                                                )

                                              [lastBuildDate] => Array
                                                (
                                                  [0] => Array
                                                    (
                                                      [data] => Wed, 26 Sep 2018 01:21:19 +0000
                                                      [attribs] => Array
                                                        (
                                                        )

                                                      [xml_base] =>
                                                      [xml_base_explicit] =>
                                                      [xml_lang] =>
                                                    )

                                                )

                                              [language] => Array
                                                (
                                                  [0] => Array
                                                    (
                                                      [data] => ja
                                                      [attribs] => Array
                                                        (
                                                        )

                                                      [xml_base] =>
                                                      [xml_base_explicit] =>
                                                      [xml_lang] =>
                                                    )

                                                )

(以下略)

         この結果でわかったことは、新規インストールした「WordPress 4.9.8-ja / TwentySeventeen テーマ」の環境では、問題が発生しないので、お使いの環境(テーマ・プラグイン)に依存している現象のようです。     

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/29 17:24

    自己解決にはしてしまいましたが、確認の方法(curlコマンドは知りませんでした)、問題の切り分け方など、とても参考になりました。ありがとうございました。

    キャンセル

check解決した方法

0

原因は追求し切れていないのですが、解決法が見つかったので備忘録として書いておきます。

WordPressのRSSフィードがエラーになって配信されなくなってしまったときに対処した方法まとめ

の中の

WordPress Remove Blank Line From RSS Feed – wordpress error on line 2 at column 6: XML declaration allowed only at the start of the document

という記事が参考になって解決しました。
要約すると、


1) 最初に次のphp ファイルをダウンロードする http://wejn.org/stuff/wejnswpwhitespacefix.php
ただ、これをクリックしても php が実行されて吐き出されたものが表示されるだけなので、リンク「HERE」から入手、拡張子が ph になってるので php にリネーム。

2) ダウンロードしたら php ファイルを WordPress サイトのルードディレクトリにアップロード。

3) index.php を編集して次の一行を加える。

include("wejnswpwhitespacefix.php");

これでリロードすれば不思議と動くはず。


だそうです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.00%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる