WooCommerce订单状态变更钩子失效:寻求全场景触发钩子
WooCommerce订单状态变更钩子兼容所有场景的解决方案
问题描述
我正在开发一款订单状态变更时发送WhatsApp消息的插件,代码如下:
add_action("woocommerce_order_status_changed", "order_status_wapp", 10, 3); function order_status_wapp($order_id, $old_status, $new_status){ if( $new_status == "processing" && carbon_get_theme_option( 'show_processing' )) { require("incl/apicall.php"); $message = carbon_get_theme_option( 'processing_message' ); require("incl/message_attr.php"); }
该代码在订单列表操作区修改状态时可正常运行,但在订单详情页修改或通过编程方式修改状态时无效果,需要找到能在任何状态变更场景下触发的钩子。
解决方案
核心原因
woocommerce_order_status_changed钩子的触发范围有限,仅在订单列表的批量操作/快速编辑修改状态时触发,无法覆盖订单详情页手动修改、通过WC_Order->update_status()编程修改的场景。
通用钩子推荐
使用**woocommerce_order_status_updated**钩子,它是WooCommerce中所有订单状态变更场景都会触发的底层钩子,支持以下所有场景:
- 订单列表快速编辑/批量修改状态
- 订单详情页修改状态
- 代码调用
update_status()方法修改状态 - 支付网关自动更新订单状态
修改后的代码示例
add_action("woocommerce_order_status_updated", "order_status_wapp", 10, 4); function order_status_wapp($order_id, $old_status, $new_status, $order){ // 仅在切换到processing状态且开启对应设置时执行逻辑 if( $new_status == "processing" && carbon_get_theme_option( 'show_processing' )) { require("incl/apicall.php"); $message = carbon_get_theme_option( 'processing_message' ); require("incl/message_attr.php"); } }
注意:该钩子的第四个参数是
$order对象,若无需使用可忽略,但必须保证钩子注册时的参数数量(10,4)与函数接收的参数数量匹配。
备选方案
如果仅需要监听特定状态的变更(比如仅监听切换到processing状态),也可以使用woocommerce_order_status_processing钩子,它同样支持所有状态变更场景:
add_action("woocommerce_order_status_processing", "order_status_wapp", 10, 2); function order_status_wapp($order_id, $order){ if( carbon_get_theme_option( 'show_processing' )) { require("incl/apicall.php"); $message = carbon_get_theme_option( 'processing_message' ); require("incl/message_attr.php"); } }
内容的提问来源于stack exchange,提问作者islam belabbes
相关产品推荐
相关产品推荐

