| .. | ||
| cli-tools.md | ||
| enable-hpos.md | ||
| guide-large-store.md | ||
| README.md | ||
| recipe-book.md | ||
| wc-order-query-improvements.md | ||
| title | post_status | comment_status | taxonomy | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| 高性能订单存储 (HPOS) | publish | open |
|
高性能订单存储 (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 表同步到四个自定义订单表:
_wc_orders_wc_order_addresses_wc_order_operational_data_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表中。在这种情况下,不会使用订单表。
- 如果选择 "高性能订单存储",系统会将订单数据保存在新的 WooCommerce 订单表中。
- 如果选择 "WordPress 帖子表" 并且 "启用兼容性模式",系统将在帖子/postmeta 表和 WooCommerce 订单表之间同步订单数据。
不兼容的插件
如果您的插件与高性能订单存储不兼容,则 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 ▸ 设置 ▸ 高级 ▸ 功能,并首先确保 兼容性模式 已启用。 如果尚未启用,您可能需要等待一段时间,以便订单数据在数据存储之间进行同步。
同步完成后,您可以选择 WordPress 帖子存储 (旧版) 作为您的首选选项。 您也可以在此时禁用兼容性模式。 当您准备好重新启用 HPOS 时,只需按照 此文档的开头部分 中的说明进行操作。 最后,请记住在进行任何更改后保存此页面!
如前所述,我们还强烈建议您联系任何不兼容插件的支持团队,以便他们采取纠正措施。





