XML Sitemap & Google Newsというプラグイン (WordPress)

XML Sitemap & Google Newsプラグイン 1

WordPress用のXMLサイトマップ出力用プラグインについてググると、定番のGoogle XML Sitemaps (XML Sitemaps)と共にXML Sitemap & Google Newsがヒットする。「がとらぼ」でも幾つか関連記事を書いている。が、Google XML Sitemapsプラグインは数年放置された後に2022年春にWordPress公式のプラグインリストから消え、すぐに復活したもののメンテナがシレッと替わっていて変な機能が追加した新バージョンをリリースして訝しく思った。そこで5月末のことだが「がとらぼ」ではXMLサイトマップ出力プラグインを乗り換えた。その後Google XML Sitemapsの変な機能に見えた部分は直ぐに修正され2022年7月現在は怪しさはほぼ無い感じ。メンテナは元々ころころ変わるプラグインだったし。結局、1ヶ月経たずにGoogle XML Sitemaps (XML Sitemaps)に戻すことになったのだが・・・

XMLサイトマップ出力用のプラグインを乗り換える前にXMLサイトマップを出力するときに何が求められるか整理してみた。

  • 記事が更新された際にそれを知らせたいという意味で更新日時のlastmodタグが出力されること。
  • 子サイトマップを出力できること。(単独サイトマップに全件URL掲載はイヤ)
  • 任意の記事やカテゴリをサイトマップから除外できること。
  • 静的/動的出力は問わず。

条件が多いわけではなく比較的皆が求めそうな条件だがWordPressのプラグインでXMLサイトマップ出力専用という条件で絞った上の条件に当てはまるのを探すと意外と少ないみたい。

WordPressのプラグイン検索のレビュー、日本語のWordPress関連のブログ、Twitterでサイトマップ関連のツイートを見たところ、XML Sitemap & Google Newsが比較的条件に合ってた。導入数もGoogle XML Sitemapsほどではないにしても多めで評判も良く?推す人が多いみたい。
そこで「がとらぼ」でもGoogle XML Sitemapsプラグインから乗り換えてみた。(2022年5月末〜6月の1ヶ月弱ほど)

XML Sitemap & Google Newsプラグイン 2
XML Sitemap & Google Newsプラグインの設定はWordPressのアドミンパネルの左列から「設定」「XMLサイトマップ」にある。設定可能な項目は多くないが「投稿」の子マップを年別/月別にする程度は自身のサイトに適切なものに変更する。「優先度」はGoogleさんは参考にしないようなのでどうでも良い。サイトによっては固定ページはサイトマップに含めないという選択もあるかも。

XML Sitemap & Google Newsプラグイン 3
サイトマップインデックス(親サイトマップ)をブラウザで表示してみる。URLは https://example.com/sitemap.xml のようなの。example.comは自身のウェブサイトのトップURLに読み替えてください。サイトマップインデックスなので、そこに並ぶのは子サイトマップのURL。例えば投稿記事を月別で子サイトマップに出力する設定であればこの画像のように月別で /sitemap-posttype-post.年4桁月2桁.xml というURLが並ぶ。2022年3月であれば、/sitemap-posttype-post.202203.xml になる。今回はこの2022年3月の子サイトマップのリンクをクリックしてみる。

XML Sitemap & Google Newsプラグイン 4
2022年3月に公開した「投稿」記事のページURLが並ぶ。XML Sitemap & Google Newsは標準で記事の更新日時(Last Modified)が付くのが嬉しい。
で、WordPressのテーマを弄っていない場合、WordPressの動作試験用と自作テーマのサンプル用に用意しているテストサイトで2022年3月に公開した記事の全件数は画像のように14個。

WordPressでウェブサイトを公開していて、記事が著しく増えたとき、特殊なカテゴリの記事を扱うことになったとき、年別や月別のアーカイブ一覧表示から特定のカテゴリーの記事は取り除きたいということは結構ある筈。WordPressでは通常とは違う抽出条件のフィルターを作成してテーマに仕込むことで簡単に実現できる。

WordPress-Path/wp-content/themes/使用中のテーマ/functions.php
function bny_custom_pre_get_posts( $query ) {
    if ( is_admin() || ! $query->is_main_query() ){
        return;
    }
     //↓アーカイブで特定のカテゴリー常にを除く場合は $query->is_archive() 月別/年別/日別/時間別アーカイブは$query->is_date()
    if ( $query->is_date() ) {
        $query->set('cat', '-5'); //←はカテゴリID 5を除外 複数はカンマで区切る 除外時はマイナスID、含める場合はマイナス無し
        //$query->set('posts_per_page', 16);
    }
}
add_action('pre_get_posts', 'bny_custom_pre_get_posts');

この例では年別/月別/日別/時間別のアーカイブリストからカテゴリID 5に含まれる投稿記事を除外する。
カテゴリ名やカテゴリのスラッグでは指定できないので注意。管理パネルの「投稿」→「カテゴリ」で、カテゴリの名前のリンクを取得するとそのリンクに含まれる「ID=(数字)」というのがそれ。
例: https://example.com/wp-admin/term.php?taxonomy=category&tag_ID=5&post_type=post・・・ ←この例だとID=5 なのでカテゴリIDは5ということ。

XML Sitemap & Google Newsプラグイン 5
テーマで年別/月別/日別/時間別アーカイブ一覧から特定のカテゴリの表示を除外したら、何故か「投稿」の月別子サイトマップからもそのカテゴリの記事のURLが消えてしまった。こんな挙動はGoogle XML SitemapsプラグインはもちろんWordPress標準のXMLサイトマップ出力機能でも発生しないのでXML Sitemap & Google Newsプラグインの考慮漏れと思われる。テーマをこれまでもこれからも一切イジらないと誓っているサイトオーナーさんであれば問題無いともいえるが、ウェブサイトを発展させたいと思ったらテーマにもいつか何処かに何らかの手を入れることもあるかと思うので、このような思わぬところで予想外の挙動をするというのは本当に困る。

XML Sitemap & Google Newsプラグイン 6
上の続きだが、月別の子サイトマップを出力するようにしていたとして、ある月のサイトマップに含まれる記事が全て除外対象のカテゴリであったとしたら、常識的にはその月の子サイトマップは空であるとかその月の子サイトマップ自体が「無い」ということになるだろう。
しかし、XML Sitemap & Google Newsプラグインの場合は、子サイトマップが空ではなくウェブサイトのトップページのURLが1つ含まれた状態になる。これは意味がわからなすぎる。

例えばGoogleのSearch Console (通称サチコ)にXMLサイトマップのURLを登録すると、インテックスサイトマップ(親サイトマップ)と子サイトマップを毎日かときどきかはサイトによるかもしれないが、とにかくしょっちゅうサイトマップを読みに来る。サイトマップ出力プラグインを変更するとサイトマップインデックスと子サイトマップのURLが変わることになる。(サイトマップインデックスはsitemap.xmlであることが多いのでこの場合は変わらないかも)
サイトマップのURLが変わった場合は、新しいサイトマップのURLが登録されてそのサイトマップを読みに来るが、旧サイトマップも暫くは読みに来る。暫くというのがいつまでかは不明だが「がとらぼ」ではサイトマップのURLが変わって1ヶ月後に旧サイトマップを読もうとロボットが来ていた。
WordPress標準のXMLサイトマップ出力機能を使うのをやめてXML Sitemap & Google Newsプラグインを導入する場合と、他のXMLサイトマップ出力プラグインからXML Sitemap & Google Newsプラグインに乗り換える場合を考えた。

XML Sitemap & Google Newsプラグイン 7
先ずは、WordPress標準のXMLサイトマップ出力機能からXML Sitemap & Google Newsプラグインに乗り換えた場合。
WordPress標準のXMLサイトマップ出力機能の投稿記事系の子サイトマップはwp-sitemap-posts-post-数字.xml。このURLはXML Sitemap & Google Newsプラグインでは使われない。アクセスされた場合はエラー404 (クリエストされたページが無い)になるので正常。

XML Sitemap & Google Newsプラグイン 8
Google XML SitemapsプラグインからXML Sitemap & Google Newsプラグインに乗り換えた場合。
Google XML Sitemapsプラグインの投稿系月別の子サイトマップのURLはsitemap-pt-post-年4桁-月2桁.xml。このURLはXML Sitemap & Google Newsプラグインでは使われない。なら、WordPress標準のXMLサイトマップの子サイトマップと同じくエラー404になるかと思いきやエラー500になる。これはサーバー内部エラーなのでちょっと問題。(次へ)

XML Sitemap & Google Newsプラグイン 9
不思議なことにGoogle XML SitemapsプラグインからXML Sitemap & Google Newsプラグインに乗り換えたサイトオーナーの多くが何故かこのサーバー内部エラーはGoogle XML Sitemapsプラグインの残骸か何かが悪さをしていると考えるみたい。(残骸なんて無いんだけど)
実は、XML Sitemap & Google Newsプラグインのバグで、/sitemap-○○.xmlというURLでアクセスされた場合、それがXML Sitemap & Google Newsプラグインが使っているURLでない場合は全てサーバー内部エラーになる。
画像では/sitemap-test.xmlをブラウザで表示しようとしたもの。XML Sitemap & Google Newsプラグインが出力するサイトマップのURLではないのでサーバー内部エラーになっている。

XML Sitemap & Google Newsプラグイン 9A
XML Sitemap & Google Newsプラグイン変更前のサイトマップをGoogleボットさんが読みに来ると内部サーバーエラーになるのだが、するとサチコに警告やエラーが表示される。サチコの警告やエラーって初心者ほど無視しているが、ベテランになるほど気にするようなので警告が来ると心がザワザワするのよね。実害はないけど。
ちなみに、このエラー2つはGoogle XML SitemapsプラグインのサイトマップのURLがXML Sitemap & Google Newsプラグインのバグでサーバー内部エラーになったものだが、Google XML Sitemapsプラグインに戻した後もかなりの長期間消えずに残るエラーになる。というのも、Google XML SitemapsプラグインのサイトマップはHTTPヘッダにnoindexを付けている(サイトマップとしては好ましい動作)のでGoogleさんが再評価に訪れてもnoindexを見て諦めてしまう。評価されないとエラーが解消したと判断して貰えないのでエラー状態が継続する。サイトマップは検索インデックスに登録するものではないのでエラーであり続けても問題はないけど気分は甚だ悪い。

XML Sitemap & Google Newsプラグイン 10
次は再現が難しくてどうすれが必ずこうなるというのが言えなくてもどかしいのだが、パーマリンクの変更とURLリライト周りで挙動がヘンになることがある。このときに発生する異常は実害があるといっても良いかもしれない。
この画像は正常時のサイトマップインデックス(親サイトマップ)。
含まれる子サイトマップのURLは/sitemap-○○.xmlという形式。

XML Sitemap & Google Newsプラグイン 11
パーマリンクを変更した際などに必ず発生するわけではないけどときどき異常になることがあるっぽい。異常が発生した場合は再度パーマリンクの設定をし直すなどで正常になるようだが、それまで異常は続くっぽい。パーマリンクの変更自体は頻度が低い、或いは変更なんかすることはないかもしれない。ただ、変更した場合にまさかサイトマップの出力が異常になることがあるとは普通は思わないから気付きにくいしやっかい。
異常時は、子サイトマップのURLは /?feed=sitemap-○○○ というものになる。これはXML Sitemap & Google Newsプラグインが出力するサイトマップの実身URLっぽいが、このURLが表示されてしまうのは問題。

XML Sitemap & Google Newsプラグイン 12
さらに、サイトマップインデックスから子サイトマップのリンクを開くと、リンクに含まれる年別/月別を指定するURLパラメータが何故か削られてしまう。つまり年別/月別の指定が外れたことになり、全期間/全件表示になる。この状態でブラウザのURL入力欄に年別/月別のURLパラメータを手入力で追加しても[Enter]でページ表示時点でやはりそのURLパラメータが削られるのでそういう処理になってるらしい。
完全に異常だがURLリライトルールに問題があるとこのような症状になると診断している。このリライトルールはApacheであれば.htaccessのものとかではなく、Wordpressのデータベースのwp_optionsテーブルにあるrewrite_rulesかもしれないし、プラグインが持っているものか或いは両方かも。

このプラグインのURLリライトルール更新の処理に問題があるっぽい。

最後のバグは必ず発生するとはかぎらないのでトラブル率は低いかもしれない。ウェブサーバがNginxで location / { try_files $uri $uri/ /index.php?$args; } が無い場合に発生しやすいが、この指定が無いとパーマリンクの変更でWordPressの記事表示関係のリンクがほぼ全滅になる筈。パーマリンクの変更は迂闊に行わない方が良いので、このエラーを発生させるために変更するのはオススメしません。

XML Sitemap & Google Newsプラグインは個別の投稿/固定ページの編集画面で「XMLサイトマップに含めない」や「優先度」を指定できます。このような指定の仕方なので容易に想像が付きますが、WordPressのデータベースの wp_postmeta テーブルに情報が書き込まれます。meta_keyカラムが _xmlsf_exclude (XMLサイトマップに含めない), _xmlsf_priority (優先度), _xmlsf_image_featured (アイキャッチ画像), 不明(添付画像)のレコードが書き込まれることになります。試した範囲ではXML Sitemap & Google Newsプラグインの無効化で_xmlsf_exclude以外が削除、XML Sitemap & Google Newsプラグインの削除(管理パネルのプラグインリストから削除をクリックした場合)で_xmlsf_excludeを含む全ての関連レコードが削除されるようです。ゴミデータを残さないので行儀は良いといえます。

ただし、wp_optionsテーブルには数個のゴミを残すので適宜削除しましょう。

ブログやツイッターで、何故それが良いのか褒める理由或いは少なからず存在する筈の問題点を説明無しにとにかく「○○がオススメです」って書かれているの見て、それを真に受けるのは止した方が良いというのがXML Sitemap & Google Newsプラグインを導入してみて思ったことです。

導入は簡単なので、小規模のウェブサイトで未来永劫テーマによるカスタマイズは行わないということであれば問題は表面化しないでしょうから導入してみるのが絶対ダメとは言いません。オススメはしませんが

関連記事: