在数据库查询中添加缓存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
感谢 @ flixos90 、 @ milana_cap 、 @ peterwilsoncc 的同行评审和@shetheliving的校对。