Next.js

generateMetadataの使い方:ページごとのtitle・description・OGPを生成する

この記事でわかること

generateMetadataで記事や商品のデータから検索結果向け情報とOGPを生成します。ページ本文との一致、metadataBase、サーバーでの実行を確認します。

generateMetadataで記事や商品のデータから検索結果向け情報とOGPを生成します。ページ本文との一致、metadataBase、サーバーでの実行を確認します。

対象環境と役割

App Routerで使う機能

この記事のApp Routerの例はNext.js 15以降の非同期リクエストAPIに合わせた書き方です。Next.js 16ではCache Componentsを有効にしない構成を前提とします。Pages Routerの記事とは配置先・実行場所が異なるため、プロジェクトのルーターとバージョンを先に確認してください。

TypeScriptの例は5.2以降と、利用するNext.jsが対応するNode.jsを前提にします。app/layout.tsx を備えたApp Routerプロジェクトで実行してください。

引数・戻り値・受け渡すデータ

params などを受け取り、Metadata 型のオブジェクトを返します。非同期関数なら Promise<Metadata> です。固定情報は metadata、動的情報は generateMetadata と役割を分けます。

コード例を動かす

app/items/[slug]/page.tsx を作成する

以下はこのファイルとして配置する例です。既存ファイルへ追記する場合は、同じ名前のexportやURLが重複しないように統合してください。

TSX
import type { Metadata } from 'next';
import { notFound } from 'next/navigation';
const items: Record<string, string> = { notebook: '学習ノート' };
type Props = { params: Promise<{ slug: string }> };
export function generateStaticParams() { return [{ slug: 'notebook' }]; }
export const dynamicParams = false;
export async function generateMetadata({ params }: Props): Promise<Metadata> {
  const { slug } = await params;
  const title = items[slug];
  if (!title) notFound();
  return { title, description: `${title}の使い方と特徴を紹介します。` };
}
export default async function Item({ params }: Props) {
  const { slug } = await params;
  return <main><h1>{items[slug]}</h1></main>;
}

実行結果と処理の順序

/items/notebook ではブラウザーのタイトルに「学習ノート」が入り、descriptionが生成されます。親layoutにtitleテンプレートがある場合は、その規約も適用されます。

実務では本文とメタデータが同じ商品を参照するように共通の取得処理へまとめます。OG画像のURLを追加する場合は、絶対URLまたは適切な metadataBase と組み合わせ、実際に画像が公開されているか確認します。

つまずきやすい点と使い分け

Client Componentではexportしない

この機能はサーバー側で使います。操作ボタンのためにページ全体へ use client を付けると衝突するため、操作部分を子コンポーネントへ分けます。

キーワードを詰め込まない

実際の本文にない情報や過大な説明を入れず、ページ固有の内容を短く表します。メタデータの設定だけで検索順位やAI検索への採用が保証されるわけではありません。

静的出力で使えるか

この例はビルド時に値を確定できるため静的出力に組み込めます。CMS更新などで値を変えた場合は再ビルド・再配置が必要です。

確認課題と実務への応用

自分で値を変えて確認する

タイトルを変更し、本文H1とheadのtitle/descriptionを比較します。OGPを加えたら、画像のHTTP応答とSNS側のキャッシュも分けて確認してください。

開発サーバーだけでなく、本番用ビルドと公開先でも確認します。URLを直接開く場合と画面内のリンクから遷移する場合、値がない場合と不正な値の場合を分けて試すと、型だけでは防げない入力の問題が見つかります。

公式資料と関連する記事

PREFERRED SOURCES

Googleの優先するニュース提供元にSEの部屋を追加

Googleで、いつも読みたい情報源を選べます。登録可否はGoogleの画面で確認できます。

Googleの設定画面で確認する 新しいタブで開きます

候補にSEの部屋が表示されない場合は、まだ追加できません。

y.
WRITTEN BY

y_ymo10

SEの部屋で、HTML・CSSからJavaScript・React・Next.jsまで、Web制作の開発ノートを公開しています。

ほかの開発ノートを読む →