WordPressの標準XMLサイトマップ機能にnoindexとPing送信の追加

メニューと注文
©いらすとや.

WordPressはバージョン5.5からXMLサイトマップの出力機能が含まれるようになった。(コアXMLサイトマップ)
このXMLサイトマップ出力機能は初期値で有効なので他のXMLサイトマッププラグインなどを使わなくても良い。と、いいたいところだだけど機能がお粗末なので標準状態ではちょっと使いたくないという意見が多数。ただ、コードを足してやれば実はソコソコなサイトマップを出せるようになるので、素性が判らなくてお粗末なプラグインを使うくらいならこのコアXMLサイトマップの方がマシかもしれない。
ここまで前回と同じ。

で、Lastmodを付けるとか子サイトマップに含めるURL数を調整するとか除外カテゴリや除外記事の指定などは情報が出回ってるので割愛して、この記事では2つほど機能を足すことにする。検索検定6級のへっぽこがググったところ見当たらなかったので自作した一応オリジナルのやり方。スマートでなかったり動作が怪しかったりするかもしれません。

noindexヘッダの出力

XMLサイトマップは基本的に検索エンジンに見てもらうための「お品書き」。私のサイトにはこんな記事がありますよというURLの一覧表。これは人間が見るコンテンツではないので検索インデックスに登録されては困る。ググったらXMLサイトマップが検索結果に出たというのはダメ。また、ただのURLの羅列でしかないのでコンテンツとしての価値がない。ということはインデックス登録されると理屈的にはサイト全体の価値を下げる可能性があるかもしれない。(実際にはほぼないとは思うけど)
そこで、XMLサイトマップはHTTPヘッダ(HTMLヘッダではない)に「インデックス登録しないで下さい」という意味で「x-robots-tag: noindex」を付ける方が良さそう。WordPress用のXML出力プラグインだと一部の気の利いたものは自動でこのヘッダを付けてくれるがWordPressの標準XMLサイトマップ出力機能はもちろん付けてくれない。そこで以下。

WORDPRESSの在り処/wp-content/themes/使用中のテーマ/functions.php (最後に追加)
1
2
3
4
5
6
7
8
9
//コアXMLサイトマップでHTTPヘッダにx-robots-tag: noindexを付ける
function bny_sitemap_noindex($wp_sitemaps) {
    header( 'X-Robots-Tag: noindex');
    return $wp_sitemaps;
}
add_filter( 'wp_sitemaps_index_entry', 'bny_sitemap_noindex'); //サイトマップインデックス(親サイトマップ)
add_filter( 'wp_sitemaps_posts_entry', 'bny_sitemap_noindex'); //投稿の子サイトマップ
add_filter( 'wp_sitemaps_taxonomies_entry', 'bny_sitemap_noindex'); //カテゴリやタグの子サイトマップ
add_filter( 'wp_sitemaps_users_entry', 'bny_sitemap_noindex'); //ユーザーの子サイトマップ
$ curl -I https://example.com/wp-sitemap.xml
HTTP/2 200 
server: nginx
date: Sun, 23 Oct 2022 14:12:04 GMT
content-type: application/xml; charset=UTF-8
x-robots-tag: noindex
strict-transport-security: max-age=31536000;

LinuxやmacOS、Windows 10以降(コマンドプロンプト)であればcurlが使えるので確認はカンタン。
curl -I https://example.com/wp-sitemap.xmlのように1行入力するだけ。
HTTPレスポンスヘッダを確認する。黄色で強調した行(もちろん実際は黄色ではない)が出力されていれば成功。
HTMLヘッダではないのでブラウザで「ソース」を見ても表示されない。

noindexがHTTPヘッダにあることをChromeブラウザで確認
宗教上の理由などでどうしてもターミナルやコマンドプロンプトでコマンドを打つということができないならブラウザでも確認はできる。面倒だけど。

Chromeブラウザでの確認方法:
  1. URL入力欄に確認したいサイトマップのURLを入力してサイトマップを表示する
  2. [F12]を押してデベロッパーツールを開く
  3. 「ネットワーク」タブを選択する
  4. [Ctrl]+[R]を押す(重要)
  5. サイトマップ ***.xmlを選択する
  6. 「ヘッダー」が表示されるのでスクロールして「レスポンスヘッダ」を確認する
  7. 「x-robots-tag: noindex」があることを確認する
デベロッパーツールを閉じるのは再度[F12]

一部の人がSearch Consoleの「URLを検査」にXMLサイトマップのURLを入力して「インデックス登録をリクエスト」しようとしたらnoindexで登録できないと騒ぐことがあるけど、これはXMLサイトマップをインデックス登録させようというのが根本的に間違いなので勘違いなく。Google Search Consoleではメニューの「サイトマップ」からサイトマップを登録してください。Bing Webmaster Toolsでも同じです。

XMLサイトマップのPing送信

WordPress用のXMLサイトマップ出力プラグインの一部にはPing機能を搭載しているものがあります。もちろんWordPressのコアXMLサイトマップ出力機能にはありません。個人的にはこのPing機能には懐疑的なので「要らない」と思っていますが、搭載することがマイナスということでもないのであるならあっても良い筈。 IndexNowのように更新した記事のURLを送るわけではなく、WebSubのようにフィードを送るものでもなくサイトマップのPingはXMLサイトマップのURLを通知します。何を更新したかを伝えず「更新しました」の意味を伝えるもので、はっきりいって意味がない。記事が10個程度のサイトならサイトマップのURLを伝えるでも意味がないわけではなさそうだけどたとえば記事数10万のサイトで何か記事を1つ更新してサイトマップのURLを伝えたところで「どうしろと?」でしかない。

とはいえ、これは処理はめっちゃカンタン。Googleさんの「サイトマップの作成と送信」というドキュメントによると https://www.google.com/ping?sitemap=FULL_URL_OF_SITEMAP というURLにアクセスするだけ。なお、このURLはWordPress用では最も採用の多いXMLサイトマップ出力用プラグインのGoogle XML Sitemapsが使用するPing先URLとは異なります。(実際はエイリアスのようなものかもしれません)

WORDPRESSの在り処/wp-content/themes/使用中のテーマ/functions.php (最後に追加)
1
2
3
4
5
6
7
8
9
//記事の公開/更新時 GoogleにPingを送る
function bny_ping_hook() {
    //記事の公開/更新時 GoogleにPingを送る
    $pingurl = 'https://www.google.com/ping?sitemap=' . home_url('/') . 'wp-sitemap.xml';
    $res = @file_get_contents($pingurl, false, null);
    //echo $res;
}
add_action('publish_post', 'bny_ping_hook');
add_action('publish_page', 'bny_ping_hook');

これは、WordPressで「投稿」「固定記事」を公開したり更新したり(ステータスが変わったり)するとサイトマップインデックス(親サイトマップ)のURLをPing送信するものです。カンタンですね。
XMLサイトマップのURLをPing送信するのでサイトマップ関連ではありますが、サイトマップの機能そのものとは関係ありません。WordPressのGoogle XML SitemapsプラグインのPing送信機能同様に、サイトマップ出力機能と Ping送信機能は別物です。これを理解してなくて、「Ping送信が失敗してるからGoogle検索のインデックス登録ができない」とか騒ぐ人が結構多い。(2022年春以降、Google XML Sitemapプラグインは設定でGA_TIDの項目を埋めないとPing送信しなくなってるので)2022年12月リリースの4.1.7で修正済み

こんな感じでその他の既に出回っているコードも組み入れればWordPressのコアXMLサイトマップも十分に使えるものになります。既成のプラグインの変なバグにも悩まされず、修正待ちでイライラさせられることもありません。

関連記事:

WordPress標準のXMLサイトマップ出力機能をカンタン設定 XML Sitemaps Manager

道に迷う
©いらすとや.

WordPressはバージョン5.5からXMLサイトマップの出力機能が含まれるようになった。(コアXMLサイトマップ)
このXMLサイトマップ出力機能は初期値で有効なので他のXMLサイトマッププラグインなどを使わなくても良い。と、いいたいところだだけど機能がお粗末なので標準状態ではちょっと使いたくないという意見が多数。ただ、コードを足してやれば実はソコソコなサイトマップを出せるようになるので、素性が判らなくてお粗末なプラグインを使うくらいならこのコアXMLサイトマップの方がマシかもしれない。

とはいえ、「コードを足してやれば」の難易度がそれなりに高いのでWordPressが難しいと思ってる人やPHPのコードがただの謎の呪文にしか見えないような人にとってはまるで歯が立たない。コードを書き込むfunctions.phpファイルを壊してしまって途方に暮れる人も出そうだし。
と、思ってたら、そのコアXMLサイトマップをWordPressの管理パネルでカンタンに設定できるプラグインが出ていた。

XML Sitemaps ManagerでWordPressコアサイトマップを制御 1
WordPressの管理パネルのメニューから「プラグイン」をクリックする。
プラグインリストの上部にある「新規追加」をクリックする。

XML Sitemaps ManagerでWordPressコアサイトマップを制御 2
右上のプラグイン検索で「RabanH Sitemap」を入力する。
RavanHというのは今回インストールするプラグインの作者のアカウント名。理由がさっぱりわからないけど何故か日本では人気?なXML Sitemap & Google Newsプラグインと同じ作者でもある。
「XML Sitemaps Manager」が今回の目的のプラグイン。その、「今すぐインストール」をクリックする。

XML Sitemaps ManagerでWordPressコアサイトマップを制御 3
数秒でインストールが完了して「有効化」のボタンになるのでそれをクリックする。

XML Sitemaps ManagerでWordPressコアサイトマップを制御 4
プラグインリストに戻るので「XML Sitemaps Manager」行の下にある「設定」または、左列のメニューから「設定」→「表示設定」をクリックする。

XML Sitemaps ManagerでWordPressコアサイトマップを制御 5
「XML Sitemaps Manager」プラグインは専用の設定画面を持たず、WordPressの「表示設定」画面の下部にXMLサイトマップの設定が追加される。サイトマップに含める記事等の種類または含めない種類を適切に決める。これは、本来はテーマのfunctions.phpにコードを書いて設定するものだがチェックボックスに印を付ける(外す)だけの簡単設定になっている。
「ユーザー」の子サイトマップは要らないという判断することが多そう。要らないならチェックを外す。
「最終更新日」というのはlastmodという項目でサイトマップに記載される記事の公開日時/更新日時。WordPressのXMLサイトマップの初期値では表示されなくてテーマのfunctions.phpにコードを書いて表示できるようにするのだが、「XML Sitemaps Manager」ではチェックするだけ。もちろんチェックするのがオススメ。
「Maximum number of URLs」は1つの子サイトマップに最大で幾つまでの記事URLを含めるかの指定。WordPressのコアXMLサイトマップ機能の初期値は2000になっている。静的出力なら2000やもっと多くて良いかと思うが非力なウェブサーバでWordPressを動かしてて動的出力で2000は多すぎると思う。個人的には数百、多くて500程度が良いように思うが「XML Sitemaps Manager」では空白(初期値2000)または1000以上の数字を入力しないとダメらしい。この1000は根拠がある数字ではなくこのプラグインの作者が勝手に決めた下限値。ちょっとセンスを疑う。テーマのfunctions.phpにコードを書けば幾つでも好きな数値を設定できる。なお、「XML Sitemaps Manager」の設定値よりもテーマのfunctions.phpのコードが優先される(優先にできる)。
設定完了なら「設定を保存」を忘れずにクリックする。

XML Sitemaps ManagerでWordPressコアサイトマップを制御 6
WordPressのコアサイトマップのURLは https://example.com/wp-sitemap.xml (example.comは自身のサイトのドメインに読み替えてください)
wp-sitemap.xmlはサイトマップインデックス(親サイトマップ)で、このページにあるリンクがそれぞれ(子)サイトマップ。子サイトマップに何のURLを含めるかは任意で、他のXMLサイトマッププラグインだと年別/月別で子サイトマップを出力するのが多いようだが、WordPressのコアサイトマップは投稿/固定記事等のID順で指定したURL数で分割しているよう。上の画像ではwp-sitemap-posts-post-N.xmlというのが「投稿」の子サイトマップ。wp-sitemap-posts-page-N.xmlというのが「固定記事」の子サイトマップ。wp-sitemap-taxonomies-category-N.xmlが「カテゴリ」の子サイトマップ、wp-sitemap-taxonomies-post-tag-N.xmlが「タグ」の子サイトマップ。
子サイトマップは単純にURLとlastmod(公開日時/更新日時)が並ぶ。(画像無し)
サイトマップインデックス(親サイトマップ)では「投稿」や「固定記事」など最大数指定を超えたものは分割されて複数の子サイトマップ(記事群)になるが、「XML Sitemaps Manager」を使用すると一番上の1つだけに最新の公開/更新日時がつくようになっている。ところが、子サイトマップの並び順は古い記事群の子サイトマップが上で新しい記事軍が下なので一番上に最新の公開/更新日時が付いてしまうと常識的にはおかしなことになる。本来は各記事群(子サイトマップ)の中で最も新しい公開日/更新日を表示するものだと思う。他のXMLサイトマッププラグインではそのように処理している。記事の更新がほぼ無いようなサイトであれば1つ最新の公開/更新日時を表示しておけば処理が簡単で良かろうという合理的判断かもしれないが、それなら全ての子サイトマップに(同じ)最新の更新日時を付ければ良くない?コードを見るとわざわざ日時表示を外しているのでこれはバカらしいように思える。個人ブログで1000記事を超えるのは滅多にないだろうということかもしれない。それが含めるURLの下限を1000にしている本当の理由なのかしら?

せっかく管理パネルのUIで設定できるのに、除外対象に記事IDやカテゴリ/タグIDを指定できないのは何でかしら。この除外設定は比較的容易に実装できる筈なんだけど。小規模な個人ブログだと除外なんかしないだろうというお考えなのかな。

殆どはWordPressのコアXMLサイトマップの機能を呼び出してるだけ。同じ作者のXML Sitemap & Google Newsプラグインにも変な仕様や考慮漏れ(と多くのバグ)があるが、この「XML Sitemaps Manager」もやっぱり「何でこうなの?」「コレじゃない」という部分がある。設定を手書きでやらなくて良いので圧倒的にカンタンにはなってるけど惜しいかなというのが率直に思ったところ。

「がとらぼ」の中の人はプラグインをあまり使わない。この「XML Sitemaps Manager」プラグインも正直要らない。コードを見たところ個人的に有益に思った部分があったのでそこだけ頂いて自分でテーマのfunctions.phpに書くことにした。ついでにこのプラグインで触ってない部分も追加してより実用的に?
それは次の記事で。

関連記事:
Up