こんにちは、えふてぃです。
SEO対策シリーズの第2章として、今回は Meta タグとOGP設定 について実装してみた話をします。
前回の記事で「技術的SEO」の重要性について触れましたが、その中でも特に重要なのが、検索結果やSNSでのシェア時の見栄えを改善する Meta タグと OGP(Open Graph Protocol)の設定です。
この記事では、実際に私が Astro ブログに実装した内容を元に、コード例や試行錯誤のプロセスを交えながら解説していきます。
Meta タグと OGP って何?
まず最初に、「Meta タグ」と「OGP」について簡単に説明しておきます。
Meta タグとは
Meta タグは、HTMLの <head> 部分に記述する、ページの情報を示すタグのことです。
主に以下のような情報を記述します:
- タイトル(title): ページのタイトル
- ディスクリプション(description): ページの説明文
- キーワード(keywords): ページの関連キーワード(現在はあまり重要視されていない)
- ビューポート(viewport): レスポンシブデザイン用の設定
これらの情報は、Google などの検索エンジンがページを理解するために使われます。
OGP(Open Graph Protocol)とは
OGP は、Facebook が提唱した、SNS でシェアされた際のプレビュー表示を最適化するためのプロトコルです。
X(旧Twitter)や Facebook、LINE などでリンクをシェアした際に、タイトル・説明文・画像が適切に表示されるのは、この OGP のおかげです。
主な OGP タグ:
- og:title: シェア時に表示されるタイトル
- og:description: シェア時に表示される説明文
- og:image: シェア時に表示される画像
- og:url: ページのURL
- og:type: ページの種類(website、article など)
参考リンク:
なぜ Meta タグと OGP が重要なのか
1. 検索結果のクリック率に影響する
Google で検索した際、タイトルと説明文が表示されます。
ここで 魅力的なタイトルと説明文 があると、クリック率が上がります。
逆に、Meta タグを設定していないと、Google が勝手に本文から抜粋した文章を表示してしまい、意図しない内容が表示されることもあります。
2. SNS でのシェア時の見栄えが良くなる
OGP を設定していないと、SNS でシェアされた際に以下のような問題が起こります:
- タイトルがただの URL になる
- 画像が表示されない
- 説明文が表示されない
OGP を設定することで、タイトル・説明文・画像が適切に表示される ようになり、クリック率が大幅に向上します。
OGP を設定していないと、どう見えるの?
タイトルがただの URL文字列になり、画像も表示されません。見た目が地味になるので、クリックされにくくなります。
3. Google が正しくページを理解できる
Meta タグを正しく設定することで、Google がページの内容を正確に理解できるようになります。
これにより、適切な検索キーワードで上位表示される可能性が高まります。
Astro ブログに実装してみた
それでは、実際に Astro ブログで Meta タグと OGP を実装した手順を紹介します。
環境
- Astro: 4.x
- Node.js: 20.x
本記事は上記の環境で検証しています。
実装の流れ
実装は以下の流れで進めました:
- 共通の Meta タグを
BaseHead.astroに実装 - OGP タグを追加
- X(旧Twitter)Card の設定を追加
- 記事ごとに動的に Meta 情報を変更できるようにする
1. 共通の Meta タグを実装する
まず、すべてのページで共通して使う Meta タグを BaseHead.astro に実装しました。
---
// src/components/BaseHead.astro
import type { ImageMetadata } from 'astro';
import FallbackImage from '@/assets/common/default-ogp.png';
import { SITE_TITLE } from '@/consts';
interface Props {
title: string;
description: string;
image?: ImageMetadata;
}
const canonicalURL = new URL(Astro.url.pathname, Astro.site);
const { title, description, image = FallbackImage } = Astro.props;
---
<!-- 基本的な Meta タグ -->
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
<meta name="generator" content={Astro.generator} />
<!-- Canonical URL -->
<link rel="canonical" href={canonicalURL} />
<!-- Primary Meta Tags -->
<title>{title}</title>
<meta name="title" content={title} />
<meta name="description" content={description} />
<!-- Open Graph / Facebook -->
<meta property="og:type" content="website" />
<meta property="og:site_name" content={SITE_TITLE} />
<meta property="og:url" content={Astro.url} />
<meta property="og:title" content={title} />
<meta property="og:description" content={description} />
<meta property="og:image" content={new URL(image.src, Astro.site)} />
<!-- X (Twitter) -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:url" content={Astro.url} />
<meta name="twitter:title" content={title} />
<meta name="twitter:description" content={description} />
<meta name="twitter:image" content={new URL(image.src, Astro.site)} />
image はオプショナルにして、デフォルト画像を設定しておくと便利です。記事ごとに個別の画像を指定しない場合は、デフォルト画像が使われます。
画像の型について:
この実装では、画像を文字列パスではなく ImageMetadata 型で扱っています。これは Astro の画像最適化機能を活用するためです。
ImageMetadata 型を使うことで:
- 画像の最適化(自動リサイズ、フォーマット変換など)が適用される
- 型安全性が向上する
image.srcで画像のパスを取得できる
デフォルト画像は @/assets/common/default-ogp.png のように、プロジェクト内の画像ファイルをインポートして使用します。
2. レイアウトファイルで BaseHead を使う
次に、各ページのレイアウトファイルで BaseHead.astro を読み込みます。
---
// src/layouts/BlogPost.astro
import type { CollectionEntry } from 'astro:content';
import BaseHead from '@/components/BaseHead.astro';
type Props = CollectionEntry<'blog'>['data'];
const { title, description, pubDate, heroImage } = Astro.props;
---
<!doctype html>
<html lang="ja">
<head>
<BaseHead title={title} description={description} image={heroImage} />
</head>
<body>
<!-- 記事の内容 -->
</body>
</html>
3. 記事ごとに Meta 情報を指定する
各記事の Frontmatter で、Meta 情報を指定できるようにしました。
---
title: '【第2章】Meta タグとOGP設定でSNSシェアを最適化!Astroブログで実装してみた'
description: 'SEO対策の第2章として、Meta タグとOGP設定をAstroブログに実装してみました。'
pubDate: 2025-11-03T20:00:00+09:00
heroImage: '@/assets/blog/article-image.png'
categories: ['技術']
---
heroImage には、エイリアス(@/)を使ってプロジェクト内の画像ファイルを指定します。これにより、相対パスの煩雑さを避けて、型安全に画像を扱えます。
この情報が、BlogPost.astro を通じて BaseHead.astro に渡され、Meta タグに反映されます。
実装する際に気をつけたこと
実装する際に、特に注意したポイントを共有します。
1. OGP 画像は絶対URLに変換する
OGP 画像の URL は、Meta タグに出力する際に 絶対URL として指定する必要があります。SNSのクローラーは相対パスを正しく解決できないため、必ず絶対URLに変換してから出力します。
実装方法:
<meta property="og:image" content={new URL(image.src, Astro.site)} />
ImageMetadata 型の画像オブジェクトから .src でパスを取得し、new URL(image.src, Astro.site) を使って絶対URLに変換します。Astro.site はサイトのベースURLで、これと組み合わせることで完全なURLが生成されます。
画像の指定方法:
記事の Frontmatter では、エイリアス(@/)を使って画像を指定します:
heroImage: '@/assets/blog/example.png'
これにより、プロジェクトルートからの相対パスを気にせず、型安全に画像を扱えます。Astro の Content Collection がエイリアスを解決し、自動的に ImageMetadata 型のオブジェクトとして読み込んでくれます。
2. X Card(旧Twitter Card)の種類を選ぶ
X Card には、以下の種類があります:
- summary: 小さい画像で表示
- summary_large_image: 大きい画像で表示
画像を目立たせたい場合は、summary_large_image を使うのがおすすめです。
<meta property="twitter:card" content="summary_large_image" />
X(旧Twitter)では、URLを投稿した際にタイトルまでしか表示されません(説明文は表示されない仕様です)。一方、LINEや Facebook などでは、タイトル・説明文・画像がすべて表示されます。これはXの表示上の仕様であり、OGP設定の問題ではありません。
3. デフォルト画像の準備
記事ごとに個別の OGP 画像を用意するのは手間がかかるので、デフォルト画像を用意しておくと便利です。
私は、サイトのロゴを元にした汎用的な OGP 画像(1200x630px)を作成して、src/assets/common/default-ogp.png に配置し、BaseHead.astro でインポートして使用しています。
Astro の画像最適化機能を活用するため、public フォルダではなく src/assets フォルダに配置するのがおすすめです。
推奨サイズ: 1200 x 630px
最小サイズ: 600 x 315px
ファイル形式: PNG または JPG
実装後の確認方法
実装後、正しく表示されるかを確認する方法を紹介します。
1. ブラウザの開発者ツール
ブラウザの開発者ツール(F12)で、<head> 内の Meta タグが正しく出力されているか確認します。
2. X Card Validator(旧Twitter Card Validator)
X Card の設定が正しいかを確認できるツールです。
ここに URL を入力すると、Meta タグが正しく設定されているかを検証できます。
以前はプレビュー機能がありましたが、現在は廃止されています。Meta タグの検証のみ可能です。実際の表示を確認したい場合は、Xに投稿してテストするか、他のSNSの確認ツールを利用してください。
3. その他の確認ツール
Facebook シェアデバッガーなど、他のSNSでもOGP情報を確認できるツールが提供されています。必要に応じて活用してみてください。
実装してみて感じたこと
Meta タグと OGP を実装してみて、以下のことを感じました:
良かった点
- SNS でのシェアが見栄えが良くなった: X(旧Twitter)や Facebook、LINE でシェアした際、タイトル・説明文・画像が適切に表示されるようになりました。
- 検索結果のクリック率が向上した: Google の検索結果で、タイトルと説明文が意図した通りに表示されるようになりました。
- 実装自体は簡単: 一度テンプレートを作ってしまえば、あとは記事ごとに情報を渡すだけなので、運用も楽です。
まとめ
Meta タグと OGP 設定は、SEO 対策の中でも すぐに効果が実感できる施策 です。
実装も比較的簡単なので、ブログを運営している方はぜひ試してみてください。
次回は「第3章:構造化データ(JSON-LD)の実装」として、検索結果に記事情報を表示させる方法を解説します!
次回は「第3章:構造化データ(JSON-LD)の実装」として、検索結果に記事情報や著者情報を表示させる方法を実装します。実際のコード例なども交えて解説する予定です。
このブログが面白いと思った方は、是非とも下のボタンをクリックして、記事シェアやフォローをしていただけると嬉しいです!
📚 関連記事
Claude Code CLIのカスタムコマンドでブログ記事の品質チェックを効率化した話
Claude Codeのカスタムコマンド機能を使って、ブログ記事の事実確認を自動化する方法を紹介。技術記事や雑記記事の信頼性を高めるための実装例を解説します。
【第1章】SEO対策とは?個人ブログ開発者が検索順位を上げるために調べた4つの施策
SEO対策って何をすればいいの?と思って調べてみた話をまとめました。検索エンジンで上位表示されるために重要な4つの施策(コンテンツ最適化、技術的SEO、UX、外部対策)とGoogleの評価基準(E-E-A-T)を解説します。
Claude Code CLIのカスタムコマンドでブログ運営を効率化する方法
Claude Code CLIのカスタムコマンドで、記事作成からレビューまで自動化したら爆速になった!実際に作った「ブログ作成を支援」「ブログのレビュー」コマンドのコードと使い方を全部公開。ブログ運営を効率化したい人におすすめです。
Astroブログでダークモード実装してみた話【FOUC対策からアクセシビリティまで】
Astroブログにダークモード実装した時にぶつかったFOUC問題、LocalStorageとの連携、アクセシビリティ対応まで、実際に躓いたポイントと解決方法を全部コード付きで解説します。個人開発でダークモード入れたい人は必見です!