Como acionar uma regeneração de cache oembed
O tempo de cache padrão é de 24 horas e podemos ajustá-lo com o filtro oembed_ttl
.
Mas, como você percebeu, o cache expirado não é suficiente para acionar uma nova geração de cache.
O motivo é esta linha na classe WP_Embed
:
if ( $this->usecache || $cached_recently ) {
para acionar uma nova geração, precisamos que o expirado cache e a propriedade usecache
do objeto $wp_embed
seja false
.
Quando salvamos uma postagem, também fazemos uma chamada de ajax para wp_ajax_oembed_cache()
, que executa o método WP_Embed::cache_oembed()
. Este método define a propriedade usecache
temporariamente como false.
Exemplo # 1
Podemos forçar uma regeneração de cache para um cache expirado com:
add_action( 'template_redirect', function()
{
if( is_single() )
$GLOBALS['wp_embed']->cache_oembed( get_queried_object_id() );
});
e podemos ajustar ainda mais o tempo de expiração para uma hora com:
add_filter( 'oembed_ttl', function( $ttl )
{
return HOUR_IN_SECONDS; // Adjust to your needs
} );
Observe que podemos ter um atraso ao carregar as postagens únicas, devido à regeneração do cache. Uma chamada de ajax pode ser uma solução alternativa. Com essa abordagem, o cache estará sempre pronto para a nova geração, quando expirar. No próximo exemplo, tentamos resolver isso apenas atualizando-o uma vez.
Exemplo # 2
Aqui está outra abordagem sobre como atualizar o HTML do oEmbed, em cargas de postagem únicas, mas apenas uma vez.
Nós definimos um tempo de recache fixo (atual) e quando uma única postagem é carregada, comparamos com o tempo em que o oEmbed HTML foi armazenado pela última vez em cache.
Se o último tempo de cache for antes do tempo de recache , precisamos regenerá-lo.
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 );
e, em seguida, podemos precisar deste também:
// 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;
} );
Espero que você possa ajustar isso ainda mais às suas necessidades.