MENU

WordPressでX(Twitter)埋め込みが表示されない原因は“oEmbed失敗キャッシュ”|MUプラグイン1本で日次パージ

以前まで普通に表示されてたはずのTwitterのWordPress埋め込みが表示されずURLだけ表示されるようになって・・・ 編集画面では見えるのに、公開側だとURLのまま──その多くは oEmbed の「失敗結果」キャッシュ(_oembed_*) が投稿メタに残っているのが原因です。
この記事では 子テーマ不要・置くだけ有効 の MU プラグインで、失敗キャッシュを1日1回自動削除する方法だけを最短で解説します。

目次

対象と前提

  • 症状:X(旧Twitter)の埋め込みが公開側だけ表示されない/URLのまま
  • 環境例:WordPress 6.x、SWELL、一般的なレンタルサーバー(ConoHa WING等)
  • 目的:失敗キャッシュの自動パージで再発を防ぐ

結論(TL;DR)

  • 原因の9割はoEmbed失敗の残留キャッシュ
  • MUプラグインを置いて毎日自動削除すれば、自然に再取得されて復旧する。
  • 必要時のみ手動トリガで即時パージも可能(管理者限定)。

手順:MUプラグインで「毎日自動パージ」

  1. SFTP/ファイルマネージャで wp-content/ 配下に mu-plugins フォルダを作成(存在しなければ新規作成)。
    パス:/wp-content/mu-plugins/
  2. oembed-daily-purge.php というファイルを作り、以下を丸ごと貼り付けて保存。
<?php
/*
 Plugin Name: oEmbed Daily Purge
 Description: 1日1回、失敗っぽいoEmbedキャッシュを自動削除(必要に応じて全削除モードも可)
 Author: you
*/

// スケジュール登録:未登録なら1日1回
add_action('init', function () {
    if (!wp_next_scheduled('odp_oembed_daily_purge')) {
        wp_schedule_event(time() + 300, 'daily', 'odp_oembed_daily_purge');
    }
});

// 実処理(失敗っぽいものだけ削除)
add_action('odp_oembed_daily_purge', function () {
    odp_purge_oembed(false); // false=失敗のみ / true=全削除
});

// 手動実行(管理者ログイン中のみ)
// 例: https://example.com/?odp_purge=1       → 失敗のみ削除
//     https://example.com/?odp_purge=1&all=1 → 全削除(必要時のみ)
add_action('init', function () {
    if (is_user_logged_in() && current_user_can('manage_options') && isset($_GET['odp_purge'])) {
        $aggressive = (isset($_GET['all']) && $_GET['all'] === '1');
        odp_purge_oembed($aggressive);
        wp_die('oEmbed purge done.');
    }
});

function odp_purge_oembed($aggressive = false) {
    global $wpdb;
    $pm  = $wpdb->postmeta;
    $opt = $wpdb->options;

    if ($aggressive) {
        // 全oEmbedキャッシュを一掃(アクセス多い時間は避ける)
        $wpdb->query("DELETE FROM {$pm} WHERE meta_key LIKE '\\_oembed\\_%'");
    } else {
        // 失敗っぽいものだけ削除
        // - meta_value = 'false'
        // - blockquote/iframeを含まない(=URL素のまま等)
        $wpdb->query("
            DELETE FROM {$pm}
            WHERE meta_key LIKE '\\_oembed\\_%'
              AND (
                   meta_value = 'false'
                OR (meta_value NOT LIKE '%<blockquote%' AND meta_value NOT LIKE '%<iframe%')
              )
        ");
    }

    // oEmbed系トランジェントも掃除
    $wpdb->query("
        DELETE FROM {$opt}
        WHERE option_name LIKE '\\_transient\\_oembed\\_%'
           OR option_name LIKE '\\_transient\\_timeout\\_oembed\\_%'
    ");
}

ポイント: MUプラグインは有効化操作が不要。/mu-plugins/ に置いた瞬間から動作します。

動作確認&即時テスト

  • すぐに動かして確認したい場合(管理者ログイン中に)
    https://あなたのドメイン/?odp_purge=1 … 失敗キャッシュのみ削除
    https://あなたのドメイン/?odp_purge=1&all=1 … 全oEmbedキャッシュ削除(必要時のみ)
  • パージ後、問題のページを再読み込み。ページソースに <blockquote class="twitter-tweet"> が現れればOK。

運用のコツ

  • WP-Cronはアクセス時に実行されます。深夜帯に確実に回したい場合は、サーバーのCRONで wp-cron.php を1日1回叩く設定を追加すると安定します。
  • ConoHa WING等のサーバーキャッシュは別レイヤー。表示が改善しない場合はコントロールパネルからキャッシュを削除。
  • URLはtwitter.comを推奨(x.com は失敗しがち)。
  • 最適化系の遅延/結合platform.twitter.com / widgets.js がブロックされないよう除外設定を推奨。

よくある質問(簡潔版)

Q. 既におかしくなっている投稿はいつ直る?
A. パージ後の再取得タイミングで順次復旧します。急ぐ場合は上の手動トリガ(?odp_purge=1)を実行してからページを開いてください。
Q. 全削除モード(&all=1)は常用してよい?
A. 非推奨。外部再取得が増えるため必要時のみ、アクセスの少ない時間帯に実行してください。

以上。これで 「公開側だけTwitterが出ない」 が勝手に再発しても、毎日自動で自衛できます。困っている人の助けになれば幸いです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

こんにちは、「雑記.com」運営者の Taka です。
日常の中で感じたことや、誰かに伝えたくなったことを気ままに綴っています。
ジャンルはバラバラですが、「読んでよかった」と思える記事を目指して更新中。
ふとした時間に、のんびり読んでいただけたら嬉しいです。

目次