ある日、自分のWordPressブログのRSSフィードを開いたら、いきなり真っ赤な文字で「XML パースエラー: 実体の初めに XML またはテキスト宣言がありません」と表示されて、思わず「えっ、何もしてないのに!」と固まってしまった。そんな経験、ありませんか。
Web制作を長くやってきましたが、このエラーには昔も今も何度かやられてきました。原因が分かってしまえば拍子抜けするほど単純なのに、知らないとどこを直せばいいのかさっぱり見当がつかない。そういう、ちょっと意地悪なタイプのエラーなんですよね。
この記事では、WordPressのRSSフィードで起きるXMLパースエラーについて、その正体と原因、そして具体的な直し方を初心者の方にも分かるようにやさしく解説していきます。
結論から先にお伝えしておくと、このエラーのほとんどは「ファイルのどこかに余計な空白や空行、見えない文字がまぎれ込んでいる」ことが原因です。ウイルスでもなければ、あなたの設定が根本的に間違っているわけでもありません。だから、必要以上に身構えなくて大丈夫です。むしろ、原因のパターンがある程度決まっているぶん、コツさえつかめば落ち着いて対処できるエラーだと言えます。
ちなみにこのエラー、WordPressがブロックエディタ中心の今の時代になっても、相変わらず顔を出します。見た目の編集環境がどれだけ進化しても、土台のPHPやXMLの仕組みは大きく変わっていないからです。つまり、ここでお伝えする直し方は昔も今もそのまま通用する、いわば普遍的な対処法でもあるんですね。
とはいえ「見えない文字が悪さをしている」と言われても、初めて聞く方はピンと来ないと思います。そこでこの記事では、まずエラーの仕組みをかみ砕いて説明し、そのうえで「どのファイルの、どこを、どう確認すればいいか」を順番に追っていきます。一つずつチェックしていけば、たいていの場合はちゃんと解決にたどり着けます。専門用語もできるだけ噛み砕いてお伝えするので、PHPファイルをまだ触ったことがない方でも置いていかれないはずです。
そもそもXMLパースエラーとは何なのか
まずは敵の正体を知るところから始めましょう。「パース」という言葉は、ざっくり言えば「コンピューターがデータを読み解く作業」のことです。XMLパースエラーとは、その読み解きの途中でデータの形式におかしな点が見つかり、「これ以上ちゃんと読めません」とプログラムが音を上げてしまった状態を指します。
RSSフィードというのは、ブログの新着記事の一覧を配信するための仕組みで、その中身はXMLという厳格なルールで書かれた文書です。このXMLには「先頭は必ず宣言文(<?xml … ?>)から始める」という決まりがあります。ところが、その宣言文より前に空白や空行が一文字でもまぎれ込むと、ルール違反とみなされてパースエラーになってしまうのです。
「実体の初めに XML またはテキスト宣言がありません」という一見ややこしいメッセージも、要するに「いちばん最初に来るはずの宣言文が、先頭にいませんよ」と言っているだけなんですね。なんだか几帳面な受付係に「順番が違います!」と突き返されているような気分になります。
実際、W3Cが提供しているフィードの検証ツールでも、この問題は「フィードに余分な空白が入っている」ことが原因だと明記されています。XMLの世界では、人間の目には見えないたった一個のスペースや改行が、致命傷になり得るというわけです。
参考: W3C Feed Validation Service
関連記事:複数WordPressブログのRSSを取得して新着投稿を日付順に一覧表示する方法
よくある原因をざっくり整理
原因はいくつかありますが、突き詰めると「本来出力されてはいけない場所に、よけいな文字が出力されている」という一点に集約されます。代表的なものを挙げてみます。
- テーマの
functions.phpの、PHPタグの外側に空白や空行が残っている。 - 導入しているプラグインが、フィードの先頭によけいな出力を吐き出している。
wp-config.phpの終了タグ?>のあとに、空白や改行が紛れ込んでいる。- ファイルを保存したときに、先頭に「BOM」という見えない文字が付いてしまっている。
最後のBOMは初心者の方には聞き慣れない言葉だと思いますが、これがなかなかの曲者です。後ほどきちんと触れますので、まずは「そういうやつもいるんだな」くらいに覚えておいてください。
XMLパースエラーの解決手順
ここで紹介する順番どおりに確認していけば、ほとんどのケースで原因にたどり着けます。慌てて全部いじるのではなく、上から順に落ち着いて進めるのがコツです。
なお、これから紹介する作業ではPHPファイルを編集します。万が一に備えて、編集する前のファイルは必ずバックアップを取っておきましょう。元に戻せる状態を作っておけば、間違えてもすぐにやり直せます。
手順1:すべてのプラグインを一度止めてみる
まず手っ取り早いのが、プラグインの一斉停止です。フィードによけいな出力を加えている犯人がプラグインの中にいることは、わりとよくあります。
WordPressの管理画面から、すべてのプラグインをいったん無効化してみてください。その状態でRSSフィードを開き直し、エラーが消えていれば犯人はプラグインの中にいます。あとは一つずつ有効化しながらフィードを確認し、どのプラグインを戻したとたんにエラーが復活するかを見れば、犯人を特定できます。
地道な作業に思えますが、原因の切り分けとしては非常に確実な方法です。プラグインがシロだと分かれば、次のテーマファイルの調査に安心して進めます。
手順2:functions.phpの空白と空行をチェックする
プラグインが原因でなかった場合、いちばん疑わしいのがテーマのfunctions.phpです。実はこれは古くからある定番のトラブルで、WordPressの開発者向けの記録(Trac)にも「functions.phpの改行がRSSフィードのXMLを壊す」という報告が残っているほど、由緒正しい(?)原因です。
確認すべきポイントは二つあります。ファイルのいちばん先頭の<?phpより前に、スペースや空行が入っていないか。そして、ファイルの末尾に終了タグ?>がある場合、その後ろに空行や空白が残っていないか。この二箇所です。
PHPというのは、PHPタグの外側に書かれた文字をそのまま「出力」してしまう性質があります。つまりタグの外にうっかり残った空白や改行は、すべてのページやフィードの先頭にこっそり付いて回るのです。これがXMLの宣言文より前に出力されると、例のパースエラーが発生します。見つけたら、迷わず削除してしまいましょう。
関連記事:WordPressで特定ページにBasic認証をかける方法。functions.phpの使い方
手順3:wp-config.phpの末尾を見直す
次に確認したいのが、WordPressの土台ともいえるwp-config.phpです。ここもfunctions.phpと理屈はまったく同じで、終了タグ?>のあとに空白や改行が残っていると、それがフィードの先頭に漏れ出してエラーの引き金になります。
そして、これはWordPress公式の対処法でもあるのですが、純粋にPHPだけで構成されているファイルでは、末尾の終了タグ?>そのものを省略してしまうのがおすすめです。WordPressのコーディング規約でも「ファイル末尾の終了タグは省略するのが望ましい」と明記されています。
終了タグを消してしまえば、そのあとに空白が紛れ込む余地がなくなります。つまり、トラブルの種を根元から摘み取れるわけですね。WordPress本体のwp-config-sample.phpに終了タグが付いていないのも、まさにこの理由からです。
参考: WordPress Developer Resources (PHP Coding Standards)
手順4:見えない文字「BOM」を疑う
ここまで確認しても直らないとき、最後に疑ってほしいのがBOM(バイトオーダーマーク)です。これはファイルの文字コードを示すために、保存時にファイルの先頭へ自動的に付与されることのある、目には見えない数バイトの文字です。
厄介なのは、エディタの画面上ではまったく見えないこと。空白も空行も無いように見えるのに、データとしては先頭に文字が居座っているので、XMLの宣言文より前に余計なものがある状態になり、パースエラーを引き起こします。「どう見ても空白なんて無いのに直らない」という場合は、このBOMが潜んでいる可能性が高いです。
対処法はシンプルで、ファイルを「BOMなしのUTF-8(UTF-8 without BOM)」という形式で保存し直すだけです。多くのテキストエディタには文字コードを指定して保存する機能があるので、該当するPHPファイルをこの形式で上書き保存してみてください。文字コードはサイト全体でUTF-8に統一しておくと、こうしたトラブルを避けやすくなります。
エラーの場所を効率よく突き止めるには
やみくもに探すのがつらいときは、ブラウザの開発者ツールや、先ほど紹介したW3Cのフィード検証ツールを活用しましょう。エラーが何行目で起きているか、どんな文字が余分なのかといった手がかりが得られれば、調査のスピードがぐっと上がります。手作業で全部を見比べるより、こうしたツールに当たりをつけてもらうほうが早く終わります。
まとめ:見えない一文字を制してフィードを取り戻そう
ここまで、WordPressのRSSフィードで起きるXMLパースエラーについて、その正体から具体的な直し方までを順を追って見てきました。最後に、要点をもう一度おさらいしておきます。
このエラーの正体は、XMLの宣言文より前にまぎれ込んだ「よけいな空白・空行・見えない文字」であり、その発生源を一つずつつぶしていけば、ほとんどの場合は解決できます。
あらためて、確認の流れを振り返ってみましょう。まずはプラグインを一斉に止めて原因を切り分け、シロならfunctions.phpの先頭と末尾の空白をチェック。次にwp-config.phpの終了タグまわりを見直し、可能なら終了タグそのものを省略する。それでも直らなければ、見えない刺客であるBOMを疑い、ファイルをBOMなしのUTF-8で保存し直す。原因の候補はこの四つにほぼ収まるので、この順番で当たれば取りこぼしは少ないはずです。
振り返ると、犯人はたいてい人間の目には見えないほんの数文字です。なんとも理不尽な気もしますが、裏を返せば「正しい場所を、正しい順番で確認する」だけで必ず仕留められる相手でもあります。一度この攻略法を身につけてしまえば、次に同じエラーに出くわしても、落ち着いて対処できるはずです。
日々の運用のなかでは、テーマやプラグインを更新したあとにフィードがちゃんと表示されるか軽く確認する習慣をつけておくと、トラブルを早めに見つけられます。それから、PHPファイルの末尾に終了タグを付けない、付けるなら後ろに空白を残さない、というクセを今のうちに身につけておくと、将来の自分がきっと助かります。
WeberNoteでは、これからもWordPress運用でつまずきやすいポイントを、私の実体験をまじえながら一つずつ解きほぐしていきます。今回のXMLパースエラーも、仕組みと確認の順番さえ押さえてしまえば、次に出くわしたときは「ああ、またこれか」と淡々と片づけられるはずです。フィードが正しく表示されれば、新着記事はこれまでどおり読者のもとへ届きます。地味なトラブルですが、放っておくと配信が止まってしまうので、気づいたタイミングで一つずつ確認してみてください。