Ribbit's works

SSGでサイト更新時に、サイトマップを自動的にGoogleに送信する

#JavaScript #Next.js
にメンテナンス済み
記事のトップ画像

ウェブサイトには定期的に Google のクローラーが巡回しに来ますが、その時にサイトマップの変更を確認することはないそうです。

Google では、サイトがクロールされるたびにサイトマップを確認することはありません。サイトマップの確認は最初に通知されたときのみであり、その後は変更が Google に通知された場合にのみ確認します。

サイトマップの作成と送信 | Google 検索セントラル

つまり、クロール頻度の設定とは別に、サイトマップの更新を Google に伝える必要があります。

一般的に更新を伝える方法として、robots.txt にサイトマップの場所を記述することが多いですが、この方法を使った場合、クロール時に更新を確認し、次回のクロールから更新分が反映されます。

クロール頻度を daily に設定していたとしても、初めて更新分がクロールされるのは翌日ということになります。

今回は SSG のビルドと同時に、サイトマップを送信し、最短で更新を伝える方法を紹介します。

ちなみに Google は、更新もしてないのに何度も送ってくるなとも言っていますので、この点には注意してください。

未変更のサイトマップについて、送信や通知を複数回行わないようにしてください。

サイトマップの作成と送信 | Google 検索セントラル

代理送信できてしまう時点でペナルティはないと思いますが、やる場合は自己責任でお願いします。

実行環境

このサイトは Astro.js を使って作成していますが、今回実装したのは以下の環境です。

SSGNext.js
デプロイVercel
ビルドコマンドbuild

サイトマップ送信プログラムの作成

送信には Node 標準のライブラリである https を使用します。

Google が用意しているサイトマップ送信用のアドレスに GET リクエストを送信します。

(() => {
  const https = require('https');

  const END_POINT = 'https://www.google.com/webmasters/sitemaps/ping';
  const SITEMAP_URLS = ['送信するサイトマップのURL', '複数ある場合(RSSやAtomなど)は複数指定'];

  for (const sitemap of SITEMAP_URLS) {
    https.get(`${END_POINT}?sitemap=${sitemap}`);
    console.log('🐦 Googleにサイトマップを送信しました', sitemap);
  }
})();

package.json の変更

次に先ほど作成したプログラムを、ビルドが完了した後に実行されるよう設定します。

ping-sitemap の部分を作成した js ファイル名に変更してください。

"scripts": {
  "build": "next build && node ping-sitemap",
}

これでデプロイ先でも、ビルドが完了する度にサイトマップが Google に送信されます。