从 WP 6.1 开始,WordPress 核心中为某些数据库查询添加了缓存功能。特别是,WP_Query 请求的缓存。这提高了系统的性能。
WP_Query 中的查询缓存
在 WordPress 6.1 中,WP_Query 类中实现的数据库查询会被缓存。因此,如果同一个数据库查询被执行多次,后续的结果将从缓存中加载。
如果您的站点使用持久对象缓存,数据库查询将被缓存到对象缓存中,并且不会被执行,直到缓存被清除。所有这些都减少了站点整体的数据库查询数量。
如果未设置持久缓存(使用内存缓存),站点也会受益,因为页面上的重复查询不会被执行,而是从缓存中获取。然而,在这种情况下,性能提升不会那么显著。
开发者指南
开发人员需要确保使用内置的 WP 函数,例如 wp_insert_post(),来添加或更新文章。这些函数将确保适当的缓存失效。
如果你直接更新数据库,在更新数据库中的一行后,请确保使用 clean_post_cache() 函数清除文章缓存。
如何禁用缓存?
数据库查询的缓存现在在 WP_Query 中默认启用。
如果你需要禁用查询缓存,请设置参数 cache_results=false
:
$query = new WP_Query( [
'posts_per_page' => 50,
'cache_results' => false
] );
如果你需要全局禁用所有查询的缓存,请使用 parse_query 过滤器:
add_action( 'parse_query', 'disable_caching' );
function disable_caching( $wp_query ) {
$wp_query->query_vars['cache_results'] = false;
}
为了获得更好的性能,强烈建议保持缓存启用,并在需要时使用 clean_post_cache() 函数选择性地清除缓存。
缓存键(如何确定缓存是否存在)
是否存在缓存是通过比较缓存键来确定的。
缓存键是根据传递给 WP_Query{} 的查询参数创建的。但是,以下参数会被忽略:
suppress_filters
cache_results
fields
update_post_meta_cache
update_post_term_cache
update_menu_item_cache
lazy_load_term_meta
这些参数不会影响数据库查询。需要注意的是 fields
参数。这意味着如果你执行以下操作:
$query1 = new WP_Query( [
'posts_per_page' => 50,
'fields' => 'ids'
] );
$query2 = new WP_Query( [
'posts_per_page' => 50,
'fields' => 'all'
] );
在这两种情况下,查询现在将请求所有字段,以便结果可以被缓存并在不考虑 fields
参数的情况下使用。
在此更改之前,这两个案例的数据库查询是不同的,但保持这种状态会导致实际上是相同数据的多个缓存。这意味着现在当将 fields
限制为 id 时,性能提升将低于之前版本的 WordPress。
此更改还意味着参数(缓存) update_post_meta_cache
和 update_post_term_cache
始终被考虑。
现在不必要的插件
建议禁用并删除为 WP_Query 添加缓存功能的插件。例如:
有关更多信息,请参阅 Trac 票 #22176。
在 WP_Query 中缓存用户
在 WordPress 6.1 中,引入了一个新函数 update_post_author_caches()。
在 6.1 版本之前,多作者网站需要进行多个单独的数据库查询来检索作者信息。这是因为用户数据是在循环过程中加载的。
现在,不是单独加载每个用户,而是在循环开始时通过一个查询加载循环中所有用户的所有数据 - 参见 update_post_author_caches()。这大大减少了数据库查询的数量。
在核心代码的其他关键位置也添加了对 update_post_author_caches() 的调用。这提高了性能。
缓存菜单项的相关对象
核心中添加了一个新函数 update_menu_item_cache()。它接受一个文章对象数组,并缓存菜单项引用的文章或分类对象。
为 WP_Query 添加了一个新参数 update_menu_item_cache
。如果设置为 true,它将调用 update_menu_item_cache(),允许您在两次数据库查询中缓存菜单项(一次用于文章,一次用于分类)。
--
来源