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>ページが見つかりませんでした &#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として、スタイルを付けておけば、人間もプログラムも読めるので、フィードリーダーなどが、過去に存在していたが、現在存在しなくなったフィードでも、エラーではなく、存在しないというフィードを取得できるようになるかもしれません
フィードリーダーの挙動は、追っかけていませんので、あしからず
おまけで追記