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

WooCommerce:如何实现订单完成后执行操作并在后台订单页展示结果

完整解决方案:WooCommerce订单完成时触发物流API并展示结果

我们分两部分实现需求:1. 订单状态改为Completed时触发API请求并保存结果;2. 在后台订单编辑页添加Meta Box展示请求结果,完美解决你之前遇到的两个问题。


一、触发API请求并保存结果

使用woocommerce_order_status_completed钩子(该钩子仅在订单状态切换为Completed时触发),执行REST请求后将结果存入订单元数据,为后续展示提供数据支撑。

/**
 * 订单状态改为Completed时,向物流公司发送REST请求并保存结果
 */
function wc_send_shipping_api_on_order_completed( $order_id ) {
    // 获取订单对象
    $order = wc_get_order( $order_id );
    if ( ! $order ) return;

    // 替换为实际物流公司API地址
    $api_url = 'https://your-logistics-api.com/submit';
    
    // 根据物流公司API要求调整请求参数
    $request_body = array(
        'order_id'         => $order_id,
        'tracking_number'  => $order->get_shipping_tracking_number(),
        'customer_name'    => $order->get_shipping_first_name() . ' ' . $order->get_shipping_last_name(),
        'shipping_address' => $order->get_shipping_address_1() . ', ' . $order->get_shipping_city()
    );

    // 发送POST请求
    $response = wp_remote_post( $api_url, array(
        'headers' => array( 'Content-Type' => 'application/json' ),
        'body'    => json_encode( $request_body ),
        'timeout' => 15
    ) );

    // 处理响应并保存结果到订单元数据
    if ( is_wp_error( $response ) ) {
        update_post_meta( $order_id, '_shipping_api_status', 'failed' );
        update_post_meta( $order_id, '_shipping_api_message', '请求出错:' . $response->get_error_message() );
    } else {
        $response_code = wp_remote_retrieve_response_code( $response );
        $response_body = json_decode( wp_remote_retrieve_body( $response ), true );
        
        if ( $response_code === 200 && isset( $response_body['success'] ) && $response_body['success'] ) {
            update_post_meta( $order_id, '_shipping_api_status', 'success' );
            update_post_meta( $order_id, '_shipping_api_message', '物流信息提交成功,跟踪号:' . $response_body['tracking_number'] );
        } else {
            $error_msg = isset( $response_body['message'] ) ? $response_body['message'] : '未知错误';
            update_post_meta( $order_id, '_shipping_api_status', 'failed' );
            update_post_meta( $order_id, '_shipping_api_message', '提交失败:' . $error_msg );
        }
    }
}
add_action( 'woocommerce_order_status_completed', 'wc_send_shipping_api_on_order_completed', 10, 1 );

二、在订单编辑页添加Meta Box展示结果

注册一个侧边栏Meta Box,读取之前保存的订单元数据,根据请求结果展示不同样式的信息,同时支持判断订单状态。

/**
 * 注册订单编辑页的物流API结果Meta Box
 */
function wc_add_shipping_api_meta_box() {
    add_meta_box(
        'wc-shipping-api-result', // Meta Box唯一ID
        '物流API提交结果',         // Meta Box标题
        'wc_display_shipping_api_result', // 内容回调函数
        'shop_order', // 关联的自定义文章类型(订单)
        'side',       // 展示位置(侧边栏)
        'default'     // 优先级
    );
}
add_action( 'add_meta_boxes', 'wc_add_shipping_api_meta_box' );

/**
 * 渲染物流API提交结果内容
 */
function wc_display_shipping_api_result( $post ) {
    $order = wc_get_order( $post->ID );
    if ( ! $order ) return;

    // 获取保存的API请求结果
    $api_status  = get_post_meta( $post->ID, '_shipping_api_status', true );
    $api_message = get_post_meta( $post->ID, '_shipping_api_message', true );

    // 订单未完成且无API结果时的提示
    if ( empty( $api_status ) && $order->get_status() !== 'completed' ) {
        echo '<p>订单未完成,暂未提交物流信息</p>';
        return;
    }

    // 根据请求状态展示不同样式的内容
    if ( $api_status === 'success' ) {
        echo '<div style="padding: 10px; background: #d4edda; border-left: 4px solid #28a745; color: #1555724;">';
        echo '<strong>提交成功</strong><br>' . esc_html( $api_message );
        echo '</div>';
    } elseif ( $api_status === 'failed' ) {
        echo '<div style="padding: 10px; background: #f8d7da; border-left: 4px solid #dc3545; color: #721c24;">';
        echo '<strong>提交失败</strong><br>' . esc_html( $api_message );
        echo '</div>';
    } else {
        echo '<p>订单已完成,物流信息提交中...</p>';
    }
}

使用说明

  1. 将两段代码添加到主题的functions.php文件,或封装为自定义插件
  2. 替换代码中的物流公司API地址和请求参数,匹配实际接口要求
  3. 测试时手动修改订单状态为Completed,即可在订单编辑页侧边栏看到API请求结果
  4. 如需重新触发API请求,可删除订单的_shipping_api_status和_shipping_api_message元数据,再将订单状态改为Completed即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 17:45:46