WooCommerce:在订单中保存对产品的更改时挂钩

WooCommerce: hook when saving changes to product in an order

我已经搜索了几个小时...

我无法弄清楚如何在编辑现有订单中的产品数量后单击 "save" 时执行的功能。

我试过这个:

add_action('woocommerce_order_edit_product', 'your_function_name');
function your_function_name(){
//my php function code would be here
}

但是单击保存时 your_function_name 函数没有被调用。

我测试了这个函数,当直接调用它时它可以正常工作,所以我想我得到了错误的钩子...

检查您的错误日志。那里应该有一些信息。如果我正在查看正确的操作,它需要四个参数:

do_action( 'woocommerce_order_edit_product', $this->id, $item_id, $args, $product );

所以你的代码应该是:

add_action('woocommerce_order_edit_product', 'your_function_name', 10, 4);
function your_function_name($id, $item_id, $args, $product){
//my php function code would be here
}

这个问题折腾了2天,发现:有两个钩子,一个保存前,一个保存后:

  1. woocommerce_before_save_order_items
  2. woocommerce_saved_order_items

两者都在后台保存订单时触发。保存前一个,保存后一个。

两个钩子都带有相同的变量:$order_id (int) & $items (array)

我想通过第一个钩子,您可以获得旧订单并将其内容与项目数组进行比较以查看发生了什么变化。至少这是我现在尝试完成的。

这就是你触发它的方式:

add_action( 'woocommerce_before_save_order_items', 'so42270384_woocommerce_before_save_order_items', 10, 2 );
function so42270384_woocommerce_before_save_order_items( $order_id, $items ) {
    echo $order_id;
    var_dump( $items );
}

注意..

将产品添加到现有订单确实实现了在此之前调用的另一个挂钩(因此当点击“保存”时,上述功能将触发,但订单及其项目在保存之前已经设置(添加产品时,订单将立即保存。这意味着 $order = new WC_Order( $order_id ); 将在其中包含之前和之后的新项目,因此无法找到发生了什么变化。)。但是 woocommerce_ajax_add_order_item_meta 挂钩是在 'add product' 上触发的,并在这方面帮助了我。祝大家编码愉快..