Reducir o evitar llamadas a update_meta_cache

6 may 2015, 12:50:36
Vistas: 14.9K
Votos: 6

Mi tema llama a la función update_meta_cache() ¡58 veces por página! Esta función ejecuta la siguiente consulta basada en el post en cuestión:

SELECT post_id, meta_key, meta_value  
-> FROM wp_postmeta  
-> WHERE post_id IN (81649)  
-> ORDER BY meta_id ASC  
-> ;  

La gran mayoría de los meta_keys (y sus valores correspondientes) devueltos no son necesarios para la página en cuestión (por ejemplo, yoast_wpseo_title, _edit_last, _edit_lock no se necesitan para el loop de la página principal).

¿Hay alguna manera de reducir o evitar las llamadas a update_meta_cache? ¿Quizás incluyendo una función en el hook pre_get_posts?

1
Comentarios

Solo una nota al margen: Explicación de update_post_(meta/term)_cache.

Howdy_McGee Howdy_McGee
1 feb 2016 18:32:42
Todas las respuestas a la pregunta 2
5

Cada vez que utilices la función get_post_meta(), se realizará la consulta mencionada para obtener todos los metadatos del post y almacenarlos en la caché. Mientras más posts consultes, más consultas se realizarán.

Para reducir el número de consultas, deberíamos pre-cachear todos los valores meta de todos los posts en la consulta antes de llamar a get_post_meta.

Este es el código de ejemplo tomado de un tutorial:

add_filter( 'posts_results', 'cache_meta_data', 9999, 2 );
function cache_meta_data( $posts, $object ) {
    $posts_to_cache = array();
    // esto generalmente solo tiene sentido cuando tenemos varios posts
    if ( empty( $posts ) || is_wp_error( $posts ) || is_single() || is_page() || count( $posts ) < 3 )
        return $posts;

    foreach( $posts as $post ) {
        if ( isset( $post->ID ) && isset( $post->post_type ) ) {
            $posts_to_cache[$post->ID] = 1;
        }
    }

    if ( empty( $posts_to_cache ) )
        return $posts;

    update_meta_cache( 'post', array_keys( $posts_to_cache ) );
    unset( $posts_to_cache );

    return $posts;
}
1 jun 2015 07:10:34
Comentarios

Acabo de encontrarme con este problema, ya que estoy viendo una gran cantidad de solicitudes update_meta_cache() realizadas. Con este ajuste en el archivo function.php de mis temas, todavía veo muchas consultas de este tipo: SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (8987) ORDER BY meta_id ASC ... ¿Estoy haciendo algo mal?

Andrew Newby Andrew Newby
3 mar 2016 10:51:19

No tiene ningún efecto, es mala idea usar código aleatorio de 2011 en la última versión de WP ya que mucho ha cambiado.

Michael Rogers Michael Rogers
5 mar 2018 18:48:48

Simplemente busqué "update_meta_cache" en la "carpeta completa de WordPress" y lo terminé.. Ahora el sitio web funciona como si estuviera usando modo offline.. súper rápido.

MFarooqi MFarooqi
13 feb 2020 21:51:27

NO CACHES TODAS LAS PUBLICACIONES (DEL SITIO) A LA VEZ - lo que el autor quiere decir aquí son todas las publicaciones recuperadas para una página en particular, no intentes pre-cachear cientos, miles, millones, etc. de publicaciones, podría colapsar tu sitio. Si necesitas un caché extensivo, usa una solución de caché por página o un plugin. (el texto en negrita parece confuso para recién llegados)

jave.web jave.web
18 feb 2021 11:17:03

Hola @MFarooqi, ¿podrías explicar un poco más cómo lo solucionaste? Todavía tengo el mismo problema aquí.

Leo Leo
4 mar 2022 22:46:59
1

Para una consulta WP_Query, el almacenamiento en caché puede deshabilitarse configurando ciertos parámetros de caché a false.

De manera similar para WP_Term_Query, puede deshabilitarse incluyendo update_term_meta_cache => false en los argumentos de la consulta.

Además, el filtro update_{$meta_type}_metadata_cache puede usarse para deshabilitar el almacenamiento en caché de metadatos para todas las consultas en el tipo de objeto. (ej. update_post_metadata_cache, update_term_metadata_cache, etc.)

11 sept 2021 00:47:04
Comentarios

Gracias por tus sugerencias, @plong0, esto parece ser exactamente lo que he estado buscando. Me esperan divertidos experimentos con menos caché de metadatos :)

vlood vlood
27 jun 2023 17:59:33