WP_Query 和缓存相关的参数及函数

前面罗列过 WP_Query 的所有参数,今天研究 WP_Query 的缓存,把所有相关的缓存参数都翻了一遍,做一下简单笔记。

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 ( !empty( $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 的值。

热门文章