WordPress 6.1:开启零SQL时代,WP_Query 查询性能大幅提升!

WP_Query 是 WordPress 中的核心类,几乎所有页面的文章获取都依赖于它。然而,它的一个主要缺陷在于,查询文章时直接访问数据库,而查询结果未被缓存,从而造成了实现网站零 SQL 查询的障碍。

我曾通过不同的方法实现过零 SQL 查询,应用于 Autumn Pro 和免费的 Sweet 主题上。而如今,官方已在 WP_Query 中引入了数据库查询缓存,这无疑会大幅提升 WordPress 的整体性能。

WP_Query 与数据库查询缓存的实现

WordPress 6.1 对 WP_Query 类的数据库查询执行方式进行了优化,现已实现 SQL 查询缓存。这意味着,当相同的 SQL 查询被多次调用时,结果将直接从缓存中获取。

对于那些使用持久对象缓存服务(如 Memcached)的站点,在缓存有效期内,相同的数据库查询不会重复执行,这样显著减少了数据库查询的次数。

即使是未使用内存缓存的站点,相同页面中的 WP_Query 也不会重复执行,这同样会提升站点的性能,但效果不如使用 Memcached 明显。因此,我一直强调在 WordPress 站点上安装 Memcached 的必要性。

WP_Query 的数据库查询缓存有其独特的实现机制,因此,对于插件和主题的开发者来说,进行文章操作时,最好还是使用 WordPress 提供的文章操作函数。

例如,使用 wp_insert_post 函数来向数据库添加文章时,这些函数会自动清理缓存,以确保下次通过 WP_Query 获取的文章数据包含新增或更新的信息。

如果直接使用 SQL 更新数据库,建议在执行后调用 clean_post_cache 函数以清除缓存。

如何禁用缓存

需要注意的是,默认情况下,WP_Query 的所有数据库查询都会被缓存。如若想禁用缓存,只需将 cache_results 参数设为 false 即可:

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

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

add_action('parse_query', function($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

因为这些忽略的参数不会影响生成的 SQL 语句,其中 fields 参数尤其需要关注,这表明以下查询:

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

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

在这两种情况下,无论是否使用 fields 参数,以及其具体值如何,SQL 查询都是一致的,因此可以有效利用缓存,而无需存储多个缓存数据。

WP_Query 初始化所有作者数据

在 6.1 版本之前,主循环会同时加载每位作者的信息,这导致拥有多个作者的站点需要多次查询数据库来获取各自的信息。而现在,WordPress 6.1 引入了新函数 update_post_author_caches,通过在循环开始时调用该函数,可以一次性初始化所有用户(作者)的缓存,而无须逐个加载,这样减少了数据库查询的次数。

该函数接受一个 post 对象数组作为参数,并会初始化用户缓存。WP_Query 会自动调用 update_post_author_caches,以提升站点的性能。

初始化菜单中的所有链接对象

在 WordPress 6.1 中,还新增了函数 update_menu_item_cache,该函数支持一个 post 对象数组作为参数,能够初始化菜单中所引用文章或分类的数据缓存。此外,WP_Query 还增加了新参数 update_menu_item_cache,若该参数设为 true,则仅需通过两条 SQL 查询(针对 posts 和 terms)即可获取菜单信息。

get_page_by_title 直接调用 WP_Query

get_page_by_title 函数在 6.1 版本中也改为使用 WP_Query 来获取数据。此前,该函数是通过 SQL 查询直接获取页面的标题。如今,WP_Query 的查询结果将被缓存,这意味着调用 get_page_by_title 也将被缓存,当然,所有通过 WP_Query 获取的数据函数也将获得同样的缓存效果。

我对 WordPress 6.1 的期待很高,最终效果如何,我将及时与大家分享,WPJAM Basic 也会第一时间进行更新和兼容。

本文标题:WordPress 6.1:开启零SQL时代,WP_Query 查询性能大幅提升!
网址:https://www.2090ai.com/2025/09/10/tutorial/61661.html



本站所有文章由wordpress极光ai post插件通过chatgpt写作修改后发布,并不代表本站的观点;如果无意间侵犯了你的权益,请联系我们进行删除处理。
如需转载,请务必注明文章来源和链接,谢谢您的支持与鼓励!