Sitemap.xmlが読み込めない。「&」が含まれるとエラーになる。

ブログ運営

 記事をポストし、インデックスされるのが随分遅いと思い、調査をしていたら、どうやらsitemap.xmlのファイルの読み込みエラーが発生していました。sitemapがエラーになっていても、グーグルのクロールは、来てくれますが、sitemap.xmlの有無次第で、インデックスのスピードは違ってきます。

今回の記事では、sitemap.xmlがエラーになった原因と、どうやって対策したのかを、簡単ですがまとめてみました。対策としては、ある程度PHPとFTPの知識が無いと難しいかもしれません。

Sitemap.xmlの読み込みエラー

サーチコンソールでサイトマップ1件のエラー確認

 まず、1番最初に、気づいたのが、グーグルのサーチコンソールのサイトマップの画面です。サイトマップのところに、エラーと表記されていました。

 サイトマップは、正常に読み込めているが、構文エラーで、正常に処理できないとのことです。下にエラーの時の画像を添付しておきます。2024/01/03にサイトマップを読み込み成功しています。ステータスは1件のエラーになっています。

サイトマップエラー

ステータスのところをクリックすると、エラーの詳細が確認できます。内容は、「サイトマップは読み取り可能ですが、エラーがあります。」とのことです。詳細を見ると、「認識できないエントリが含まれている可能性」と記載されています。

おそらく、構文エラーで、サイトマップのルールに従った記述がされていなくて、正常に判断できないことがわかります。エラーとなっているsitemap.xmlのファイルを確認してみましょう。

サイトマップエラー

エラーの原因は、&アンパサンドの1文字

Sitemap.xmlを開いてみると、『this page contains the following errors』のエラーが出ています。正常であれば、xml形式の文字列が出てきます。

サイトマップのエラー詳細

 上のエラーを見てみると、xmlファイルの11行目の、64文字目がエラーの原因になっているようです。xmlファイルを覗いてみます。エラーになっている画面で、右クリックし、ソースファイルを見てみます。

WindowsのEdgeであれば、右クリックし、ページのソースを表示(Ctrl+U)で見ることができます。

htmlソースファイル見る

Sitemap.xmlのhtmlソースを見ることができます。指定された11行目の64文字目を見てみると、&(アンパサンド)が出力されています。

グーグルがサイトマップを読み込むときに、&は特殊な構文として認識するので、URLにもし含まれていたら「&」と記載する必要があります。もし&が裸のまま1文字でも混ざっていたら、読み込みに失敗してしまいます。

URLに&が含まれてしまうのは?なぜ?

今回、わたくしの体験談を説明しますと、3つの条件が揃っていたので発生してしまいました。

  • プラグインの「Contact Form 7」を使って、問い合わせフォームを作った
  • プラグインの「Google XML Sitemap」を使って、Sitemap.xmlを作った
  • WordPressのパーマリンクを数字設定にしていた

この条件が揃って、&の読み込みエラーが発生していました。2024年1月現在、プラグインは修正されていないので、どのような原因で発生したのかまとめてみたいと思います。

 まず、「Contact Form 7」を使って問い合わせのフォームを作成するのですが、実際の記事ページと同じものが作られるので、数字ベースの1記事ができます。そのページを、問い合わせの固定ページの方から読み込んで使うイメージです。呼び出す際に、URLに「form&p=567」といった記載で読み込まれます。サイトマップには、このままの文字列が書き出されてしまうので、グーグル側でSitemap.xmlを読み込むときに、&が含まれていてエラーが起きるのです。

 どのようにするかは、xmlファイルに書き込む際に、「form&P=567」と記載する必要があります。「&」を「&」に置換する処理が必要なのです。

FTPソフトを使って、サイトマップのファイルを書き換える

FTPソフトを使って、サーバをファイルをいじってみます。フリーのftttpソフトを使います。

/wp-content/plugins/google-xml-sitemapの中にある、google-xml-sitemap.phpを見つけます。見つけたら、PCにダウンロードします。上記の画像には、類似のファイルがありますが、変更前のファイルをバックアップとして、置いてあります。

google-xml-sitemap.phpのダウンロードが終わったら、実際にURLを書き込むところの処理を探してみます。

サイトマップのソースコード

locタグの中身を書き換えている部分を見つけました。いろいろな対処法がありますが一番手っ取り早いのは、置換処理をいれることです。(※ほかに良い方法があれば教えていただきたいです)

さっそく、置換処理を入れてみたいと思います。str_replace関数で1回読み込むだけで良いので簡単です。コピー&ペーストで十分です。変更は1行のみです。

      $xml .= "\t<url>\n";
      $xml .= "\t\t<loc>" . str_replace('&', '&amp;', get_permalink( $post->ID )) . "</loc>\n";
      $xml .= "\t\t<lastmod>" . mysql2date( 'Y-m-d\TH:i:s+00:00', $post->post_modified_gmt, false ) . "</lastmod>\n";
      $xml .= "\t\t<changefreq>" . 'weekly' . "</changefreq>\n";
      $xml .= "\t\t<priority>" . '0.8' . "</priority>\n";
      $xml .= "\t</url>\n";

変更したPHPファイルをアップロードし、サイトマップを読み込んでみましょう。

読み込みが正常にできていれば、xmlファイルの文字列が表示されます。ソースプログラムを確認してみると、&の置換処理が成功しています。

今回の修正の注意点としては、Google XML Sitemapのプラグインを更新するときに、また修正する必要があります。もしかしたら、次の更新で、不具合が解消される場合があります。

PHPファイルを修正する以外の方法は?

今回のわたくしのケースでは、パーマリンクを数字設定にしていましたので、数字ではなく,、投稿名にしていれば問題ないと思います。

パーマリンクを数字の場合は、全記事を修正するのは、困難だと思いますので、他の対処方法としては、プラグインの「Contact Form 7」を使わず、自作で問い合わせフォームを作る。もしくは、別のプラグインを使う方が良いでしょう。

もし自作で作るならPHPファイルで、htmlのフォーム画面と、メール送信処理(PHP)を作らなければなりません。

さいごに

今回は、簡単な応急処置なので、何かまた対策方法が見つかったら更新します。懸命なのは、プラグインのバージョンアップもしくは、自作で問い合わせフォームを作るのが良いのでしょう。

タイトルとURLをコピーしました