WordPress 6.3 改进和增强了 Meta 数据的能力和延迟加载功能
WordPress 6.3 改进和增强了 Meta 数据的能力,增强了分类/标签、评论和站点的 Meta 数据的延迟加载功能,这些改进是为了提高性能和代码可读性,并确保在不同 Meta 数据类型之间一致的开发者体验。
这里首先说明一下,在 WordPress 中,延迟加载 Meta 数据功能是指即仅在实际需要时加载与各种元素相关联的 Meta 数据的一种技术。与一开始就获取和加载所有 Meta 数据不同,延迟加载是将 Meta 数据推到一个队列中,直到请求特定类型的 Meta 数据时才一起加载,从而减少不必要的数据库查询或缓存查找,提高整体性能。
分类/标签 Meta 数据延迟加载改进
自从 WordPress 4.4 引入延迟加载之后,分类/标签的 Meta 数据一直是延迟加载的,然而延迟加载行为仅适用于 WP_Query
中,在其他核心组件(如 WP_Term_Query
)中,分类/标签的 Meta 数据默认总是被提前加载,除非开发者显式地将 update_term_meta_cache
参数设置为 false,但是许多开发者都忽略了这个参数,导致了分类/标签的 Meta 数据的不必要加载。
WordPress 6.3 开始改进了 WP_Term_Query
,不再提前加载分类/标签的 Meta 数据,而是将其添加到专门用于加载分类/标签的 Meta 数据的队列中,这个队列是通过存储在当前线程的内存中的数组实现,性能优越。此外,它还允许开发者在预期稍后需要分类/标签 ID 时方便地包含它们,只有在第一次调用 get_term_meta
函数时,分类/标签的 Meta 元数据才会在单个请求中加载。
为了改进分类/标签的 Meta 数据的延迟加载,核心代码中引入了一个名为 wp_lazyload_term_meta()
的函数,它为处理分类/标签的 Meta 数据提供了一种高效的机制,并有助于优化 WordPress 的整体性能。使用它非常简单,只需将一个分类/标签的 ID 数组传递给该函数,如下所示:
wp_lazyload_term_meta( array( 1, 2, 3 ) );
WordPress 6.3 对 WP_Query
中分类/标签的 Meta 数据的处理引入了更多改进,调用函数 wp_queue_posts_for_term_meta_lazyload
将所有与查询文章相关联的分类/标签的 ID 添加到延迟加载 Meta 数据队列中,之前 WordPress 6.2 中对这个函数进行了改进,通过使用 wp_cache_get_multiple()
提高了这个函数的性能。
还去除了一个不必要的检查以验证分类/标签的存在,因此当调用 wp_queue_posts_for_term_meta_lazyload()
时,它不再为每个 ID 执行 get_term
,因为不存在的可能性非常小。
评论 Meta 数据延迟加载改进
与分类/标签的 Meta 数据类似,之前 WordPress 中的评论 Meta 数据仅在 WP_Query
中被延迟加载,现在,在 WP_Comment_Query
类中,也不再提前加载评论的 Meta 数据,而是将其添加到延迟加载 Meta 数据队列中,并仅在使用时加载,这使得分类/标签和评论的 Meta 数据之间的逻辑保持一致,同时使代码更加易读,因此 wp_queue_comments_for_comment_meta_lazyload()
函数现在不再需要,已被弃用。
站点 Meta 数据也支持延迟加载
站点 Meta 数据(Site meta)可以让开发者为多站点网络中的站点添加 Meta 数据来扩展多站点功能,不要把站点 Meta 数据和网络 Meta 数据(network meta)搞混,后者用于网络选项,站点 Meta 数据在核心中只在一个地方被使用,它主要是为插件使用而设计。
之前调用 WP_Site_Query
或 get_sites()
时,开发者必须向查询传递一个 update_site_meta_cache
参数,以确保站点 Meta 数据不被提前加载,从而导致缓存查找或数据库查询。现在当 update_site_meta_cache
为 true 时,站点 ID 将被添加到队列中,然后一旦调用 get_site_meta()
,队列中的所有 ID 都将在一次就被调用并被加载。
同样为了方便调用,核心代码中也添加了一个新函数,用于将站点 ID 添加到队列,名为 wp_lazyload_site_meta()
,它可以通过传递一个站点 ID 数组来使用:
wp_lazyload_site_meta( array( 1, 2, 3 ) );
延迟加载的一般改进
负责延迟加载元数据的 WP_Metadata_Lazyloader
类经过了重构,以提高代码的可维护性,作为这次重构的一部分,该类的 lazyload_term_meta
和 lazyload_comment_meta
方法已被弃用,这些方法已被更通用的 lazyload_meta_callback
方法替代,该方法可重复用于任何 MEta 数据类型。
如果您的代码中使用了 lazyload_term_meta
和 lazyload_comment_meta
方法,建议转换为使用 lazyload_meta_callback
,这一改进使 Meta 数据 API 易于扩展,以便在未来支持其他元数据类型,如文章和用户。
延迟加载 Meta 数据还有进一步的改进,首先实现了验证在处理前请求的 ID 是否已经在队列中,比如已将三个项目(ID 5、6 和 7)添加到 Meta 数据懒加载队列中,然而,当调用 get_term_meta
函数时,请求 的 ID 9,它不在队列中,在 6.3 之前将会导致额外的数据库或缓存查询,而最新的改进,则在处理前检查队列以查看当前 ID 是否已经在队列中,如果没有,则将 ID 添加到队列,防止不必要的查询。
评论、分类/标签和站点的 Meta 数据处理发生了重大变化,在更新的实现中,_prime_term_cache()
和 WP_Term_Query
等函数中的 prime meta
参数始终受到尊重。然而现在不是直接提前加载 Meta 数据,而是将其添加到 Meta 数据队列中,以前,这些函数和类中存在一致性问题。例如,在 _prime_term_cache()
中,如果分类/标签已经存在于缓存中,分类/标签 Meta 数据将不会被提前加载,这导致了令开发者困惑的体验和性能下降。
现在通过最新的改进,将 ID 添加到队列时,请求时几乎没有性能影响。因此,这些函数和类预计将以更可预测的方式运行,开发者可以依赖评论、分类/标签和站点的 Meta 数据处理方面的一致行为和提高的性能。