woocommerce/docs/features/high-performance-order-storage
2026-04-03 17:34:26 +08:00
..
cli-tools.md docs: add 260 translated files 2026-03-09 19:53:58 +08:00
enable-hpos.md docs: add 260 translated files 2026-03-09 19:53:58 +08:00
guide-large-store.md docs: add 206 translated files 2026-04-03 17:34:26 +08:00
README.md docs: add 260 translated files 2026-03-09 19:53:58 +08:00
recipe-book.md docs: add 260 translated files 2026-03-09 19:53:58 +08:00
wc-order-query-improvements.md docs: add 260 translated files 2026-03-09 19:53:58 +08:00

title post_status comment_status taxonomy
高性能订单存储 (HPOS) publish open
category post_tag
woocommerce
High Performance Order Storage
Features
Repos

高性能订单存储 (HPOS)

WooCommerce 传统上将商店订单以及相关的订单信息(例如退款)存储为自定义的 WordPress 帖子类型或帖子元记录。这会导致性能问题。

高性能订单存储 (HPOS),也曾被称为“自定义订单表”,是一种解决方案,它提供了一种易于理解且稳固的数据库结构,专为电子商务需求设计。它使用 WooCommerce CRUD 设计,将订单数据存储在自定义表中,这些表针对 WooCommerce 查询进行了优化,并且对商店的性能影响最小。

2022 年 1 月,我们发布了 自定义订单表功能的初始计划,此后,我们一直在努力将高性能订单存储 (HPOS) 引入 WooCommerce 核心。2022 年 5 月,我们邀请您 测试订单迁移过程,并提供关于我们初步工作在各种配置的真实商店中的表现的反馈。

从 WooCommerce 8.2 版本开始,该版本于 2023 年 10 月发布,高性能订单存储 (HPOS) 已经正式发布,并且将默认启用,适用于新的安装。

高性能订单存储的改进

将高性能订单存储 (HPOS) 引入 WooCommerce可以改善电子商务商店的以下三个关键属性。

可扩展性

客户数量和订单数量的增加会增加商店数据库的负载,这使得处理客户订单请求并提供无缝的用户体验变得困难。

通过高性能订单存储,您可以获得专门用于存储订单和订单地址的数据表,以及专门的索引,从而减少读/写操作和繁忙的表。此功能使各种规模的电子商务商店能够最大限度地扩展其业务,而无需专家干预。

可靠性

高性能订单存储使实施和恢复有针对性的数据备份变得更加容易。您将不再需要担心丢失订单、库存数量或客户信息,因为这些自定义订单表具有可靠的备份功能。它还将促进实现读/写锁,并防止竞争条件。

简洁性

您不再需要访问大型数据库来查找底层数据和 WooCommerce 条目。

通过高性能订单存储,您可以轻松浏览单独的表和易于处理的条目,与 _posts 表独立,以查找数据或了解表的结构。 它还让您可以轻松开发新的插件,实现商店和产品的设计,并以更大的灵活性修改 WooCommerce。

背景

在 8.2 版本的发布之前WooCommerce 依赖于 _post_postmeta 表的结构来存储订单信息,这在过去几年中发挥了良好的作用。

但是,高性能订单存储引入了专用的表来存储诸如订单和订单地址等数据,因此引入了专用的索引,从而减少了读/写操作和繁忙的表。 此功能使各种规模的电子商务商店能够最大限度地扩展其业务,而无需专家干预。

订单数据从 _posts_postmeta 表同步到四个自定义订单表:

  1. _wc_orders
  2. _wc_order_addresses
  3. _wc_order_operational_data
  4. _wc_orders_meta

启用该功能

从 2023 年 10 月发布的 WooCommerce 8.2 版本开始HPOS 默认启用新安装。 现有商店可以查看 如何启用 HPOS

数据库表

HPOS 使用多个数据库表来存储订单数据。 get_all_table_names 方法位于 OrdersTableDataStore 类 中,该方法将返回所有表的名称。

权威表

在任何给定时间,只要 HPOS 功能已启用,涉及的数据库表就分为两种角色:权威表备份表。权威表是工作表,订单数据将在正常运行期间存储到这些表中并从中检索。备份表会接收权威数据的副本,每当发生 同步 时。

如果 woocommerce_custom_orders_table_enabled 选项设置为 true则 HPOS 处于活动状态,新的表 是权威表,而文章和文章元数据表充当备份表。如果该选项设置为 false则情况相反。可以通过管理界面WooCommerce - 设置 - 高级 - 自定义数据存储)更改该选项。

CustomOrdersTableController 类 挂载到 woocommerce_order_data_store 过滤器上,以便 WC_Data_Store::load( 'order' ); 会返回 OrdersTableDataStore 的实例或 WC_Order_Data_Store_CPT 的实例,具体取决于哪个是权威表。

为了保持数据完整性,在存在待审订单时,切换权威表(从新的表切换到文章表或反之)是不允许的。

同步

同步 是将权威表中的所有待定更改应用到备份表的过程。待审订单 是指在权威表中已修改,但尚未将更改应用到备份表的订单。

这可以通过多种方式发生:

立即同步

如果 woocommerce_custom_orders_table_data_sync_enabled 设置为 true则只要订单在权威表中发生更改同步就会自动且立即发生。

手动同步

当禁用立即同步时,可以通过命令行手动触发,命令如下:wp wc cot sync。 也可以通过编程方式触发,如下所示:

$synchronizer = wc_get_container()->get(Automattic\WooCommerce\Internal\DataStores\Orders\DataSynchronizer::class);
$order_ids = $synchronizer->get_next_batch_to_process( $batch_size );
if ( count( $order_ids ) ) {
	$synchronizer->process_batch( $order_ids );
}

其中 $batch_size 是要处理的订单的最大数量。

计划同步

如果启用了立即同步功能 (woocommerce_custom_orders_table_data_sync_enabled 设置为 true),并且存在待审的订单,则会使用 BatchProcessingController 实例化一个 DataSynchronizer 对象,以便通过计划的操作分批同步已创建/修改/删除的订单。 这种计划安排发生在 CustomOrdersTableController 中,通过钩子 woocommerce_update_options_advanced_custom_data_stores 实现。

如果由于某种原因立即同步已启用但未安排同步则可以通过访问设置页面WooCommerce - 设置 - 高级 - 自定义数据存储)并点击“保存”按钮(即使没有进行任何更改)来重新启动同步。 只要选中了“保持帖子表和订单表同步”复选框,同步计划就会启动,即使之前已经选中。

如果 woocommerce_auto_flip_authoritative_table_roles 选项设置为 true在设置页面中有一个复选框则一旦所有订单都已同步权威表将自动切换。 这由 CustomOrdersTableController 类 处理。

订单删除同步

订单删除的同步比较复杂:如果一个订单存在于一组表中(新的表或文章),但不存在于另一组表中,那么不清楚是需要创建缺失的订单,还是需要删除已存在的订单。理论上,备份表中的缺失订单意味着需要创建,而权威表中的缺失订单意味着需要删除;但是,这存在风险,因为代码中的一个错误很容易导致合法订单被删除。

为了实现一个健壮的订单删除同步机制,采取以下措施。每当一个订单被删除,并且立即同步被禁用时,会在 wp_wc_orders_meta 表中创建一个记录,该记录的键为 deleted_from,值为订单被删除的权威表的名称(wp_wc_orders 表或文章表)。然后在同步时,这些记录会被处理(从相应的表中删除相应的订单),并且在处理完成后,这些记录会被删除。

上述情况的例外是 占位符记录:当对应的订单从 wp_wc_orders 表中被删除时,这些占位符记录会被立即删除,即使立即同步被禁用。

当 "高性能订单存储" 和 "兼容性模式" 启用时WooCommerce 会将数据从文章和文章元数据表中填充到 HPOS 表中。表之间的同步 在本文档中进行了详细说明

您可以在 关于高性能订单存储向后兼容性和同步的文档 中找到关于表之间同步的更详细的解释。

占位符记录

订单 ID 必须在权威表和备份表之间保持一致,否则无法进行同步。用于订单识别和同步的订单 ID 是 wp_wc_orders 表和帖子表中的 id 字段。

如果帖子表是权威表,实现订单 ID 匹配很容易:在 wp_wc_orders 表中创建记录时,使用与帖子相同的 ID 即可。但是,当新的订单表是权威表时,会存在问题:帖子表用于存储多种类型的数据,而不仅仅是订单;并且在需要进行同步时,可能已经存在一个非订单帖子,其 ID 与要同步的订单 ID 相同。

为了解决这个问题,使用了 占位符记录。每当新的订单表是权威表,并且立即同步被禁用时,创建新的订单将会在帖子表中创建一个具有 shop_order_placehold 帖子类型和与订单相同的 ID 的记录;这实际上“预留”了帖子表中的订单 ID。然后在同步时该记录将被正确填充并且其帖子类型将被更改为 shop_order

订单数据存储

您可以自由切换数据存储方式,以在表之间同步数据。

  • 如果选择 "WordPress 帖子表",系统会将订单数据保存在 _post_postmeta 表中。在这种情况下,不会使用订单表。

选择 WordPress 帖子表

  • 如果选择 "高性能订单存储",系统会将订单数据保存在新的 WooCommerce 订单表中。

选择 高性能订单存储

  • 如果选择 "WordPress 帖子表" 并且 "启用兼容性模式",系统将在帖子/postmeta 表和 WooCommerce 订单表之间同步订单数据。

选择 WordPress 帖子表并启用兼容性模式

不兼容的插件

如果您的插件与高性能订单存储不兼容,则 HPOS 选项将在 WooCommerce > 设置 > 高级 > 功能 下被禁用。

不兼容的插件

  • 您可以点击 "查看和管理" 以查看不兼容插件的列表。
  • 或者,您可以访问 https://example.com/wp-admin/plugins.php?plugin_status=incompatible_with_feature&feature_id=custom_order_tables 查看不兼容插件的列表(请将 example.com 替换为您的网站域名)。

插件页面

注意: 如果您正在使用第三方扩展,并且该扩展与高性能订单存储无法正常工作,请通知该扩展的开发者,并要求他们更新扩展以添加对 HPOS 的支持。 扩展的开发者有责任添加对 HPOS 的支持。 我们提供了 开发者资源和文档,以帮助他们的集成工作。

禁用 HPOS

如果遇到问题,或者您需要继续使用尚未与 HPOS 兼容的插件,我们建议您暂时切换回 WordPress 帖子存储

要执行此操作,请导航到 WooCommerce ▸ 设置 ▸ 高级 ▸ 功能,并首先确保 兼容性模式 已启用。 如果尚未启用,您可能需要等待一段时间,以便订单数据在数据存储之间进行同步。

WooCommerce ▸ 设置 ▸ 高级 ▸ 功能 页面

同步完成后,您可以选择 WordPress 帖子存储 (旧版) 作为您的首选选项。 您也可以在此时禁用兼容性模式。 当您准备好重新启用 HPOS 时,只需按照 此文档的开头部分 中的说明进行操作。 最后,请记住在进行任何更改后保存此页面!

如前所述,我们还强烈建议您联系任何不兼容插件的支持团队,以便他们采取纠正措施。