WordPress 6.3 改进了核心类 WP_User_Query 的缓存能力

WordPress 6.3 对 WP_User_Query 类做了进行了显著的改进,特别是关于数据库查询缓存的部分,WordPress 在 6.1 对 WP_Query 引入了查询缓存,而其他查询类(如 WP_Comment_QueryWP_Site_QueryWP_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 那样运行。这确保了插件的兼容性和功能不受影响。


©我爱水煮鱼,本站推荐使用的主机:阿里云,国外主机建议使用BlueHost

本站长期承接 WordPress 优化建站业务,请联系微信:「chenduopapa」。