rss feed error の 対処例 @WordPress

WordPressのフィードが、正常に出力できなくなるトラブルは、比較的多く発生する問題ですが、多くは、カスタマイズによる空白文字列の追加などによって、フィードがエラーになる事例です。フィードがエラーというのは、フィードを表示した時にエラーメッセージが表示されている場合の事をここでは そのように表現しています。

フィードエラーサンプル

This page contains the following errors:

error on line 3 at column 6: XML declaration allowed only at the start of the document

Below is a rendering of the page up to the first error.

parsererror要素は、div要素に書き換えています。

上のエラーは、functions.php のphpコード区間外に余分な改行を入力することで、再現できます。

一度、このようなフィードを表示すると、WordPressにフィードがキャッシュされて、改行を元に戻しても、現象が継続する事があるため、対策が、迷路に入るケースが多いと思われます。

Feedがエラーで表示できない場合

デフォルトのフィードリンクのチェック

フィードのURLは、パーマリンク設定により異なります。デフォルトフィードのURLを確認しておくといいです。

functions.php に

<?php echo get_bloginfo( get_default_feed() . '_url'); ?>

トップページを閲覧して、

  • リンクをコピーしたら、コードを削除

デフォルトフィードにアクセス。

エラーを確認

冒頭のエラーは、functions.phpにphp区間外の改行を追加して、人為的に発生させたものですが、改行を取り去っても、フィードは、WordPressにキャッシュされているので、ブラウザのキャッシュを削除しただけでは解消しません。

なので、WordPressのキャッシュを停止するコードを作ります。

フィードキャッシュの停止

( デバッグの時だけ、使ってください )

カスタマイズでの、テストコードなどが、フィードにキャッシュされる事があります。
(functions.phpに実験的に出力したコード、php区間外の空白や改行、bom など、)

<?php function do_not_cache_feeds( $feed ) { $feed->enable_cache(false);
 }
add_action( 'wp_feed_options', 'do_not_cache_feeds' );
?>

ブラウザキャッシュの削除

一度みたら、ブラウザはキャッシュしていると考えたほうがいい。

File not foundが表示(WordPressのnot foundでないもの )される場合

Step 1

functions.phpに以下を記述て、デフォルトフィードを、確認する。

<?php echo get_bloginfo( get_default_feed() . '_url'); ?>

Step 2

デフォルトフィードにアクセスする。

デフォルトフィードが、初期設定の

http://example.com/install-directory/wp-content/?feed=rss2

のように、feed=rss2でない場合には、.htaccess ファイルをチェックする。

.htaccessが存在しない場合や、.htaccessにmod_rewriteの記述がない場合は、パーマリンクの設定を、デフォルトに戻す。

最初から、デフォルトフィードのチェックを繰り返す。

.htaccessが存在しない場合や、記述がある場合は、phpinfo() を使って、mod_rewriteが使えるようになっているかどうかを、チェックする。**チェック方法
ファイル名 phpinfo.php
作成したファイルに、以下のように記述してワードプレスをインストールしたディレクトリにアップロードしてください。

<?php phpinfo(); ?>

ブルーのテーブルが表示されれば、成功です。
Loaded Modules という項目に、mod_rewrite の記載があればOKです

( 確認できたら、必ずファイルは削除してください )

記載がない場合は、パーマリンクは、デフォルトに戻す。
パーマリンクの設定は、利用できません。

http://ja.forums.wordpress.org/topic/12312?replies=9(参考 say @popup )

Aside

パーマリンクの設定を、日付と投稿名などとしている場合

フィードが見つからないと、
http://www.example.com/wp/arienai/feed/

にアクセスすると、フィードが見つからないよ、というフィードが出力されます。※1(ver3.4.2)

もう一方で、パーマリンクがデフォルトの場合
http://example.com/wp/arienai/?feed=rss2
とした場合には、デフォルトのフィードが出力されるという事もあります。(ver3.4.2)

実際問題として、パーマリンクの設定と、フィードの出力は、微妙な挙動を示す事はありそうです。

何らかの問題で、apache404や、通常のwordpressの404を表示が行われると、
フィードリーダーや、fetch用のスクリプトが、文字列を受け取るので、エラーになる事が考えられます。

そのような場合は、カスタムエラーページを、xmlで作っておいてfeedのエラーに対応するという事も必要かもしれません。

※1ファイルが見つからない場合の xml

<?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>ページが見つかりませんでした &amp;#187; wp</title>
	<atom:link href="http://example.com/wp/previewraindrops/nomore/feed/" rel="self" type="application/rss+xml"></atom:link>
	<link />http://example.com/wp/previewraindrops
	<description>Just another site</description>
	<lastbuilddate>Thu, 08 Nov 2012 09:03:00 +0000</lastbuilddate>
	<language>ja</language>
	<sy:updateperiod>hourly</sy:updateperiod>
	<sy:updatefrequency>1</sy:updatefrequency>
	<generator>http://wordpress.org/?v=3.4.2</generator>
	</channel>
</rss>

結局のところ、xml形式のファイルアクセスは、多分、xmlでエラーを返したほうがよいのだろうと思う。
ワードプレスの場合は、フィードの種類も多く、複雑になりそうなので、HTTP404をxmlで返してやる事なら簡単なので、rssで、カスタムエラーページを書いてみました。

サンプル

<?php $host= $_SERVER['HTTP_HOST']; $url= $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'].$_SERVER['QUERY_STRING']; header("Content-Type: text/xml"); ?>
<?xml version="1.0" encoding="UTF-8"?>

<?xml-stylesheet href="/local-wp/xml.css" type="text/css"?>
<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>ページが見つかりませんでした</title>
    <atom:link href="<?php echo $url;?>" rel="self" type="application/rss+xml" />
    <link />< ?php echo $host;?>
    <description>Just another site</description>
    <lastbuilddate>Thu, 08 Nov 2000 00:00:00 +0000</lastbuilddate>
    <language>ja</language>
    <sy:updateperiod>hourly</sy:updateperiod>
    <sy:updatefrequency>1</sy:updatefrequency>
    <generator>none</generator>
    </atom:link></channel>
</rss>
rss{
	background:#eee;
}
channel{
	display:block;
	width:100%;
	padding:10%;
	background:#fff;
}

channel title{
	display:block;
	font-size:200%;
}
description,
link,
channel title{
	display:block;

}
updateFrequency,
updatePeriod,
link,
generator,
sy,
language,
lastBuildDate{
	display:none!important;
	visibility:hidden;
}
rss{
	display:none;
}

.htaccessなどで

ErrorDocument 404 /errors/404.php

などとして、カスタムエラーページを、xmlとして、スタイルを付けておけば、人間もプログラムも読めるので、フィードリーダーなどが、過去に存在していたが、現在存在しなくなったフィードでも、エラーではなく、存在しないというフィードを取得できるようになるかもしれません

フィードリーダーの挙動は、追っかけていませんので、あしからず

おまけで追記

[emulsion_relate_posts]