【问题标题】:WooCommerce hook after order is updated?订单更新后的 WooCommerce 钩子?
【发布时间】:2018-03-27 10:43:20
【问题描述】:

当我通过管理员更改某人的订单(例如他们的地址或自定义元字段)时,我可以使用挂钩吗?我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() 永远不会被命中,因为脚本总是获取新保存的值。

【问题讨论】:

标签: php wordpress woocommerce hook-woocommerce orders


【解决方案1】:

抱歉,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 数据库表中的数据。

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


你甚至可以在数据保存前使用woocommerce_checkout_create_order……

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

您将能够更改这些数据并使用 CRUD 设置方法保存它……

Some examples in stackOverFlow


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

  • woocommerce_new_order(关于新创建的订单事件)
  • woocommerce_thankyou(在收到订单的页面上)
  • woocommerce_order_status_changed(订单状态变化事件)

可能还有其他一些……


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

【讨论】:

  • 多么棒的答案。这对我来说现在更有意义了。非常感谢您对此的帮助!
  • 根据使用save_post_shop_order 的问题更新了我的问题。 @LoicTheAztec
  • @LiamMcArthur 您应该使用该更新提出一个新问题,并在此处回滚到您的初始问题……还尝试在该新问题中添加一些可以测试以找出有用的代码给你……
猜你喜欢
  • 2017-06-10
  • 2015-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-09
  • 2017-04-20
  • 2021-04-21
  • 1970-01-01
相关资源
最近更新 更多