2018方法:
基于Guido W.P.的回答,您可以使用更轻便和有效的代码版本woocommerce_checkout_create_order
动作挂钩,具体请参考(使用WC 3+ CRUD方法)。
add_action('woocommerce_checkout_create_order', 'before_checkout_create_order', 20, 2);
function before_checkout_create_order( $order, $data ) {
$order->update_meta_data( '_custom_meta_key', 'value' );
}
将代码放入您当前使用的子主题(或活动主题)的function.php文件中。
已在WooCommerce 3+中进行测试并工作(仅限此版本)。
一些说明:
woocommerce_checkout_create_order
动作钩子仅在保存订单数据之前的一个步骤。请参见下面的 WC_Checkout
create_order()
方法的摘录(包括两个钩子):
do_action( 'woocommerce_checkout_create_order', $order, $data );
$order_id = $order->save();
do_action( 'woocommerce_checkout_update_order_meta', $order_id, $data );
return $order_id;
为什么要使用woocommerce_checkout_create_order
?:
- 因为你不需要像以前一样使用
$order = wc_get_order( $order_id );
,因为在钩子函数中$order
已经作为参数传递了。
- 你也不需要使用
$order->save();
,因为这将在接下来的流程中执行(参见源代码)。
- 自 WooCommerce 3 版本发布以来,就已经推出了这个钩子,并且它是为了同样的目的而设计的,允许使用所有可用的
WC_Order
方法。
所以只需在函数内加入一行代码即可。
woocommerce_checkout_update_order_meta
一样具有未来性? 看起来woocommerce_checkout_update_order_meta
是由WooCommerce开发人员放置在那里的,目的是更新订单元数据。 我可能错了,但是为了特定目的使用另一个过滤器让我感到有点不舒服。 - coccoinomanewoocommerce_checkout_update_order_meta
更新订单元数据。 我的观点是,为了节省几毫秒的执行时间而忽略这个提示可能是不明智的,特别是因为WooCommerce的更新非常频繁,并且并不总是遵守向后兼容性。 我有点偏执,我知道。 - coccoinomanewoocommerce_checkout_create_order
是用于CRUD设置器和获取器,并且与WC 3同时发布... 在CRUD设置器和获取器方法之前 *(也就是 WooCommerce 3 之前)*,唯一的方法是使用update_post_meta()
WP函数的woocommerce_checkout_update_order_meta
。所以没有问题,我在我的答案中只是提供了一个关于使用 CRUD 方法的良好替代方案。这就是全部。没什么大不了的... - LoicTheAztec