web-dev-qa-db-fra.com

Réduire ou empêcher l'appel de update_meta_cache

Mon thème appelle la fonction update_meta_cache () 58 fois par page! Cette fonction semble exécuter la requête suivante en fonction de la publication en question:

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

La grande majorité des meta_keys (et les valeurs correspondantes) renvoyées ne sont pas nécessaires pour la page en question (par exemple, yoast_wpseo_title, _edit_last, _edit_lock ne sont pas nécessaires pour la boucle de page d'accueil).

Existe-t-il un moyen de réduire ou d’empêcher l’appel de update_meta_cache? Peut-être un moyen d'inclure dans une fonction sur le hook pre_get_posts?

5
Josh

Chaque fois que vous utilisez la fonction get_post_meta(), la requête ci-dessus est exécutée pour obtenir la méta all post et le stocker dans le cache. Plus vous posez de questions, plus vous posez de questions.

Pour réduire le nombre de requêtes, nous devrions pré-mettre en cache toutes les méta-valeurs de toutes les publications dans la requête avant d'appeler get_post_meta.

Ceci est l'exemple de code tiré de un tutoriel :

add_filter( 'posts_results', 'cache_meta_data', 9999, 2 );
function cache_meta_data( $posts, $object ) {
    $posts_to_cache = array();
    // this usually makes only sense when we have a bunch of 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
Anh Tran