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>'; } }
使用说明
- 将两段代码添加到主题的
functions.php文件,或封装为自定义插件 - 替换代码中的物流公司API地址和请求参数,匹配实际接口要求
- 测试时手动修改订单状态为Completed,即可在订单编辑页侧边栏看到API请求结果
- 如需重新触发API请求,可删除订单的
_shipping_api_status和_shipping_api_message元数据,再将订单状态改为Completed即可
内容的提问来源于stack exchange,提问作者Mister Woyng
相关产品推荐
相关产品推荐

