如何在加载帖子时清除YouTube上的oEmbedded缓存

时间:2015-09-23 作者:jerclarke

我有一个网站,有成千上万的帖子,其中嵌入了YouTube视频。大多数使用默认的[嵌入]youtube\\u url[嵌入]格式,实际嵌入的代码存储在oEmbed Posteta字段中。

我将网站切换到HTTPS和一个新域,现在旧视频不会显示,除非我重新保存帖子。我不想出于明显的原因重新保存每一篇文章,也不想进入数据库,一次盲目地删除所有的oEmbed缓存,这是我在搜索时发现的唯一其他选项。

我想要的是在oEmbed系统上安装一个过滤器,在帖子实际加载时更新YouTube oEmbed缓存,基本上只是在帖子加载时使缓存失效的一种方式。

理想情况下,它只适用于YouTube嵌入(尽管是开放的,可以重复使用),并允许我检查帖子的日期,以避免重新访问HTTPS切换后创建的帖子的嵌入输出。

似乎这是我们许多人出于各种原因需要的东西,所以希望有一种优雅的方式:)

1 个回复
最合适的回答,由SO网友:birgire 整理而成

如何触发oembed缓存再生默认缓存时间为24小时,我们可以使用oembed_ttl 滤器

但正如您所注意到的,过期的缓存不足以触发缓存重新生成。

原因是WP_Embed 类别:

if ( $this->usecache || $cached_recently ) {
因此,要触发重新生成,我们需要两个过期的缓存and 这个usecache 的属性$wp_embed 待处理对象false.

在保存帖子时,我们还对wp_ajax_oembed_cache() 运行WP_Embed::cache_oembed() 方法此方法设置usecache 属性暂时设置为false。

示例#1

我们可以通过以下方式强制对过期缓存进行缓存重新生成:

add_action( \'template_redirect\', function()
{    
    if( is_single() )
        $GLOBALS[\'wp_embed\']->cache_oembed( get_queried_object_id() );  
});
我们还可以通过以下方式将过期时间进一步调整为一小时:

add_filter( \'oembed_ttl\', function( $ttl )
{
    return HOUR_IN_SECONDS; // Adjust to your needs
} );
请注意,由于缓存重新生成,在加载单个POST时可能会遇到延迟。ajax调用可能是一种解决方法。使用这种方法,缓存将在过期时随时准备好重新生成。在下一个示例中,我们试图通过只刷新一次来解决这个问题。

示例#2

这里有另一种方法,介绍如何在单次post加载时刷新oEmbed HTML,但只刷新一次。

我们设置了一个固定的重新缓存时间(当前),当加载一篇文章时,我们将其与上次缓存嵌入的HTML的时间进行比较。

如果上次缓存时间早于重新缓存时间,则需要重新生成它。

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 
             && ! did_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-cleaning
            do_action( \'wpse_do_cleanup\' );
        }
    }
    return $ttl;
}, 10, 4 );
然后我们可能也需要这个:

// Set the usecache attribute back to 1.
add_filter( \'embed_oembed_discover\', function( $discover )
{
    if( did_action( \'wpse_do_cleanup\' ) )
        $GLOBALS[\'wp_embed\']->usecache = 1;
    return $discover;
} );
希望您可以根据自己的需要进一步调整。

相关推荐

Two sets of url one content?

如何配置两组实际使用相同内容的URL?例如:(第1组)samplesite.com samplesite.com/about/ samplesite.com/contact/ samplesite.com/projects/ (第2组)samplesite.com/fr/ samplesite.com/fr/about/ samplesite.com/fr/contact/ samplesite.com/fr/projects/ 然后在我