当我通过管理员(例如他们的地址或自定义元字段)更改某人的订单时,是否可以使用钩子?我read this question但不幸的是woocommerce_process_shop_order_meta
在订单保存之前被解雇,这意味着我无权访问新更新的数据。我需要的是能够使用保存到订单中的新数据。
更新:使用save_post_shop_order
的一个问题是元数据在被点击之前会更新,因此我无法比较之前保存的元数值,例如:
$metaArray = $_POST['meta'];
foreach($metaArray as $meta => $key) {
$metaArr[$key["key"]] = $key["value"];
}
$meta = get_post_meta($order->ID);
if($meta['coverstart'][0] != $metaArr['coverstart']) {
die("COVER START DATE HAS CHANGED");
}
die()
永远不会被命中,因为脚本总是获取新保存的值。
答案 0 :(得分:2)
很抱歉,保存订单后woocommerce_checkout_update_order_meta
被解雇 ...请参阅WC_Checkout
create_order()
method中的此摘录源代码:
// Save the order.
$order_id = $order->save(); // <== Order is saved here before
do_action( 'woocommerce_checkout_update_order_meta', $order_id, $data ); <== // The hook
return $order_id;
因此,在woocommerce_checkout_update_order_meta
您可以获取已保存的订单数据:
WC_Order
参数中检索$order_id
对象并使用其上的所有方法。 get_post_meta()
on $order_id
参数将数据保存在wp_postmeta
数据库表中。然后,您可以使用update_post_meta()
功能...
您甚至可以在保存数据之前使用
woocommerce_checkout_create_order
...
您将能够使用$order
类的所有可用方法(CRUD getters方法)从WC_Order
参数获取数据。
您将能够使用CRUD设置器方法更改此数据并保存...
Some examples in stackOverFlow
如果您需要在订单处理后执行此操作,则可以使用以下挂钩:
woocommerce_new_order
(关于新创建的订单活动)woocommerce_thankyou
(已收到订单)woocommerce_order_status_changed
(关于订单状态更改事件)可能还有其他人......
要在后端保存订单时更改数据,您将使用包含3个参数的 save_post_shop_order
:$post_id
,$post
和{{1} } ...