当サイトでは、ブログエンジンにWordPressを利用しています。WordPressでは、theme(テーマ)というテンプレートを差し替えることにより、サイトデザインを簡単に変更することができます。
WordPress › Free WordPress Themesより、フリーのthemeをダウンロードすることができますが、Developer’s blogでは、オリジナルのthemeを使用しています。このオリジナルthemeの作成時にある問題が発生していました。その問題が解決に至るまでの経緯と簡単な考察をまとめてみたいと思います。
RSSフィードの取得でXML パースエラーが発生していました。
通常は、「このブログを購読する」のリンクをクリックすると、当プログのRSSをWebブラウザのRSSリーダーに登録したりすることができます。→
※ お使いのプラウザにRSSリーダーの機能がある場合。
発生していたエラーは、以下のようなエラーでした。
Safariの場合は正常に表示されています。
※ すいません。Internet Explorerでは試しておりません。
RSSフィードをXMLで保存してみると、以下のような状態になっていました。
<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:excerpt="http://wordpress.org/export/1.1/excerpt/" 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:wp="http://wordpress.org/export/1.1/" > 〜以下省略〜
先頭に2行、改行が入っています。これが原因のようです。
ちょっと調べてみたところ、以下のような記事を見つけました。
WordPress › フォーラム » XMLパースエラー
WordPressのテンプレはUTF-8 BOMなしで! | kikumaro.net blog
これを踏まえて、WordPressのtheme作成時の注意点をあげてみたいと思います。
- themeのテンプレートファイルのエンコーディングがUTF-8の場合、BOMが入ると出力されるHTMLの先頭に改行が入り、RSSフィードにも影響が出る。
- themeのテンプレートファイルのエンコーディングはUTF-8 BOM無しにしなければならない。BOM付きの場合、文字化け等のエラーの原因となる。
ファイルをUTF-8で保存する際に、エディタによっては先頭にBOMを挿入する場合があるようです(例えばWindowsのメモ帳等)。
ということで、さっそくBOM付きを探してみたのですが…見つかりませんでした。
原因は別にあるということです。
さらによく調べてみたところ、今度は以下のような記事を見つけました。
WordPressのRSSパースエラー
3. 使用中のテーマのfunctions.phpので括られた部分の外側に空行がないか確認する。
WordPressのRSSパースエラーより引用。
functions.phpを見てみると、確かに空行がありました。
add_filter( 'the_content_more_link', 'custom_content_more_link' ); ?> <?php function mytheme_comment($comment, $args, $depth) {
※ function.phpより一部抜粋。
この空行をを以下のように削除すると、
add_filter( 'the_content_more_link', 'custom_content_more_link' ); ?> <?php function mytheme_comment($comment, $args, $depth) {
確かに、RSSフィードの2行あった改行が1行になりました。
結果的に、functions.phpには空行が2行あり、これを除去することによって、RSSフィードのxmlの先頭に出力された2行の改行がなくなり、「このブログを購読する」のリンクからも正常にRSSフィードが取得できるようになりました。
なので、
XML パースエラー:実体の初めに XML またはテキスト宣言がありません。
や、
XML declaration allowed only at the start of the document
のようなエラーが発生した場合にはまず、functions.phpファイルの空行を確認して、問題なければthemeのファイルエンコーディングがUTF-8 BOM付きになっていないか、の順でチェックした方が、効率良く対処できるかもしれませんね。
それと、BOM付きの対処法で、theme以外のphpファイル(WordPress自身のphpファイル)に、ob_clean関数やob_end_clean関数を入れるやり方を見かけた気がしますが、WordPress自身のphpファイルに手を入れるのは、極力控えた方が良いと思います。というのも、WordPressのアップグレード等で上書きされてしまうからです。比較的忘れがちだと思いますので。
注意しましょう!