web-dev-qa-db-ja.com

YouTubeの投稿がロードされたときにYouTubeのoEmbedキャッシュをクリアする方法

私はYouTubeのビデオが埋め込まれた何百、何千という投稿があるサイトを持っています。ほとんどの場合、デフォルトの[embed] youtube_url [embed]フォーマットが使用され、実際の埋め込みコードはoEmbed postmetaフィールドに格納されています。

サイトをHTTPSと新しいドメインに切り替えたところ、投稿を再保存しない限り古いビデオは表示されません。明らかな理由ですべての投稿を再保存したくないし、データベースに入って一度にすべてのoEmbedキャッシュを盲目的に削除したくないのですが、これらは検索中に見つかった唯一のオプションです。

私が欲しいのは、投稿が実際にロードされたときにYouTubeのoEmbedキャッシュを更新するoEmbedシステム上のフィルターです。基本的には、投稿がロードされている間にキャッシュを無効にする方法です。

理想的にはYouTubeの埋め込みにのみ適用され(ただし再利用のために公開されている)、HTTPS切り替え後に作成された投稿についてoEmbed出力が再設定されないように投稿の日付を確認します。

これは私たちの多くがさまざまな理由で必要としているように思えるので、うまくいけばエレガントな方法があります:)

5
jerclarke

埋め込みキャッシュの再生成をトリガーする方法

デフォルトのキャッシュ時間は24時間です。oembed_ttlフィルタで調整できます。

しかしお気づきのとおり、 期限切れのキャッシュ はキャッシュの再生成を引き起こすのに十分ではありません。

その理由はWP_Embedクラスの次の行です。

if ( $this->usecache || $cached_recently ) {

再生成をトリガーするには、usecacheであるために$wp_embedオブジェクトの expired cachefalseプロパティの両方が必要です。

投稿を保存するときに、wp_ajax_oembed_cache()メソッドを実行するWP_Embed::cache_oembed()へのajax呼び出しも行います。このメソッドは、一時的にusecacheプロパティをfalseに設定します。

例1

有効期限が切れたキャッシュのキャッシュ再生成を強制することができます。

add_action( 'template_redirect', function()
{    
    if( is_single() )
        $GLOBALS['wp_embed']->cache_oembed( get_queried_object_id() );  
});

また、有効期限を1時間に調整することもできます。

add_filter( 'oembed_ttl', function( $ttl )
{
    return HOUR_IN_SECONDS; // Adjust to your needs
} );

キャッシュの再生成のため、単一の投稿をロードするときに遅延が発生する可能性があることに注意してください。 ajaxの呼び出しは回避策かもしれません。このアプローチでは、キャッシュは期限が切れると常に再生成の準備が整います。次の例では、一度だけリフレッシュすることでそれを解決しようとします。

例2

これは、1回の投稿読み込みでoEmbed HTMLを更新する方法に関するもう1つのアプローチですが、1回だけです。

固定の recache time(current)を設定し、単一の投稿が読み込まれたときに、oEmbed HTMLが最後にキャッシュされた時刻と比較します。

最後のキャッシュ時間が recache 時間より前の場合は、再生成する必要があります。

add_filter( 'oembed_ttl', function( $ttl, $url, $attr, $post_ID )
{
    // Only do this on single posts
    if( is_single() )
    {
        // Oembeds cached before this time, will be recached:
        $recache_time  = '2015-09-23 23:26:00';     // <-- Set this to the current time.

        // Get the time when oEmbed HTML was last cached (based on the WP_Embed class)
        $key_suffix    = md5( $url . serialize( $attr ) );
        $cachekey_time = '_oembed_time_' . $key_suffix;
        $cache_time    = get_post_meta( $post_ID, $cachekey_time, true );

        // Get the cached HTML 
        $cachekey      = '_oembed_' . $key_suffix;
        $cache_html    = get_post_meta( $post_ID, $cachekey, true );

        // Check if we need to regenerate the oEmbed HTML:
        if(     
                $cache_time < strtotime( $recache_time )     // cache time check
             && false !== strpos( $cache_html, 'youtube' )   // contains "youtube" stuff 
             && ! do_action( 'wpse_do_cleanup' )             // let's just run this once 
             && 1 === $GLOBALS['wp_embed']->usecache
        ) {
            // What we need to skip the oembed cache part
            $GLOBALS['wp_embed']->usecache = 0; 
            $ttl = 0;               
            // House-cleanoing
            do_action( 'wpse_do_cleanup' );
        }
    }
    return $ttl;
}, 10, 4 );

そして、これも必要になるかもしれません。

// Set the usecache attribute back to 1.
add_filter( 'embed_oembed_discover', function( $discover )
{
    if( 1 === did_action( 'wpse_do_cleanup' ) )
        $GLOBALS['wp_embed']->usecache = 1;
    return $discover;
} );

うまくいけばあなたはあなたのニーズに合わせてこれをさらに調整することができます。

6
birgire