WP_Query 主要用4个用于缓存相关的参数和使用到函数有:
cache_results
是否缓存查询的文章信息。
默认情况分两种,使用外部对象缓存(比如使用 Memcached)就是 false,没有使用则是 true。
做了几次测试,true 和 false 没什么区别,感觉有点重复,所以这个建议设置为 false。
update_post_term_cache 参数
是否缓存 post term 的内容,默认也是 true。
update_post_term_cache 开启之后,在列表页使用 get_the_terms 函数的时候,不需要导数据里面去请求每个 post 的各种 taxonomy 的 term 的信息,它会把整个列表所有文章的所有 taxonomy 的 term 一起全部请求出来。
update_post_meta_cache 参数
是否缓存 post meta 的内容,默认是 true。
update_post_meta_cache 开启之后,在列表页使用 get_post_meta 函数的时候,不需要导数据里面去请求每个 post_id 的 post meta 的信息,它会把整个列表所有文章的 post meta 一起全部请求出来。
update_post_caches 函数
WordPress 会使用 _prime_post_caches 这个函数进行批量的 ids 的pote_term 和 post_meta 的请求:
_prime_post_caches( $ids, $q['update_post_term_cache'], $q['update_post_meta_cache'] );
它的源代码很好的解释了它的工作原理是:
function _prime_post_caches( $ids, $update_term_cache = true, $update_meta_cache = true ) { global $wpdb; $non_cached_ids = _get_non_cached_ids( $ids, 'posts' ); if ( !emptyempty( $non_cached_ids ) ) { $fresh_posts = $wpdb->get_results( sprintf( "SELECT $wpdb->posts.* FROM $wpdb->posts WHERE ID IN (%s)", join( ",", $non_cached_ids ) ) ); update_post_caches( $fresh_posts, 'any', $update_term_cache, $update_meta_cache ); } }
首先使用 _get_non_cached_ids 函数获取未缓存的 post_ids(如果开启了 Memcached,这里就可以自动实现返回为空,就会大大减少 SQL 请求),然后使用一条 IN 查询获取这些 post_ids 的内容,最后再使用 update_post_caches 将新获取的 posts 缓存起来,然后并且一次性求获取所有相关的 post_term 和 post_meta。
lazy_load_term_meta 参数
是否延迟加载 term meta 的内容,如果没有设置,默认根据 update_post_term_cache 的值而定。
如果为 true 的话,WP_Query 会把列表页所有的 term_ids 临时存储下来,在当前页第一次使用 get_term_meta 函数的时候,把 term_ids 的所有 term_meta 一次全部请求出来。
如果设置为 false 的话,每个 get_term_meta 的函数,都会产生一条 SQL 请求。
当然你也可以自己收集所有相关的 term_ids,然后使用 update_termmeta_cache($term_ids) 来一次获取所有 term_meta 的值。