OGP

リンクを貼ったときの見た目

SNS やチャットに URL を貼ると、タイトルと画像の付いたカードが出ることがあります。あれは相手のアプリが気を利かせているのではなく、こちらの HTML に書いてある情報を読んで組み立てています。この決まりを OGP と呼びます。Open Graph Protocol の略で、head に入れる meta タグの一種です。

何も書かないとカードは出ず、URL の文字列がそのまま残ります。fleama の商品を友達に送っても、何の商品か分かりません。

openGraph を metadata の中に書く

Next.js では、専用のタグを手書きするのではなく metadata の中に openGraph を書きます。

export const metadata = { title: "fleama", description: "使わなくなったものを、次の人へ", openGraph: { title: "fleama", description: "使わなくなったものを、次の人へ", type: "website", images: ["/og/default.png"], }, };

images は配列です。1枚しか使わないときでも配列で渡します。複数書けるのは、相手のアプリによって選ばれる枚が違うためです。type はページの種類で、サイトのトップなら website を入れておけば十分です。

商品ごとにカードを変える

generateMetadata の戻り値にも同じ openGraph を書けます。商品ごとに違う画像を返せば、商品カード風の見た目になります。

return { title: item.title + " | fleama", openGraph: { title: item.title, images: ["/og/" + item.id + ".png"], }, };

ここで気を付けたいのは、レイアウトとページの openGraph は項目ごとに混ざるのではなく、まるごと入れ替わることです。ページ側に openGraph を書いたら、そのページで出したいものはページ側に全部書きます。半分だけ書いてレイアウトの残りが効く、とはなりません。

演習

fleama 全体の OGP と、商品ごとの OGP の両方を設定します。

ヒント

app/items/[id]/page.tsx
layout.tsx
app/page.tsx
プレビュー

できているか

  • ルートレイアウトに openGraph を書いている
  • 商品ページにも openGraph を書いている
  • サイト共通の OGP 画像を指定している
  • OGP の種類を website にしている
  • 商品ページの OGP が商品ごとに変わる