ある WordPress テーマファイルに切り替えたときだけ、RSS フィードが壊れることに気がつきました。結構わかりにくいこの問題、原因は FeedBurner でも文字化けでもなく、PHP ソースの問題でした。

HTML ブラウジング中は気がつかない

IE など Web ブラウザで確認すると、通常の HTML コンテンツをブラウズしている限りは何の問題もないのですが、RSS
文字化けしたり、本来表示されるはずの内容が欠けたりします。Web ブラウザの RSS リーダー機能の実装によっても「壊れ方」が異なるようです。

すわ、FeedBurner の Google への移行がらみか、FeedBurner FeedSmith 自体の賞味期限切れか、なんて可能性も一応考えましたが :mrgreen: 、いやいや決めつけてはいけません。

Feed Validator で見ると、確かに fail しています。

FEED Validator: line 1 blank line

FEED Validator: 先頭に空行

どこから沸いて出てきたんだこの空白行は。

BOM か、ソースのブランク行か

これは WordPress だけに限らず、PHP の空白行問題として割と報告されているようです。大別すると根本的な原因は

があるようです。私が遭遇したのは後者で、テーマファイルを見たら空行が残っていて、削除すれば何事もなく This is a valid RSS feed になりました。

NG な例

[code gutter=”true” language=”php”]
(空白行)
(空白行)
<?php
[/code]

[code gutter=”true” language=”php”]
?>
(空白行)
[/code]

修正後

[code gutter=”true” language=”php”]
<?php
[/code]

[code gutter=”true” language=”php”]
?>
[/code]

ポイントとしては

  • 改行はファイル先頭にあってもファイル末尾にあっても NG
  • テーマファイルにあってもプラグインソースにあっても NG
  • ?>

    の後に一行無駄な改行があっただけでもダメ

というシビアさです。

記述は柔軟にできるが、ハマりポイントもそれだけ多い PHP の成せる技、という感じがしますね。 🙂

空白行を削って FEED Validator で再確認する際は、wp-cache プラグインを Disable することをお忘れなく。直したはずなのに空白行が取れていない…と泣きを見ます。