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サイトマップも十分に使えるものになります。既成のプラグインの変なバグにも悩まされず、修正待ちでイライラさせられることもありません。

関連記事: