Redu sau previne apelarea funcției update_meta_cache

6 mai 2015, 12:50:36
Vizualizări: 14.9K
Voturi: 6

Tema mea apelează funcția update_meta_cache() de 58 de ori pe pagină! Această funcție pare să execute următoarea interogare bazată pe postarea în cauză:

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

Majoritatea meta_key-urilor (și valorile corespunzătoare) returnate nu sunt necesare pentru pagina în cauză (de exemplu, yoast_wpseo_title, _edit_last, _edit_lock nu sunt necesare pentru bucla paginii de start).

Există vreo metodă de a reduce sau preveni apelarea funcției update_meta_cache? Poate există o modalitate de a include într-o funcție pe hook-ul pre_get_posts?

1
Comentarii

Doar o observație laterală: Explicația despre update_post_(meta/term)_cache.

Howdy_McGee Howdy_McGee
1 feb. 2016 18:32:42
Toate răspunsurile la întrebare 2
5

Oricând folosești funcția get_post_meta(), interogarea de mai sus va fi executată pentru a obține toate metadatele postării și a le stoca în cache. Cu cât interoghezi mai multe postări, cu atât mai multe interogări vor fi efectuate.

Pentru a reduce numărul de interogări, ar trebui să pre-cachezi toate valorile meta ale tuturor postărilor din interogare înainte de a apela get_post_meta.

Acesta este codul exemplu preluat dintr-un tutorial:

add_filter( 'posts_results', 'cache_meta_data', 9999, 2 );
function cache_meta_data( $posts, $object ) {
    $posts_to_cache = array();
    // de obicei are sens doar când avem mai multe postări
    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 iun. 2015 07:10:34
Comentarii

Tocmai am dat peste această problemă, pentru că văd o mulțime de cereri update_meta_cache() făcute. Cu această modificare în fișierul functions.php al temei mele, încă văd multe astfel de interogări? SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (8987) ORDER BY meta_id ASC ... fac ceva greșit?

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

Niciun efect, este o idee proastă să folosești cod aleatoriu din 2011 pe ultima versiune de WordPress, s-au schimbat atât de multe lucruri.

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

Am căutat pur și simplu "update_meta_cache" în "întregul folder WordPress" și l-am oprit.. Acum site-ul rulează de parcă aș folosi offline.. super rapid.

MFarooqi MFarooqi
13 feb. 2020 21:51:27

NU CACHEA TOATE POSTĂRILE (SITEULUI) DEODATĂ - autorul se referă aici la toate postările preluate pentru o anumită pagină, nu încercați să pre-cache-uiți sute, mii, milioane etc. de postări, acest lucru ar putea distruge site-ul vostru. Dacă aveți nevoie de caching extins, folosiți o soluție sau un plugin de caching pe pagină. (textul îngroșat pare doar înșelător pentru noii veniți)

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

Salut @MFarooqi, ai putea să explici puțin mai detaliat cum ai rezolvat problema? Încă am aceeași problemă aici.

Leo Leo
4 mar. 2022 22:46:59
1

Pentru un WP_Query, caching-ul poate fi dezactivat prin setarea anumitor parametri de caching la false.

În mod similar pentru WP_Term_Query, acesta poate fi dezactivat prin includerea update_term_meta_cache => false în argumentele interogării.

În plus, filtrul update_{$meta_type}_metadata_cache poate fi folosit pentru a dezactiva caching-ul de metadate pentru toate interogările pe tipul de obiect. (ex. update_post_metadata_cache, update_term_metadata_cache, etc)

11 sept. 2021 00:47:04
Comentarii

Mulțumesc pentru sugestii, @plong0, se pare că exact la asta mă uitam. Mă așteaptă experimente distractive cu mai puțin caching meta :)

vlood vlood
27 iun. 2023 17:59:33