在 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_cache
和update_post_term_cache
缓存。
如果WP_Query
使用诸如advanced-post-cache、Enhanced Post Cache或Cache 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