Como posso limpar caches oEmbed para o YouTube em postagens conforme elas são carregadas

4

Eu tenho um site com centenas de posts em centenas e milhares de vídeos do YouTube. A maioria usa o formato padrão [embed] youtube_url [embed] e o código de incorporação real é armazenado nos campos postmeta oEmbed.

Mudei o site para HTTPS e um novo domínio, e agora os vídeos antigos não são exibidos, a menos que eu tenha salvo a postagem. Eu não quero salvar todos os posts por razões óbvias e eu não quero entrar no banco de dados e apagar cegamente todos os caches oEmbed de uma vez, que são as únicas outras opções que eu encontrei enquanto procurava.

O que eu quero é um filtro no sistema oEmbed que atualizará os caches oEmbed do YouTube conforme as mensagens são realmente carregadas, basicamente apenas uma maneira de invalidar os caches enquanto as postagens estão sendo carregadas.

O ideal seria aplicar-se apenas a incorporações do YouTube (embora esteja aberto para reutilização) e permitiria que eu verificasse a data da postagem para evitar a recolocação da saída oEmbed para postagens criadas após a opção HTTPS.

Parece que isso é algo que muitos de nós precisam por muitas razões, por isso esperamos que haja uma maneira elegante:)

    
por jerclarke 23.09.2015 / 20:23

1 resposta

5

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.

    
por birgire 24.09.2015 / 02:06