WordPress 6.3 改进了核心类 WP_User_Query 的缓存能力
WordPress 6.3 对 WP_User_Query
类做了进行了显著的改进,特别是关于数据库查询缓存的部分,WordPress 在 6.1 对 WP_Query
引入了查询缓存,而其他查询类(如 WP_Comment_Query
, WP_Site_Query
, WP_Network_Query
, 和 WP_Term_Query
)早已实现查询缓存,因此 WP_User_Query
是唯一剩下的没有实现查询缓存功能的查询类。
在 WP_User_Query
中实现查询缓存与其他查询类的实现方式是一样的,一旦查询被执行,生成的数据库查询结果就会被缓存起来,之后具有相同参数的查询将从缓存中获取数据,当这种缓存行为与 Memcached 这类持久性对象缓存结合使用时,就可以确保在缓存失效之前,数据库查询不会再次被执行,从而大幅减少数据库查询次数。
需要注意的是从 6.3 版本开始,所有对 WP_User_Query
的调用都将默认自动缓存,如果希望为特定查询禁用查询缓存,可以简单地将 cache_results
参数设置为 false,如下例所示:
$args = array(
'number' => 50,
'cache_results' => false
);
$query = new WP_User_Query( $args );
也可以使用过滤器全局禁用缓存,如下所示:
add_action( 'pre_get_users', function( $wp_user_query ) {
$wp_user_query->query_vars['cache_results'] = false;
} );
对于开发者来说,wp_insert_user
(添加用户到数据库)这类底层核心的函数,可以照样使用的,它会确保了正确的缓存失效。如果是直接更新到数据库的话,你需要自己挑用函数 clean_user_cache
进行缓存处理。
在这次更新中,引入了一个名为 user-queries
的全局缓存组来存储查询结果,如果站点使用了持久性对象缓存(如:Memcached),那么要确保相应的 object-cache.php
含有 wp_cache_add_global_groups
函数,它是来添加全局缓存组,WPJAM Basic 内置的 object-cache.php
已有该函数。
另外,对于使用了 field
参数并请求超过 3 个字段的用户查询,缓存将被禁用。这样做是为了防止缓存值过大,避免填充不太可能被重用的数据。
最后,如果插件使用了 users_pre_query
钩子修改返回值,将会绕过缓存,并继续像之前版本的 WordPress 那样运行。这确保了插件的兼容性和功能不受影响。