WordPress 6.1 增加了对 WP_Query 缓存改进性能

WP_Query 数据库查询中添加缓存

WordPress 6.1 包括对如何在WP_Query类中执行数据库查询的改进,导致数据库查询将被缓存。这意味着如果多次运行同一个数据库查询,结果将从缓存中加载。对于那些使用持久对象缓存的人来说,这意味着数据库查询在缓存失效之前不会再次运行,从而导致对数据库的查询要少得多。使用内存缓存的站点也将看到不重复这些查询的好处,尽管性能改进不会那么显着。

对于那些进行自定义开发的人,请确保您正在使用核心功能,例如wp_insert_post将帖子添加到数据库。这些函数维护得很好,通过使用它们,您可以确保缓存正确无效。如果您是直接更新数据库,那么强烈建议您在更新数据库行后调用clean_post_cache函数。

值得注意的是,默认情况下,所有WP_Query调用都将被缓存。只需将参数cache_results传递为 false,就可以选择退出缓存查询。参见示例:

$args = array(
     'posts_per_page' => 50,
     'cache_results'  => false  
);  
$query = new WP_Query( $args );

也可以使用过滤器全局禁用缓存:

function disable_caching( $wp_query ) {     
    $wp_query->query_vars['cache_results'] = false;  
}  
add_action( 'parse_query', 'disable_caching' );

像这样禁用缓存应该只在极端情况下进行。为了获得最佳性能,强烈建议使用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。这意味着如果您运行以下命令:

$args1 = array(
      'posts_per_page' => 50,
      'fields'  => 'ids'
);  
$query1 = new WP_Query( $args1 );     
$args2 = array(
      'posts_per_page' => 50,
      'fields'  => 'all'  
);  
$query2 = new WP_Query( $args2 );

在这两种情况下,查询现在都将请求所有字段,以便可以缓存结果,然后无论fields参数如何都可以使用。在此更改之前,这两者的数据库查询是不同的,但保持这种状态会导致多个缓存有效地用于相同数据的子集。这意味着现在限制fields id 时的性能改进不如以前版本的 WordPress。

此更改还意味着始终尊重update_post_meta_cacheupdate_post_term_cache缓存。

如果WP_Query使用诸如advanced-post-cacheEnhanced Post CacheCache WP_Query等插件添加缓存,则建议禁用并删除这些插件,因为它们不再需要。

有关详细信息,请参阅Trac 票证 #22176

WP_Query 主要用户缓存

WordPress 6.1 引入了一个新功能,update_post_author_caches。 在 6.1 之前,具有多个作者的站点需要几个单一的数据库查询来获取作者信息,因为用户是作为循环的一部分加载的。现在,用户(作者)缓存不是一个一个地加载每个用户,而是通过在循环开始时调用而在单个数据库调用中准备好update_post_author_caches,从而减少了数据库查询。

此函数接受一个帖子对象数组,并将初始化用户缓存。update_post_author_caches代码库的关键部分也添加了调用以提高数据库性能。

有关详细信息,请参阅 Trac 票证#55716

菜单项的主要链接对象

核心中添加了一个新功能,称为update_menu_item_cache。 它接受一个帖子对象数组,并为菜单项中引用的帖子或术语提供缓存。WP_Query添加了一个名为update_menu_item_cache的新参数。当设置为true它时,它将调用update_menu_item_cache这将允许您在两个数据库查询中初始化菜单项(一个用于帖子,一个用于术语)。

有关详细信息,请参阅 Trac 票证#55620

get_page_by_title 现在使用 WP_Query

函数get_page_by_title现在使用WP_Query。以前,此函数使用原始数据库查询按标题获取页面。如上所述,WP_Query现在已缓存,这意味着对get_page_by_title的调用也将被缓存。这有助于运行 WP_Query 中的所有过滤器。

有关详细信息,请参阅 Trac 票证#36905