You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 15:47:52