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

如何通过钩子获取WooCommerce取消订单ID并同步取消外部订单

实现步骤与代码示例

woocommerce_cancelled_order钩子本身会将被取消的订单ID作为参数传递给回调函数,你只需要给函数添加参数接收即可,后续就能通过该ID获取存储的外部订单ID,再调用API完成取消操作:

function cancel_SP_order($order_id) {
    // 1. 获取存储的外部网站订单ID(假设meta键为'external_sp_order_id',请替换为你实际的键名)
    $external_order_id = get_post_meta($order_id, 'external_sp_order_id', true);

    // 2. 检查是否存在有效外部订单ID,避免无效请求
    if (empty($external_order_id)) {
        error_log('WooCommerce订单ID '.$order_id.' 未关联外部SP订单ID');
        return;
    }

    // 3. 调用外部网站的取消订单API(请替换为实际的API地址与请求逻辑)
    $api_url = 'https://外部网站域名/api/cancel-order'; // 替换为真实API地址
    $request_args = array(
        'method' => 'POST',
        'headers' => array(
            'Content-Type' => 'application/json',
            // 如果API需要认证,添加对应的授权头,比如:
            // 'Authorization' => 'Bearer YOUR_API_TOKEN'
        ),
        'body' => json_encode(array(
            'order_id' => $external_order_id,
            'reason' => '客户取消WooCommerce订单'
        )),
        'timeout' => 15,
    );

    $response = wp_remote_post($api_url, $request_args);

    // 4. 处理API响应,记录日志以便调试
    if (is_wp_error($response)) {
        error_log('取消外部SP订单失败(订单ID: '.$external_order_id.'):'.$response->get_error_message());
    } else {
        $response_code = wp_remote_retrieve_response_code($response);
        if ($response_code >= 200 && $response_code < 300) {
            error_log('外部SP订单ID '.$external_order_id.' 已成功取消');
            // 可选:如果需要,可以更新WooCommerce订单的元数据标记取消状态
            update_post_meta($order_id, 'external_sp_order_cancelled', 'yes');
        } else {
            error_log('取消外部SP订单失败(订单ID: '.$external_order_id.'),API响应码:'.$response_code.',响应内容:'.wp_remote_retrieve_body($response));
        }
    }
}
add_action('woocommerce_cancelled_order', 'cancel_SP_order');
更优实现方案
  1. 使用更精准的状态变更钩子
    建议改用woocommerce_order_status_changed钩子,可以监听订单状态从非取消状态切换为cancelled的情况,避免重复触发(比如订单多次被标记为取消时):

    function cancel_SP_order_on_status_change($order_id, $old_status, $new_status) {
        // 仅当状态从非取消变为取消时执行
        if ($new_status !== 'cancelled' || $old_status === 'cancelled') {
            return;
        }
    
        // 后续逻辑与上面的函数一致,获取外部ID、调用API等
        $external_order_id = get_post_meta($order_id, 'external_sp_order_id', true);
        // ... 省略其余逻辑
    }
    add_action('woocommerce_order_status_changed', 'cancel_SP_order_on_status_change', 10, 3);
    
  2. 使用WooCommerce订单对象(推荐)
    直接使用WC_Order对象获取元数据,更符合WooCommerce的开发规范,也能兼容更多版本:

    $order = wc_get_order($order_id);
    if (!$order) {
        error_log('无法获取WooCommerce订单ID '.$order_id);
        return;
    }
    // 获取外部订单ID
    $external_order_id = $order->get_meta('external_sp_order_id', true);
    
  3. 异步执行API请求
    如果外部API响应较慢,会导致订单取消流程卡顿,建议将API调用改为异步执行,比如使用WordPress的定时任务:

    // 在状态变更钩子中触发异步任务
    function schedule_sp_order_cancellation($order_id, $old_status, $new_status) {
        if ($new_status !== 'cancelled' || $old_status === 'cancelled') {
            return;
        }
        // 调度异步任务
        wp_schedule_single_event(time(), 'sp_cancel_external_order', array($order_id));
    }
    add_action('woocommerce_order_status_changed', 'schedule_sp_order_cancellation', 10, 3);
    
    // 异步任务的回调函数
    function sp_cancel_external_order($order_id) {
        // 这里放之前的取消API逻辑
        $order = wc_get_order($order_id);
        $external_order_id = $order->get_meta('external_sp_order_id', true);
        // ... 调用API等
    }
    add_action('sp_cancel_external_order', 'sp_cancel_external_order');
    
  4. 添加错误重试机制
    可以给API请求添加重试逻辑,比如当请求失败时,间隔10分钟后重试最多3次,提高成功率,避免因临时网络问题导致取消失败。


内容的提问来源于stack exchange,提问作者Steve

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:31:34