【WordPressトラブル解決】トップページがoEmbedで埋め込めない!原因と完全対策


WordPressでトップページが埋め込み表示されない問題とその対策

WordPressでは、記事URLを貼り付けるだけで自動的に埋め込みカードが表示される「oEmbed」機能があります。しかし、以下のようなケースではうまく表示されないことがあります。

  • トップページのURLを貼ってもカードにならない
  • サイドバーなどでURLを貼ってもテキストリンクになる
  • 外部サイトからの埋め込みが記事ではできるのに、トップではできない

今回は、自身のドメインのトップページが埋め込めないという問題に対して、実際に行った対応と成功例をご紹介します。


原因:トップページへのoEmbedレスポンスが存在しない

WordPressは通常、記事ごとに「oEmbed用のメタタグ(link rel=”alternate”)」を出力しますが、トップページ(フロントページ)にはこれが出力されていない場合が多く、これが埋め込みに失敗する原因となります。


対策:functions.phpにコードを追加してトップページに対応

以下のコードを functions.php または Code Snippets プラグインに追加することで、トップページにoEmbedのメタ情報を付加し、レスポンスとしてJSON形式のカード情報を返せるようになります。

1. oEmbedエンドポイントを登録

function neko_add_oembed_provider($providers) {
    $providers['#^https?://(www\.)?necokoucan\.com/?$#i'] = [
        home_url('/wp-json/neko-oembed/v1/embed?url={url}'),
        'discover' => true
    ];
    return $providers;
}
add_filter('oembed_providers', 'neko_add_oembed_provider');

2. oEmbedのレスポンスを用意

function neko_oembed_response() {
    register_rest_route('neko-oembed/v1', '/embed', [
        'methods' => 'GET',
        'callback' => 'neko_render_oembed_response',
        'args' => [
            'url' => [
                'required' => true,
                'validate_callback' => function($param) {
                    return filter_var($param, FILTER_VALIDATE_URL);
                }
            ]
        ],
        'permission_callback' => '__return_true'
    ]);
}
add_action('rest_api_init', 'neko_oembed_response');

3. レスポンスの内容を定義

function neko_render_oembed_response($request) {
    $url = esc_url_raw($request['url']);
    if (trailingslashit($url) === trailingslashit(home_url('/'))) {
        return [
            'version' => '1.0',
            'type' => 'rich',
            'provider_name' => '猫工艦とボルトアクション',
            'provider_url' => home_url('/'),
            'title' => 'ミリタリーグッズ工房 猫工艦',
            'thumbnail_url' => get_site_icon_url(512),
            'html' => '<a href="' . esc_url($url) . '" target="_blank">トップページを見る</a>',
            'width' => 600,
            'height' => 200,
            'description' => '軍艦や戦車などのグッズを紹介しています。'
        ];
    }
    return new WP_Error('oembed_invalid_url', 'Not Found', ['status' => 404]);
}

成功のポイント

  • register_rest_route でトップページ専用のエンドポイントを追加
  • oembed_providers に正規表現でトップページURLをマッチさせる
  • is_front_page() ではなく、trailingslashit を使ってURL比較することで確実に一致させる

補足:他のWordPressサイトにも応用可能

同じ仕組みを使えば、サブドメイン(例:shop.necokoucan.com)や他のWordPressサイトでも応用可能です。サイト名、アイコンURL、タイトルなどをそのサイトに合わせて変更してください。


まとめ

WordPressでoEmbedカードがトップページだけ表示されない場合、手動でトップページ用のoEmbedレスポンスを用意することで解決できます。

ブログや商品ページを他サイトにきれいに埋め込みたい方にとって、非常に役立つ設定です。ぜひ試してみてください。


コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です