WordPress 6.0分类查询性能优化详解及自定义分类法应用
WordPress 6.0 版本中,性能团队对术语查询(term queries)进行了全面优化,显著提升了网站加载速度和用户体验。术语查询在页面加载中扮演着重要角色,因此对其进行改进能够带来显著的性能提升。本文将深入探讨 WordPress 6.0 中术语查询的优化措施,涵盖缓存改进、导航菜单性能提升以及 term_exists 函数的转换等多个方面。
文章目录
Toggle
改进术语查询缓存
提高导航菜单项的性能
将 term_exists 转换为使用 get_terms
为分类查询添加限制
改进术语查询缓存
自 WordPress 4.6 版本以来,WP_Term_Query 查询已被缓存,但在 6.0 版本中,团队进一步优化了缓存的准备和处理方式。这一改进使得术语查询的缓存效果更加持久,显著减少了重复查询,从而提升了页面加载速度。
移除缓存限制
在 WordPress 6.0 之前,术语查询缓存仅限于使用持久对象缓存的 24 小时。这一限制在 6.0 版本中被彻底移除,意味着只要缓存未失效,术语查询的缓存时间将大大延长。对于不活跃的站点或夜间维护期间,缓存将保持活跃状态,进一步优化站点性能。详细信息请参考 #54511。
词条查询缓存只缓存词条ID
术语查询缓存经过重新设计,现在仅缓存术语 ID 而非整个术语对象。这一改变大幅减少了缓存占用的内存空间,避免了会话或持久对象缓存资源的过度消耗。_prime_term_cache 函数会在加载所有术语 ID 后被调用,确保未缓存项被及时加载。若术语已存在于内存中,系统将避免重复加载,从而提升性能。在页面加载过程中,一个术语可能被多次请求,例如标签存档页面。在页面加载初期,get_term_by 会启动缓存项,而后续调用如 get_the_terms 将利用已加载的缓存,显著减少查询次数。详细信息请参考 #37189。
改进的术语查询缓存键生成
以往,具有相似缓存键的相似术语查询会导致单次页面加载中运行两次基本相同的查询。由于现在所有查询都仅获取术语 ID 并存储在缓存中,缓存完全一致。例如,若您通过 get_terms 请求所有类别并仅返回字段 slug,再次执行相同查询但仅请求名称时,系统将命中同一缓存。另一个改进是处理 WP_Term_Query 可接收的不明确参数,如 slug 可为字符串或数组。系统会将此类参数统一转换为数组,确保缓存重用率更高。详细信息请参考 #55352。
提高导航菜单项的性能
wp_get_nav_menu_items 函数已转换为使用分类查询,替代了原有的 get_objects_in_term 函数。这一替换将两个查询的使用简化为单一查询,大幅减少了每个菜单请求的查询次数,并提升了查询的一致性。详细信息请参考 #55372。
在 wp_get_nav_menu_items 中填充所有术语和文章缓存
wp_get_nav_menu_items 函数现调用 _prime_term_cache 和 _prime_post_cache,确保所有与菜单项相关的对象(包括术语和文章)都被缓存。若菜单包含类别和页面列表,所有相关对象将在两个缓存调用中准备就绪,显著减少数据库和缓存的请求次数。详细信息请参考 #55428。
将 term_exists 转换为使用 get_terms 函数
term_exists 函数现已转换为使用 get_terms(WP_Term_Query) 进行内部查询,替代了原始未缓存的数据库查询。这一转换带来了诸多好处,包括与其他核心功能的一致性(如 get_term_by 过滤结果的能力)以及缓存 get_terms 结果。term_exists 专为后端使用设计,主要用于写入 term 表的核心功能,但部分主题和插件开发人员仍使用 term_exists,导致前端运行不可缓存和不可过滤的查询。现在 term_exists 已被缓存,自定义导入/迁移工具需检查是否正确缓存了失效词条。若使用 wp_insert_term 等核心函数,无需额外操作,核心会自动处理缓存失效。但手动写入 term 表时,可能需调用 clean_term_cache 函数。确保 term_exists 获取未缓存结果的方法有两种:使用新的 term_exists_default_query_args 过滤器,或使用 wp_suspend_cache_invalidation 函数。详细信息请参考 #36949。
为分类查询添加限制
WP_Tax_Query 类用于 WP_Query 按术语限制查询,其背后依赖 WP_Term_Query,因此将获得上述缓存改进的好处。WP_Tax_Query 在将术语 slugs/名称转换为查询术语 ID 时添加了限制,显著提升了查询性能,并提高了现有缓存查询在对象缓存中的存活率。例如,标准标签存档调用 get_term_by 并准备缓存,当到达 WP_Tax_Query 时,系统将从缓存中加载数据,从而删除每个标签存档页面的一个查询。详细信息请参考 #55360。