¿Cómo puedo borrar las cachés de OEmbed para YouTube en las publicaciones a medida que se cargan?

4

Tengo un sitio con toneladas de publicaciones, cientos / miles de las cuales tienen videos de YouTube integrados. La mayoría utiliza el formato predeterminado [incrustar] youtube_url [incrustar] y el código de inserción real se almacena en los campos postmeta oEmbed.

Cambié el sitio a HTTPS y un nuevo dominio, y ahora los videos antiguos no se muestran a menos que vuelva a guardar la publicación. No quiero volver a guardar todas las publicaciones por razones obvias y no quiero ingresar a la base de datos y borrar ciegamente todos los cachés abiertos al mismo tiempo, que son las únicas opciones que he encontrado durante la búsqueda.

Lo que quiero es un filtro en el sistema oEmbed que actualizará los cachés de YouTube oEmbed a medida que las publicaciones se carguen, básicamente, solo una forma de invalidar las cachés mientras se cargan las publicaciones.

Idealmente, solo se aplicaría a las incrustaciones de YouTube (aunque estaría abierto para su reutilización) y me permitiría verificar la fecha de la publicación para evitar recuperar la salida de publicación para publicaciones creadas después del cambio de HTTPS.

Parece que esto es algo que muchos de nosotros necesitamos por muchas razones, así que espero que haya una forma elegante :)

    
pregunta jerclarke 23.09.2015 - 20:23

1 respuesta

5

Cómo desencadenar una regeneración de caché oembed

El tiempo de caché predeterminado es de 24 horas y lo podemos ajustar con el filtro oembed_ttl .

Pero como ha notado, caché caducada no es suficiente para desencadenar una regeneración de caché.

El motivo es esta línea en la clase WP_Embed :

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

para desencadenar una regeneración, necesitamos que caduque y la propiedad usecache del objeto $wp_embed sea false .

Cuando guardamos una publicación, también hacemos una llamada ajax a wp_ajax_oembed_cache() que ejecuta el método WP_Embed::cache_oembed() . Este método establece la propiedad usecache temporalmente en falso.

Ejemplo # 1

Podemos forzar una regeneración de caché para un caché caducado con:

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

y podemos ajustar aún más el tiempo de caducidad a una hora con:

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

Tenga en cuenta que es posible que experimentemos un retraso al cargar las publicaciones individuales, debido a la regeneración de la memoria caché. Una llamada ajax podría ser una solución. Con este enfoque, el caché siempre estará listo para la regeneración, cuando caduque. En el siguiente ejemplo, intentamos solucionarlo actualizando solo una vez.

Ejemplo # 2

Este es otro enfoque sobre cómo actualizar el HTML incorporado en una sola publicación, pero solo una vez.

Establecemos un tiempo fijo de recache (actual) y cuando se carga una sola publicación, la comparamos con la hora en que se almacenó en caché el HTML oEmbed.

Si la última hora de caché es anterior a la hora de recache , entonces necesitamos regenerarla.

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 );

y luego podríamos necesitar este también:

// 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 puedas ajustar esto más a tus necesidades.

    
respondido por el birgire 24.09.2015 - 02:06

Lea otras preguntas en las etiquetas