Author

Web系ソフトウェアエンジニアを志望
開発記録や個人的な技術に対する思いを綴ります

FOCUS個人開発/設計
OSArch Linux+Omarchy
STACKTypeScript・Next.js
STATUS学習中 → 就活中

Vercelデプロイを検索結果に乗せるまで 2 - sitemap.tsの実装 -

tech

3分で読めます・1047文字

はじめに

今回は「Vercelデプロイを検索結果に乗せるまで」の第2回目です。
この記事では、Next.jsプロジェクトにおけるサイトマップの作り方について解説します。

サイトマップとは

検索エンジンやbot等クローラーに対して、このWebサイトがどんなページを持ってるかを示す地図

通常はXMLで出力されますが、Next.jsの場合app/sitemap.tsにWebサイト内のページ情報の配列を返すsitemap関数を記述するだけでOKです。

app/sitemap.tsのテンプレ

import { MetadataRoute } from "next";

export default function sitemap(): MetadataRoute.Sitemap {
  return [
    {
      url: `${process.env.NEXT_PUBLIC_SITE_URL}`,
      lastModified: new Date(),
      changeFrequency: "weekly",
      priority: 1,
    },
  ];
}

このブログの場合

以下のようになりました。

import { MetadataRoute } from "next";
import { getAllPostData } from "@/lib/post";
import userCategory from "@/user-category.json";

const categories = Object.keys(userCategory);

export const sitemap = async (): Promise<MetadataRoute.Sitemap> => {
  const baseUrl = process.env.NEXT_PUBLIC_SITE_URL ?? "http://localhost:3000";

  // 記事一覧を取得
  const posts = await getAllPostData();

  const postEntries = posts.map((post) => ({
    url: `${baseUrl}/blog/${post.category}/${post.slug}`,
    lastModified: post.updatedAt ?? post.createdAt,
    changeFrequency: "weekly" as const,
    priority: 0.8,
  }));

  const categoryEntries = categories.map((category) => ({
    url: `${baseUrl}/blog/${category}`,
    changeFrequency: "weekly" as const,
    priority: 0.8,
  }));
  return [
    { url: `${baseUrl}`, changeFrequency: "weekly", priority: 1 },
    { url: `${baseUrl}/about`, changeFrequency: "monthly", priority: 0.8 },
    ...categoryEntries,
    ...postEntries,
  ];
};

export default sitemap;

mapの中でだけ、changeFrequencyas constを付与しています。
これは、mapで定義されたときだけリテラル型ではなくstring型を返してしまうためです。

リテラル型についてはこちらの記事をどうぞ!

getAllPostData()は以下のオブジェクトの配列を返します。

export type PostData = {
  slug: string;
  title: string;
  createdAt: string;
  category: string;
  markdown: string;
  published: boolean;
  updatedAt?: string;
};

戻り値として、urlは必須ですが、その他はoptionalです。
というのもGoogle検索エンジンはprioritychangeFrequencyは無視しており、lastModifiedは正確である場合のみ読み取るからです

Google Search Consoleにsitemapを送信する

Google Search Consolehttps://<your-domain>/sitemap.xmlを送信しましょう。

URLプレフィックスを入力する

プロパティタイプの登録画面

URL プレフィックスhttps://<your-domain>/を入力します。

今回は当ブログのhttps://ryok73.dev/を入力しました。

確認状態をチェックしています。というダイアログが表示された後、所有権の確認に移ります。

所有権の確認

そのWebサイトの所有権を証明する必要があります。
方法は以下の5種類

  1. HTMLファイルのアップロード
  2. HTMLタグの埋め込み
  3. Googleアナリティクスアカウントでの設定
  4. Googleタグマネージャーでの設定
  5. DNSレコードの紐づけ

詳しくはSearch Console ヘルプ

今回は2 HTMLタグの埋め込みで所有権の確認を行います。

Vercelデプロイを検索結果に乗せるまで - metadataの実装 -へのリンクで紹介するmetadataオブジェクトにverificationプロパティを追加します。

export const metadata: Metadata = {
  ...,
  verification: {
    google: "<verification code>",
  },
};

"<verification code>"はHTMLタグとして画面に表示されるmetaタグのcontent=の文字列です。
<meta name="google-site-verification" content="verification code" />

その後、所有権の確認が完了すると設定ページへ遷移します。

サイトマップの登録

インデックス作成 > サイトマップ

sitemapの送信画面
新しいサイトマップの追加にてsitemap.xmlを入力して送信すると、登録完了です。

これで数日すれば、Googleのクローラーがあなたのページを見に来ることでしょう。

おわりに

複雑に見えますが、基本的にテンプレート通りに記述すれば簡単に実装できますね。
テンプレートに使用する関数もブログ構築時に作成してあったため、作業が少なくて済みました。

さて、次回はrobots.tsの設定を行います!

ヾ('ω'⊂ )))Σ≡サラバ!!