Ribbit's works

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

#JavaScript#Next.js公開 2022-03-11
記事のトップ画像

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

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

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

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

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

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

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

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

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

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

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

実行環境

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

SSG Next.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に送信されます。