Ridurre o prevenire le chiamate a update_meta_cache
Il mio tema chiama la funzione update_meta_cache() 58 volte per pagina! Questa funzione esegue la seguente query basandosi sul post in questione:
SELECT post_id, meta_key, meta_value
-> FROM wp_postmeta
-> WHERE post_id IN (81649)
-> ORDER BY meta_id ASC
-> ;
La maggior parte delle meta_key (e dei relativi valori) restituiti non sono necessari per la pagina in questione (ad esempio yoast_wpseo_title, _edit_last, _edit_lock non servono per il loop della homepage).
Esiste un modo per ridurre o prevenire le chiamate a update_meta_cache? Forse includendo una funzione nell'hook pre_get_posts?

Ogni volta che utilizzi la funzione get_post_meta()
, verrà eseguita la query sopra per ottenere tutti i meta dei post e memorizzarli nella cache. Più post interroghi, più query vengono eseguite.
Per ridurre il numero di query, dovremmo pre-cache tutti i valori meta di tutti i post nella query prima di chiamare get_post_meta
.
Questo è il codice di esempio tratto da un tutorial:
add_filter( 'posts_results', 'cache_meta_data', 9999, 2 );
function cache_meta_data( $posts, $object ) {
$posts_to_cache = array();
// questo di solito ha senso solo quando abbiamo molti post
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;
}

Mi sono appena imbattuto in questo problema, poiché sto vedendo una tonnellata di richieste update_meta_cache()
eseguite. Con questa modifica nel file function.php del mio tema, continuo a vedere molte query di questo tipo? SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (8987) ORDER BY meta_id ASC
... sto facendo qualcosa di sbagliato?

Nessun effetto, è una cattiva idea usare codice casuale del 2011 sull'ultima versione di WP, è cambiato così tanto.

Ho semplicemente cercato "update_meta_cache" nella "cartella whole world press" e terminato.. Ora il sito funziona come se lo stessi usando offline.. super veloce.

NON MEMORIZZARE IN CACHE TUTTI I POST (DEL SITO) IN UNA VOLTA SOLA - ciò che l'autore intende qui sono tutti i post recuperati per una pagina specifica, non tentare di precaricare nella cache centinaia, migliaia, milioni ecc. di post, potrebbe danneggiare il tuo sito. Se hai bisogno di un'ampia memorizzazione nella cache, utilizza una soluzione o un plugin di caching per pagina. (il testo in grassetto sembra solo fuorviante per i nuovi arrivati casuali)

Per una WP_Query
, la cache può essere disabilitata impostando determinati parametri di caching su false
.
Allo stesso modo, per WP_Term_Query
, può essere disabilitata includendo update_term_meta_cache => false
negli argomenti della query.
Inoltre, il filtro update_{$meta_type}_metadata_cache può essere utilizzato per disabilitare la cache dei metadati per tutte le query sul tipo di oggetto. (es. update_post_metadata_cache
, update_term_metadata_cache
, ecc.)
