動的にOGPを生成するとは?Webアプリ運用で差がつく設計の考え方

技術ナレッジ

動的に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.phpwp_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 を設計
  • ③ フォールバック構造を作る
  • ④ 必要なら画像生成まで拡張

これを実装することで、同じコンテンツでも「見え方」が変わり、結果として流入や反応に差が出てきます。

まずはシンプルな出し分けから始めて、徐々に動的生成へと進めていくのが良いでしょう。

↓私のサービスでは、こんな感じにしています。

自作ゲームのタイトル画像の墓 | 創作の墓場
途中までゲーム作ったけど気づいたら6年放置してたため葬送