如何触发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;
} );
希望您可以根据自己的需要进一步调整。