Reducir o evitar llamadas a update_meta_cache
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?

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

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?

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.

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.

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)

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