2026年5月20日
2026年5月20日
WordPressの埋め込み(oEmbed)が表示されない原因と対処|YouTube・X・Instagram
WordPressでは、YouTubeなどのURLを本文に1行で貼ったり、「埋め込み」ブロックにURLを入れたりすると、動画や投稿がそのまま表示されます。この仕組みをoEmbedといいます。WordPressが相手のサービス(プロバイダー)に問い合わせて埋め込み用のHTMLを受け取り、表示します。
この記事では、埋め込みにならずURLがリンクのまま表示される、エディターで「このコンテンツを埋め込めませんでした。」と出る、といったときの原因と対処を説明します。内容は、2026年10月時点のWordPress 7.1.3のテスト環境で確認しています。
まず確認すること
原因を切り分けるには、WP-CLIの wp embed コマンドが便利です。サーバーから直接プロバイダーに問い合わせた結果を確かめられます。
# URL に対応するプロバイダーが登録されているか
wp embed provider match https://www.youtube.com/watch?v=XXXXXXXXXXX
# 埋め込み用のHTMLを取得できるか(キャッシュを使わずに試す)
wp embed fetch https://www.youtube.com/watch?v=XXXXXXXXXXX --skip-cache
# プロバイダーの応答をそのまま見る(通信の問題の切り分け用)
wp embed fetch https://www.youtube.com/watch?v=XXXXXXXXXXX --raw
結果に応じて、次のように原因を絞り込みます。
| 結果 | 考えられる原因 | 見る節 |
|---|---|---|
wp embed fetch でHTMLが返るのに、記事ではリンクのまま |
失敗した結果がキャッシュに残っている/自動埋め込みが止められている | 原因1・原因2 |
provider match で「No oEmbed provider found」と出る |
そのサービスのURLがWordPress本体のプロバイダー一覧にない | 原因3・原因4 |
--raw でエラーやタイムアウトになる |
サーバーから外部への通信ができない、応答が遅い | 原因5 |
| サーバー側では取得できるのに、ブラウザーで空白になる | Content Security Policy(CSP)で読み込みが拒否されている | 原因6 |
原因1:失敗した結果がキャッシュに残っている
WordPressは、埋め込みの結果をキャッシュします。投稿の中のURLは投稿のメタ情報(_oembed_… と _oembed_time_…)に、それ以外は oembed_cache という種類の投稿に保存されます。
取得に失敗した場合も、{{unknown}} という値で「失敗した」ことが保存され、それ以降はリンクとして表示されます。一時的な通信の不調で失敗すると、原因が直ってもリンクのままになるのはこのためです。
投稿ごとにキャッシュを消すには、投稿IDを指定します。
# 投稿 123 の埋め込みキャッシュを消す
wp embed cache clear 123
# 投稿 123 の埋め込みを取得し直してキャッシュする
wp embed cache trigger 123
サイト全体のキャッシュをまとめて消す場合は、データベースを直接操作します。作業の前にデータベースのバックアップを取ってください。
wp db export before-oembed-clear.sql
# 投稿のメタ情報に保存された埋め込みキャッシュを削除
wp db query "DELETE FROM $(wp db prefix)postmeta WHERE meta_key LIKE '\_oembed\_%'"
# 投稿以外の埋め込みキャッシュ(oembed_cache)を削除
wp post delete $(wp post list --post_type=oembed_cache --format=ids) --force
# オブジェクトキャッシュを使っている場合は消す
wp cache flush
wp post meta delete には、メタキーをワイルドカード(_oembed_* など)で指定する機能はありません。まとめて消す場合は、上のようにSQLの LIKE を使います。oembed_cache の投稿が1件も無い場合、wp post delete は使い方(usage)を表示して終わりますが、問題はありません。
キャッシュを消したら、ページキャッシュのプラグインやCDNのキャッシュも消してから表示を確かめます。
原因2:自動埋め込みが止められている
本文に1行で貼ったURLを埋め込みに変える処理は、the_content フィルターに登録された WP_Embed::autoembed です。テーマの functions.php やプラグインに次のような記述があると、この処理が止まります。
<?php
// 自動埋め込みを止めるコード(この記述があれば削除する)
remove_filter( 'the_content', array( $GLOBALS['wp_embed'], 'autoembed' ), 8 );
現在の状態は、WP-CLIで確認できます。
wp eval 'var_dump( has_filter( "the_content", array( $GLOBALS["wp_embed"], "autoembed" ) ) );'
int(8) と出れば有効です。bool(false) の場合は、どこかで外されています。テーマやプラグインのファイルを autoembed で検索して、該当の記述を探してください。
grep -rn "autoembed" wp-content/themes wp-content/plugins wp-content/mu-plugins
原因3:X(旧Twitter)の x.com のURL
2026年10月時点のWordPress 7.1.3の本体には、twitter.com のURL用のプロバイダーが登録されていますが、x.com のURL用のものはありません。
https://twitter.com/ユーザー名/status/…の形のURLは、そのまま埋め込みになりますhttps://x.com/ユーザー名/status/…の形のURLは、本体の一覧に一致しません。WordPressはページ内の情報からプロバイダーを探しますが、この方法で見つけたプロバイダーの応答は安全のために一部のHTMLしか残さないため、ポストの表示に必要な部分が削られ、リンクのまま表示されます
対処は2つあります。
- 貼るURLの
x.comをtwitter.comに書き換える x.comのURLを、本体のtwitter.comと同じプロバイダーに登録する
後者の場合は、次のコードを wp-content/mu-plugins/x-embed.php として置きます(mu-plugins ディレクトリが無ければ作成します)。
<?php
/**
* Plugin Name: x.com の埋め込みを有効にする
*/
add_action(
'init',
function (): void {
wp_oembed_add_provider( '#https?://(www\.)?x\.com/\w{1,15}/status(es)?/.*#i', 'https://publish.twitter.com/oembed', true );
}
);
テスト環境では、このコードを置く前は x.com のポストがリンクのままで、置いた後は埋め込みになることを確認しました。すでにリンクとしてキャッシュされている投稿は、原因1の手順でキャッシュを消してください。
原因4:Instagram・Facebookは本体の対応から外れている
InstagramとFacebookの埋め込みは、WordPress 5.5.2で本体のプロバイダー一覧から外されました。そのため、URLを貼っても埋め込みにはなりません。WordPressの設定やキャッシュの問題ではありません。
表示したい場合は、次のどちらかを使います。
- Instagramのウェブ版で、投稿のメニューから埋め込み用のコードを取得し、「カスタムHTML」ブロックに貼る
- InstagramやFacebookの埋め込みに対応したプラグインを使う(Metaの開発者向けのアプリやアクセストークンの設定が必要なものがあります)
原因5:サーバーから外部へ通信できない・応答が遅い
oEmbedは、表示する側のブラウザーではなく、WordPressのサーバーがプロバイダーに問い合わせます。次のような場合は取得に失敗します。
- サーバーのファイアウォールやレンタルサーバーの設定で、外部へのHTTPS通信が制限されている
- サーバーのDNSの設定が誤っていて、相手のホスト名を引けない
- プロバイダーの応答が遅い
wp embed fetch … --raw でエラーになる場合は、サーバーから直接 curl で同じURLにアクセスできるかを確かめます。
curl -sS -o /dev/null -w '%{http_code} %{time_total}s\n' 'https://www.youtube.com/oembed?url=https://www.youtube.com/watch?v=XXXXXXXXXXX&format=json'
応答が返るものの時間がかかる場合は、oEmbedの取得だけタイムアウトを延ばせます。WordPressのHTTP通信の既定のタイムアウトは5秒です。サイト全体の通信に影響する http_request_timeout ではなく、oEmbed用の oembed_remote_get_args フィルターを使います。
<?php
/**
* Plugin Name: oEmbed timeout
* Description: oEmbed の取得のタイムアウトを既定の5秒から15秒に延ばす。
*/
add_filter(
'oembed_remote_get_args',
function ( $args, $url ) {
$args['timeout'] = 15;
return $args;
},
10,
2
);
原因6:CSPで読み込みが拒否されている
サイトでContent Security Policy(CSP)のヘッダーを送っている場合、埋め込みが使う iframe や外部のスクリプトが、許可されたドメインに含まれていないと、ブラウザーが読み込みを拒否します。サーバー側では埋め込みのHTMLが取得できているのに、ブラウザーでは空白になるのが特徴です。
ブラウザーの開発者ツールのコンソールを開き、Content Security Policyに違反したという内容のエラーが出ていないかを確認します。エラーに表示されたドメインを、CSPの frame-src や script-src に追加します。テスト環境で取得した例では、YouTubeの埋め込みは https://www.youtube.com の iframe、Xのポストは https://platform.x.com/widgets.js のスクリプトを使っていました。
CSPを使っていないサイトで新たにCSPを設定する場合、ほかの機能にも影響するため、ここだけを目的に設定することはおすすめしません。CSPの設定方法は「WordPressのContent Security Policy(CSP)を設定する方法」を参照してください。
まとめ
wp embed fetchとwp embed provider matchで、サーバー側で取得できるかを先に確かめる- 失敗した結果は
{{unknown}}としてキャッシュされる。wp embed cache clear 投稿IDか、SQLのLIKEでまとめて消す(wp post meta deleteはワイルドカードを使えない) - 自動埋め込みは
remove_filter( 'the_content', array( $GLOBALS['wp_embed'], 'autoembed' ), 8 )で止まる。こうした記述が残っていないかを確認する x.comのURLは本体に登録されていないため、twitter.comに書き換えるか、プロバイダーを追加する- InstagramとFacebookはWordPress 5.5.2で本体の対応から外れている
- 通信の遅さには
oembed_remote_get_args、ブラウザーで空白になる場合はCSPを確認する
関連記事: