私のテーマは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フックの関数に含める方法は?
関数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;
}