WordPressのGoogle XML Sitemapsプラグインとサイトマップ

2022年5月28日追記(この黄文字の段落):
Google XML Sitemapsプラグインは暫く更新が停まっていましたが2022年5月に新しいメンテナによって新バージョンがリリースされました。(公開停止になったというのはおそらく誤解かデマです。) サポート状態不透明さや追加された設定項目の怪しさなど信用できないかもしれません。代替となるプラグインがあるので乗り換えるのもアリだと思われます。XML Sitemap & Google Newsはお手軽さで乗り換え先としては有力な候補です。Google XML Sitemapsと異なりウェブサーバへの設定の追加なども必要ありません。(Google XML Sitemapsから代替プラグインに乗り換える場合はウェブサーバに追加したGoogle XML Sitemaps用の設定を削除してください)
ただし、XML Sitemap & Google Newsには重大な考慮漏れやバグがあります。WordPress本体とテーマのfunctions.phpを無改造で大人しく使っているサイトでは大きくは問題が起きないだろうと思われますがある程度ワチャワチャやってるサイトではバグによるヘンな挙動が許せないほど酷いかもしれません。

WordPressのGoogle XML Sitemaps (XML Sitemap Generator for WordPress)プラグイン。今回は何かとトラブルと誤解の多いこのプラグインについて。

この記事では2019年2月12日現在で最新のGoogle XML SitemapsプラグインのVer.4.1.0について書く。
バージョンついでで書くと、このプラグインもバージョンを重ねていろいろ変わっている。ここ数年の特に大きな変更はVer.4.0でサブサイトマップを出力するようになったこと。機能改善以外では、最近では2018年の1月(と12月)に脆弱性がが見つかって話題になった。少なくとも4.1.0(現在の最新版)以外の古いバージョンは使ってはいけない。
インターネットの情報を見ると何故か古いVer3.X.Xをにダウングレードして使うというバッドプラクティスがオススメ情報みたいな形で広まっているようだけど、ダメよ。おそらく元の情報が4系の初期のころに書かれたとかサブサイトマップの表示に必要なURLリライトの一手間を知らないまたはURLリライトができない環境向けなんだと思うけど、URLリライトが出来ない環境を除いてはv3系などは使わず最新版を使って下さい。URLリライトができない環境ならGoogle XML Sitemaps以外のURLリライト不要なプラグインを使うべき。

サイトマップはただのURLリスト

Google XML Sitemapsの仕事は基本的にはサイトマップを出力するだけ。最近は検索エンジンに通知する機能なども追加されてるみたいだけど、メインはあくまでサイトマップ。
サイトマップというのはウェブサイトによっては人間の閲覧者向けに記事一覧とかウェブサイトの構成を表示してくれるところもあるようだけど、今回のは主に検索エンジン向けのサイトマップで、XML(他形式もあり)で書かれたウェブサイト内のページのURL一覧のようなもの。XML形式ではそれぞれのページの最終更新時間や更新頻度や重要度も合わせて記載されるが、ぶっちゃけただのURLリスト。特にXML以外の例えばテキスト形式のサイトマップではURLしか書かない超単純リストだし。それがサイトマップ。全く謎技術じゃない。

そんな単純なリストを出力するだけ(ちょっと付加機能あり)のプラグインがGoogle XML Sitemaps。
それが正しく動かないという場合は、よくあるのは他のSEO系のプラグインにサイトマップ出力機能があってコンフリクトしてるとか、WordPressが最低限動く程度しかメモリが割り当てられてないのに他のたくさんのプラグインと共に動かしてメモリ不足だったりとか。他にもいろいろありそうなので「Google XML Sitemapsではトラブルは起きません」とは言わない。でも多くは利用する側の間違いか勘違いか無茶。

ページ数の膨大なウェブサイトのサイトマップを1つのリストに記載すると検索エンジンが膨大なURLの途中までしか読んでくれないかもしれないし、巨大なサイトマップの作成にはメモリが多く必要になるのでサイトマップを分割して出力することには意味がある。一応決まりとしては1つのサイトマップあたりの上限は5万URLでファイルサイズ50MBということになってるけど、大量に書かれていても何処まで読むかは検索エンジン次第。超巨大ウェブサイトでなくても基本分けろ。Google XML Sitemapsのv4系では投稿記事と固定記事(と他フォーマットも)をそれぞれ月別で分割するみたい。メインのサイトマップにはサブサイトマップの在り処を書かなくてはならないけど、他にはどのようにサイトマップを分けるかという決まりは無いので月別にしなければならないというわけではないがGoogle XML Sitemapsではそうやってるというだけ。

Google XML Sitemapsプラグインの設定

Google XML Sitemapsプラグインのインストールは省略。
Google XML Sitemapsの設定はWordPressの管理画面のメニューから[設定]→[XML Sitemap]にある。

Google XML Sitemaps 1
XML Sitemapsの画面。
XML Sitemapsv4系では上の画像の赤枠のところにURLリライト設定の追加が必要な旨が書かれている。英語と意味不明な文字が並んでるようにしか見えない人は意味が解らなくて読み飛ばすみたいだけどダメよ。
これを無視するとメインのsitemap.xmlは出力されるがサブサイトマップは(出力はしていても)表示されないことになる。 そうすると当然検索エンジンがサブサイトマップを見ることができないので、サイトマップを使ってクロールされる筈の分がインデックスされないことになる。これはGoogleのSearch Consoleを使ってたら(そのうち)警告が来るので判ると思うけど。

赤枠の部分に書かれているコードはApache用なので多くのレンタルサーバではそのまま使える筈。WordPressのトップディレクトリと同じ階層にある.htaccessファイルに追記するだけ。無ければファイルを作成。WordPressをサブディレクトリに置いてる場合は書かれていることをよく見て必要に応じて適切に変更。

Apache用の例 (プラグイン設定画面に書かれてるまま)
1
2
3
4
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^sitemap(-+([a-zA-Z0-9_-]+))?\.xml(\.gz)?$ /sitemap$1.xml$2 [L]
</IfModule>
(上のコードがそのまま使えるとは限りません。)
使っているHTTPサーバがApache以外ならそれ用に書き換える。現在は稼働中のウェブサーバに応じたコードが表示されるのでそのまま使えることが多い。Nginx用の例 (次)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name www.example.com;

    #WordPressホスト用の設定 ホゲホゲ (省略)

    #Google XML Sitemaps用設定 (4行挿入)
    rewrite ^/sitemap(-+([a-zA-Z0-9_-]+))?\.xml$ "/index.php?xml_sitemap=params=$2" last;
    rewrite ^/sitemap(-+([a-zA-Z0-9_-]+))?\.xml\.gz$ "/index.php?xml_sitemap=params=$2;zip=true" last;
    rewrite ^/sitemap(-+([a-zA-Z0-9_-]+))?\.html$ "/index.php?xml_sitemap=params=$2;html=true" last;
    rewrite ^/sitemap(-+([a-zA-Z0-9_-]+))?\.html.gz$ "/index.php?xml_sitemap=params=$2;html=true;zip=true" last;
}
(上のコードがそのまま使えるとは限りません。)

Apacheの.htaccessなら書き込めばその設定がすぐ有効だがApacheの.htaccessではない設定ファイルに書いたとか上のNginxの設定を書いたという場合はHTTPサーバの再起動か設定再読込が必要。

Google XML Sitemaps 2
Google XML Sitemapsの設定画面に戻り下にスクロールする。
画像中にメモを書いたが、画像に見えている部分の設定は「変更する必要無し」と言いたかった。
「基本的な設定」の部分は環境に合わせて、または自分の好みで変更。
設定を変更したなら一番下までスクロールして[設定を更新]ボタンを押す。

サイトマップを表示する

Google XML Sitemaps 3
サイトマップは基本的にはウェブサイトのトップディレクトリに置くことになっている。サブディレクトリに置いた場合はそのサイトマップには別のディレクトリのページのURLは含めてはいけないということになっている。含めてもクロールはしてくれないらしいのでインデックスに登録されないということになる。(ここまで数行は手動設置の場合)
Google XML Sitemapsではウェブサイトのトップディレクトリにsitemap.xmlが置かれて(仮想だけど)、そのメインサイトマップにサブサイトマップのURLが書かれる形となる。自動で行われるのであまり気にしない。
つまり、http://example.com/sitemap.xmlをブラウザで開けば(メインの)サイトマップが表示される。 なんか綺麗に見えるリストだが、最近のブラウザでは右クリックでそのページのソースを表示できる筈なのでソース(XML)を表示して見て欲しい。(次)

Google XML Sitemaps 4
これがXMLで書かれたサイトマップ。
で、上の画像の赤枠の部分を確認して欲しい。正しくGoogle XML Sitemapsが出力したサイトマップであれば赤枠部分のように、Google XML Sitemapsプラグインの作者のウェブサイトのURLである http://www.arnebrachhold.de と、プラグインのバージョン (上の画像では4.1.0)がある筈。さらにサイトマップの出力日時も何日も何週間も何ヶ月も前でないこと。今日プラグインを初めてインストールしたなら今日付け。
これはメインのサイトマッブなので<sitemap>〜</sitemap>という形式でサブサイトマップの在り処が書かれている。

Google XML Sitemaps 5
そのメインのサイトマップを一番下までスクロールする。上の画像の赤枠の緑字の部分(表示するブラウザによっては緑とは限らない)に出力のための処理時間や使用したメモリの量が表示されていて警告だとかエラーが発生していなければ、メインのサイトマップは正しく出力されていると思って良い。

Google XML Sitemaps 6
ソースを閉じて綺麗なリストの方から月別のサブサイトマップの1つ(1行)をクリックする。
これがサブサイトマップの例。一見メインのサイトマップとそんなに変わらない。さきほどと同様に右クリックしてソースを表示する。
ここで、サブサイトマップが表示されずにerror404になるとかWordPressの(トップ)ページ等が表示される場合はURLリライトの設定が間違っているかURLリライトが機能していない。とにかく要対応。

Google XML Sitemaps 7
サブサイトマップのXML。先程と同様にプラグインの作者のウェブサイトのURLがあってバージョンが正しいこと。さらに一番下に(スクロールして)出力処理時間などが表示されていてエラーが無いことを確認する。
このサイトマップに書かれているのは記事のURLなので<url>〜</url>という形式になっている。

ここまで問題無いようであれば、GoogleのSearch Consoleに登録する。

Google XML Sitemaps 8
Search Consoleの新しい方
左列のメニューで[サイトマップ]を選択し、右列で「新しいサイトマップの登録」を行う。基本的にはsitemap.xmlと入力して[送信]を押すだけ。
サイトマップの送信はすぐに出来ている筈だが、数日置いてから確認する。ステータスが「成功しました」になること。上の画像には表示されていないがステータス表示の右の方に検出されたURLの件数(サイトマップからGoogleに認識されたURLの数)も出る。
これだけ。

Google XML Sitemaps 9
Search Consoleの古い方(旧ウェブマスターツール)
すでに新しいSearch Consoleを使っているならこちらを使う必要はない。ただ、今も使えるというだけ。
左列のメニューで[クロール]、[サイトマップ]を選ぶ。
右列の[サイトマップ追加テスト]ボタンを押して sitemap.xml を入力して登録する。
登録はすぐに行われる筈だが、確認は後日。確認するのは「送信」されたURL数。ここがいつまで経ってもサイトマップに含まれるURL数に遠く及ばないなら「嫌だね」レベル。サイトマップに何か問題があれば下の方に何かの警告が出る。警告が無いならまだ全て処理されていないと思われる。
「インデックスに登録済」の数をやたら気にする人がいるが、こちらはサイトマップで通知されたURLをさらに後日に全然別処理のクローラーがページ取得に来て、それが検索のインデックスに登録されてはじめて数に入るもの。数日で全て登録されればラッキーで、(全て|殆ど)が登録されるまで数週間とかもザラ。また、サイトマップの送信数とインデックス登録数は必ずイコールになるわけではない。

Google XML Sitemaps 10
警告がある場合。
「警告数」をクリックすると上の画像のように警告の内容が表示される。
この画像の場合だと、「サイトマップエラー」で「URLにアクセスできません」となっているが、実際にはサイトマップ(サブサイトマップ)にアクセスできないというのではなく、サイトマップ(サブサイトマップ)に記載されているURLの1つまたは複数にアクセスしようとしたら失敗したというもの。この画像の例では2015年4月のサブサイトマップに書かれているURLの1つにアクセスできなかったというもの。で、このアクセス失敗は自分のサーバー側が正常であってもときどき発生する。クローラー側の問題であったり通信経路の問題であったり本当にたまたまであったり。なのでアクセス失敗の1つ2つなら全然心配する必要無し。

Search Consoleを使うならこれだけはおぼえる

Googleはすぐにやってくれない

それでもトラブッた場合

Google XML Sitemaps 11
Google XML Sitemapsプラグインでトラブりやすい部分がこのプラグインの設定画面の「基本的な設定」の中にある「HTML形式でのサイトマップを含める」という項目。
上の画像ではPHPのモジュール不足で項目自体が有効化されていないが、この機能が使える状態でチェックが入っているとトラブるみたい。

「HTML形式でのサイトマップを含める」のチェックは外す。

2022年12月13日追記: ↑なぜHTML形式のサイトマップを含めてはいけないのか。
HTML形式のサイトマップを含める状態にするとサイトマップインデックス(/sitemap.xml)に含まれる「その他系」の子サイトマップ(/sitemap-misc.xml)の中に/sitemap.htmlというHTML形式のサイトマップが含まれます。(この意味不明な動作がトラブルの元凶です)
このsitemap.htmlはサイトマップなのでインデックス登録させる意味はありませんしコンテンツとしての価値がないのでインデックス登録させようとしてはいけません。そこでXML Sitemapsプラグインは親切にもindex.htmlのHTTPヘッダでnoindex指定してくれています。これは正しい動作です。
しかし、検索エンジンにページURLの存在を知らせインデックス登録をリクエストする意味もあるXMLサイトマップにインデックス登録を拒むHTMLページのURLを含めてしまっていることになります。
この結果、「XMLサイトマップに載ってたURLのページをインデックス登録しようとしたらnoindexで拒まれましたよ(この矛盾したリクエストはなに?)」というのがSearch Consoleに出るエラーです。
HTML形式のサイトマップなんか全く必要ないので「HTML形式でのサイトマップを含める」のチェックは外しましょう、ということです。
すごい放置してからの追記ですみません。

環境依存なので基本的には問題ないと思われるが、「Try to automatically compress the sitemap if the requesting client supports it.」の項目。この項目にチェックが入っているとsitemap.xmlと共に圧縮形式のsitemap.xml.gzが出力される。また、gzip対応のクローラー・ブラウザでsitemap.xmlのURLにアクセスするとsitemap.xml.gzを渡す仕組みが含まれる。このどこかで問題がある環境(サーバー)があるみたい。正しくないサイトマップが出力されるならこのオプションのチェックを外す。
また、チェックを外さないでSearchConsoleにsitemap.xml.gzのURLを登録すると上手くいったという情報があります。sitemap.xmlを取得しようとしたときHTTPヘッダや内容には問題がないので何故このような症状が発生するのかよくわかりせん。ウェブサーバの応答が遅いから?

関連記事: