wordpressプラグインの”All in One SEO”が生成したsitemap.xmlが知らない内にエラーになっていました。以前は問題無かったのですが・・。ネットで調べれば直ぐ分るだろうと思っていたのですが、散々調べ、推奨対策も全て対処したんですが結局解決せず。そうこうするうちに、やっと原因が分かり対処も済んだので、参考になればと思い投稿します。
もくじ
1.sitemap生成異常とは
“All in One SEO”のXMLサイトマップより、サイトマップ表示をクリックすると、以下の画面となってしまいます。以下は、cromeでの表示ですが、ブラウザ毎にエラー表示が異なるようです。メッセージ内容はxml宣言が先頭に無いとあります。
正しくは、このようにサイト一覧が出なくてはダメです。
2.原因をネットで検索
実に沢山ヒットしました。多いものから順に並べてみましょう。
(1)子テーマ内 functions.phpの空行
多くの方が子テーマを設定し、functions.phpを用意していると思います。空行が入っていると、この空行がsitemapの先頭に入ってしまい、有るべきxml宣言が認識出来ずにエラーになると言うもの。wordpressの仕様とのことで、対策はfunctions.phpの空行をデリートするしかありません。私も以前に、これで引っ掛かり、対策して治った経験があります。それで、今回も当然これだと思ってたんですが、違いました。
(2)親テーマ内functions.phpの空行
これもあるようで、そもそも親テーマからダメだったと言うことです。対策も当然ながら空行のデリートです。
(3)親テーマ内functions.phpに ?> 記述漏れ
最終行に ?> が無くてもphpは正常動作してしまうが、sitemap生成時の子テーマとの連結等で欠陥が出てしまうのだと思います。?> を入れたら、一発で治ったと言う記事がありました。
(4)Google XML Sitemaps のversion下げろ
ver.4.0以降で仕様が変わり、従来は「https://ドメイン/sitemap.xml」にサイトマップを生成していたんですが、動的生成となり、具体的には「https://ドメイン/index.php?xml_sitemap=params=」に変更されたようです。従来のファイルが残り、変更が有効にならなかったようで、混乱期には良く分からないので、version下げろとなったようです。これは、今更の対策となってしまいます。当然ながら、この対策はありません。
(5)プラグインの輻輳
プラグインを順に無効化して、sitemap生成に支障を来しているプラグインを削除する。直接原因は良く分からないが、プラグインとはそもそも、そう言うものなので相性の悪いプラグインを排除する。この対策が有効だったと言う報告は意外と多かったです。
(6)ob_end_clean();の追加
特定ファイルの出力バッファを強制クリアすると言う対策もありました。サーバー環境に依存してエラーが出ているケースには有効だったようです。
(7)その他
殆どが(1)~(6)の対策で解決するのですが、それでもダメな時は最後の手段として、原因が分からない場合の強制的空行削除ステップの組み込み。など、いくつかのその他対策もありました。
3.結局私の場合は?
上記の何れでもなかったんです。
sitemap.xmlのxml宣言が先頭に無いとは具体的にどのようになっているのでしょうか?ソースを見て見ました。
先頭に ? が入っています。2章のものは全て空白行が入るものでした。しかし、私の場合は ? が1文字挿入されています。さて、新手の原因と対策が必要なようです。
4.原因を切り分け
さて、新手の原因と言うことであれば、腹を据えて切り分けするしかありません。
(1)ecサイトプラグインwelcartのverをダウン
ここ1ケ月位での環境変化を疑ってみます。先ず一番怪しいのが、2週間程前にversion upしたwelcartです。早速、戻してみます。白でした。
(2)phpのver変更
wordpressも1カ月程前にアップしています。こちらはレンタルサーバー会社の仕様にもよるのですが、戻すのが面倒なので後回しにして、phpのversionとの相性を疑って、一通りのversionを確かめてみました。しかし、これも白でした。
(3)子テーマfunctions.php削除
action hook と filter hook を20程入れてるので、やはりfunctions.phpが怪しい。切り分けようと、hookを半分づづ削除していったら、結局、全部削除しても変わらず。ここは勢いで、functions.phpファイルを削除したら、何とsitemap.xmlが正常表示されてしまった。しかし、functions.php無しでは困るので、対策にならない。
(4)子テーマfunctions.phpのUTF-8N変更
子テーマfunctions.phpのhookを親テーマfunctions.phpに付け、子テーマstyle.css側に親テーマstyle.css継承を記述すれば良いかなどと邪道を考えたりしている最中、ふと、先頭に ? が付いてるのはBOMではないかと気付き、UTF-8Nに変更。図星でした。今まで何だったんだと言う感じ。もっと早くに気付くべきでした。
ところで、前は問題無かったのに、どうしてエラーが出るようになったのでしょう。wordpressのversionのような気がしますが、定かではありません。試してみれば良いのですが、解決したし、今更切り分けたところで何のメリットも無いので、不問としています。
5.まとめ
wordpressのsitemap.xmlエラーは色んな原因があるようです。この現象が出た方は、やはり考えうる原因を片っ端に確認して行くしかありません。上記の2章を参考にして下さい。そして、今回の私の原因も一つ加えて頂きたいと思います。