Ridurre o prevenire le chiamate a update_meta_cache

6 mag 2015, 12:50:36
Visualizzazioni: 14.9K
Voti: 6

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?

1
Commenti

Solo una nota a margine: Spiegazione di update_post_(meta/term)_cache.

Howdy_McGee Howdy_McGee
1 feb 2016 18:32:42
Tutte le risposte alla domanda 2
5

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;
}
1 giu 2015 07:10:34
Commenti

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?

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

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

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

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.

MFarooqi MFarooqi
13 feb 2020 21:51:27

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)

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

Ciao @MFarooqi potresti approfondire un po' di più come hai risolto? Sto ancora avendo lo stesso problema qui.

Leo Leo
4 mar 2022 22:46:59
1

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

11 set 2021 00:47:04
Commenti

Grazie per i tuoi suggerimenti, @plong0, sembra essere esattamente ciò che stavo cercando. Mi attendono divertenti esperimenti con meno meta caching :)

vlood vlood
27 giu 2023 17:59:33