動的にOGPを生成するとは?Webアプリ運用で差がつく設計の考え方
SNSでURLを共有したときに表示される「タイトル・説明文・画像」は、ユーザーのクリック率に大きく影響します。この表示を制御する仕組みがOGP(Open Graph Protocol)です。
一般的なブログでは、サイト全体で1つのOGP画像を設定しているケースも多いですが、Webアプリや複数のコンテンツを扱うサービスでは、それでは不十分になることがあります。なぜなら、ページごとに見せたい内容が異なるからです。
そこで重要になるのが「動的にOGPを生成する」という考え方です。
なぜ固定OGPではダメなのか
例えば、以下のようなサービスを考えてみてください。
- ユーザー投稿型サービス(例:創作投稿サイト)
- 記事ごとにテーマが異なるブログ
- イベントや特集ページが複数あるサイト
これらすべてで同じOGP画像が表示されると、SNS上では違いが伝わりません。ユーザーから見ると「全部同じページ」に見えてしまい、クリック率が下がる原因になります。
つまり、OGPは「ページごとの魅力を伝えるための入り口」であり、内容に応じて変える必要があるのです。
動的OGPの基本設計
動的にOGPを生成する際は、以下の3つを軸に考えます。
- og:title(タイトル)
- og:description(説明文)
- og:image(画像)
基本的な考え方はシンプルです。
「ページの内容に応じて、これらを出し分ける」
例えば:
- トップページ → サイト名+概要
- 記事ページ → 記事タイトル+要約
- 作品ページ → 作品名+サムネイル画像
このように役割を分けることで、SNS上での見え方が大きく改善します。
WordPressでの実装方法
WordPressでは、テーマの header.php や wp_head フックを使ってOGPを出し分けることができます。
add_action('wp_head', function () {
if (is_front_page()) {
$title = get_bloginfo('name');
$desc = get_bloginfo('description');
$image = 'https://example.com/ogp-default.jpg';
} elseif (is_single()) {
$title = get_the_title();
$desc = wp_trim_words(strip_tags(get_the_content()), 120);
$image = get_the_post_thumbnail_url() ?: 'https://example.com/ogp-default.jpg';
} else {
$title = get_bloginfo('name');
$desc = get_bloginfo('description');
$image = 'https://example.com/ogp-default.jpg';
}
echo '<meta property="og:title" content="' . esc_attr($title) . '">';
echo '<meta property="og:description" content="' . esc_attr($desc) . '">';
echo '<meta property="og:image" content="' . esc_url($image) . '">';
});
このように条件分岐を使うことで、ページごとに最適なOGPを設定できます。
画像(og:image)の設計が最も重要
OGPの中で最も影響が大きいのが画像です。SNSでは画像が目立つため、ここが適切でないとクリックされにくくなります。
おすすめの設計は以下です。
- ① 個別指定画像(あれば最優先)
- ② アイキャッチ画像
- ③ デフォルト画像
このように「フォールバック構造」にすることで、どのページでも崩れない設計になります。
さらに一歩進んだ「動的OGP画像生成」
より高度な実装として、OGP画像自体を動的に生成する方法があります。
例えば以下のような情報を組み合わせます。
- タイトル
- カテゴリ
- ロゴ
- 背景デザイン
PHPではGDやImagickを使って画像生成が可能です。これにより、すべてのページに統一感のある専用OGP画像を自動生成できます。
特にユーザー投稿型サービスでは、内容ごとに違いを出しつつ、ブランド感を保つことができるため非常に有効です。
実装時の注意点
動的OGPにはいくつか注意点もあります。
- SNSのキャッシュにより変更が反映されないことがある
- 画像はリアルタイム生成より事前生成が安定
- descriptionは文字数制限(100〜120文字程度)を意識する
特にX(旧Twitter)やFacebookはキャッシュが強いため、更新時はURLを変更するなどの対策が必要になることもあります。
まとめ
動的OGPは単なる装飾ではなく、コンテンツの価値をSNS上で伝えるための重要な設計です。
以下の流れで考えるのがおすすめです。
- ① ページ種類ごとに役割を整理
- ② title / description / image を設計
- ③ フォールバック構造を作る
- ④ 必要なら画像生成まで拡張
これを実装することで、同じコンテンツでも「見え方」が変わり、結果として流入や反応に差が出てきます。
まずはシンプルな出し分けから始めて、徐々に動的生成へと進めていくのが良いでしょう。
↓私のサービスでは、こんな感じにしています。


