WooCommerce 钩子 – woocommerce_update_order 问题

Posted

技术标签:

【中文标题】WooCommerce 钩子 – woocommerce_update_order 问题【英文标题】:WooCommerce hooks – woocommerce_update_order problems 【发布时间】:2020-02-12 01:38:28 【问题描述】:

我已经注册了以下 woocommerce 钩子:

add_action('woocommerce_update_order', 'some_func', 300, 2);
function some_func($order_id, $order)
  // ...

但是,我有几个问题:

这会在更新订单时多次触发,而不是仅在最后触发。它使用旧命令触发两次,一次触发一次。

我还尝试了以下方法:

add_action('woocommerce_update_order', 'some_func', 300, 2);
function some_func($order_id, $order)
    remove_action('woocommerce_update_order', 'some_func');
    // ...

这也不会改变它。

另外,我尝试修改 remove_action 以包含优先级和参数计数,例如:

add_action('woocommerce_update_order', 'some_func', 300, 2);
function some_func($order_id, $order)
    remove_action('woocommerce_update_order', 'some_func', 300, 2);
    // ...

现在,它确实只触发一次,但它给了我旧的命令而不是新更新的命令。

我正在使用 WooCommerce 3.7.0。

关于如何在更新后仅准确触发钩子一次获得最新版本的订单有什么建议?

谢谢!

【问题讨论】:

【参考方案1】:
add_action( 'save_post', 'my_save_post_function', 10, 3 );

function my_save_post_function( $post_ID, $post, $update ) 

  if("shop_order" == $post->post_type)
  $msg = 'An order updte fireda';

  wp_die( $msg );
  

在后置条件内执行你的操作

【讨论】:

【参考方案2】:
function mysite_pending($order_id) 
    error_log("$order_id set to PENDING", 0);
    
    function mysite_failed($order_id) 
    error_log("$order_id set to FAILED", 0);
    
    function mysite_hold($order_id) 
    error_log("$order_id set to ON HOLD", 0);
    
    function mysite_processing($order_id) 
    error_log("$order_id set to PROCESSING", 0);
    
    function mysite_completed($order_id) 
    error_log("$order_id set to COMPLETED", 0);
    
    function mysite_refunded($order_id) 
    error_log("$order_id set to REFUNDED", 0);
    
    function mysite_cancelled($order_id) 
    error_log("$order_id set to CANCELLED", 0);
    

    add_action( ‘woocommerce_order_status_pending’, ‘mysite_pending’);
    add_action( ‘woocommerce_order_status_failed’, ‘mysite_failed’);
    add_action( ‘woocommerce_order_status_on-hold’, ‘mysite_hold’);
    // Note that it’s woocommerce_order_status_on-hold, not on_hold.
    add_action( ‘woocommerce_order_status_processing’, ‘mysite_processing’);
    add_action( ‘woocommerce_order_status_completed’, ‘mysite_completed’);
    add_action( ‘woocommerce_order_status_refunded’, ‘mysite_refunded’);
    add_action( ‘woocommerce_order_status_cancelled’, ‘mysite_cancelled’);

这些状态变化钩子在那里。你可以使用你需要的特定的。希望对你有帮助

【讨论】:

谢谢你的回答,但是如果我想钩住的不仅仅是状态变化,还有所有的订单变化呢? 添加了另一个答案。那是你的确切情况

以上是关于WooCommerce 钩子 – woocommerce_update_order 问题的主要内容,如果未能解决你的问题,请参考以下文章

注册后 Woocommerce 重定向

Woocommerce如何处理订阅结算?

从 WooCommerce 订单中获取优惠券数据

为开发人员重复触发“woocommerce_payment_complete”钩子

触发jquery代码的Woocommerce函数

WooCommerce 如何检查产品是不是有货