前面博客吧整理了wordpress的WP_Query类使用方法和所有参数,其中有几个用于缓存相关的参数和函数,分别是cache_results
、update_post_term_cache
、update_post_meta_cache
、update_post_caches
以及lazy_load_term_meta
,下面对其分别进行介绍说明。
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的请求:
1 |
_prime_post_caches( $ids, $q['update_post_term_cache'], $q['update_post_meta_cache'] ); |
它的源代码很好的解释了它的工作原理是:
1 2 3 4 5 6 7 8 9 10 |
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的值。
原文地址:http://blog.wpjam.com/m/wp_query-cache-args/
原创文章,作者:kirin,如若转载,请注明出处:https://blog.ytso.com/248428.html