Woocommerce 3订单创建后用什么钩子?自定义POST插件失效排查
问题1解答:WooCommerce 3中订单创建完成后适用的钩子
在WooCommerce 3及更高版本中,woocommerce_new_order 是订单创建完成后触发的核心钩子——它会在订单被成功保存到数据库后立即执行,参数就是你代码里用到的订单ID。
如果你的业务逻辑需要依赖订单的完整数据(比如订单商品、客户信息等都已完全写入),也可以考虑使用woocommerce_checkout_order_processed:这个钩子是在结账流程完全结束、所有订单数据处理完毕后触发的,参数包含订单ID、结账数据和订单对象,适用性会更广一些。
问题2解答:插件未正常运行的问题排查与修复
我帮你梳理了代码里的几个关键问题,这应该就是请求没发送成功的原因:
1. 多余的无效参数
wp_remote_post函数并不支持data_format这个参数,它会被直接忽略,需要删掉这个键值对。
2. 完全缺失错误处理与日志记录
你没有对请求的返回结果做任何检查,哪怕请求因为网络问题、授权失败等原因失败,也不会在debug.log里留下任何记录,自然无法排查问题。
3. 可选优化:增加请求超时时间
默认的请求超时较短,如果外部服务器响应慢,可能会导致请求中途中断,建议手动设置合理的超时时间。
修复后的完整代码
<?php /** * Plugin Name: MyPlugin */ function my_hook($order_id) { // 先验证订单是否存在,避免无效ID导致的后续问题 if (!$order = wc_get_order($order_id)) { error_log("MyPlugin: 检测到无效订单ID {$order_id}"); return; } $url = "https://example.com/do_something"; $response = wp_remote_post($url, array( 'headers' => array( 'Authorization' => "Token my_token", 'Content-Type' => 'application/json; charset=utf-8', ), 'body' => json_encode(array('order_id' => $order_id)), 'timeout' => 15, // 设置15秒超时,可根据实际情况调整 )); // 错误处理与日志记录,方便排查问题 if (is_wp_error($response)) { $error_message = $response->get_error_message(); error_log("MyPlugin: 向外部服务器发送请求失败 - {$error_message}"); } else { $response_code = wp_remote_retrieve_response_code($response); error_log("MyPlugin: 请求发送成功,服务器响应码 {$response_code}"); } } // 可设置钩子优先级(默认10,设为20确保在其他插件之后执行) add_action( 'woocommerce_new_order', 'my_hook', 20 ); ?>
额外排查建议
- 确认你的服务器允许对外发起HTTP请求:有些主机商会禁用
wp_remote_post这类函数,可以通过phpinfo查看allow_url_fopen是否开启,或者直接联系主机商确认。 - 检查授权Token是否正确:确认
my_token有效,同时核实外部服务器的接口是否支持Token授权、有没有IP白名单限制。
内容的提问来源于stack exchange,提问作者peanut
相关产品推荐
相关产品推荐

