web-dev-qa-db-ja.com

Update_meta_cacheの呼び出しを減らすか防ぐ

私のテーマは1ページにつき58回update_meta_cache()関数を呼び出します!この関数は、問題の投稿に基づいて次のクエリを実行するようです。

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

返されるメタキー(および対応する値)の大多数は、問題のページには不要です(たとえば、yoast_wpseo_title、_ edit_last、_ edit_lockはホームページループには必要ありません)。

Update_meta_cacheの呼び出しを減らすまたは防ぐ方法はありますか?おそらくpre_get_postsフックの関数に含める方法は?

5
Josh

関数get_post_meta()を使うときはいつでも、上記の問い合わせはall postメタを取得してキャッシュに保存するために実行されます。投稿数が多いほど、クエリ数は多くなります。

クエリの数を減らすために、get_post_metaを呼び出す前に、 すべての投稿のすべてのメタ値をプリキャッシュする にする必要があります。

これは チュートリアル から取ったサンプルコードです。

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