订单更新后的 WooCommerce 挂钩?

WooCommerce hook after order is updated?

当我通过管理员更改某人的订单(例如他们的地址或自定义元字段)时,我可以使用挂钩吗?我 但不幸的是 woocommerce_process_shop_order_meta 在订单保存之前被解雇了,这意味着我无法访问新更新的数据。我需要的是能够使用保存到订单的新数据。

UPDATE: 使用 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(),因为脚本总是获取新保存的值。

抱歉,但是 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你可以得到保存的订单数据:

  • 通过从 $order_id 参数中检索 WC_Order 对象并对其使用所有方法。
  • 或将 get_post_meta()$order_id 参数一起使用以获取保存在 wp_postmeta 数据库 table.
  • 中的数据

然后你可以用update_post_meta()函数更新数据…


You can even use woocommerce_checkout_create_order before the data is saved…

您将能够使用 WC_Order class 的所有可用方法(CRUD getter 方法)从 $order 参数获取数据。

您将能够使用 CRUD setter 方法更改此数据并保存它…

Some examples in Whosebug


如果您需要在订单处理后执行此操作,则可以使用以下挂钩:

  • woocommerce_new_order(在新创建的订单事件上)
  • woocommerce_thankyou(在收到订单页面上)
  • woocommerce_order_status_changed(订单状态更改事件)

可能还有其他人……


要在后端保存订单时更改数据,您将使用具有 3 个参数的 save_post_shop_order$post_id$post $update