woocommerce_order_status_completed钩子触发仅返回订单ID无其他数据如何解决
问题产生原因
- 若你是自行编写代码挂载
woocommerce_order_status_completed钩子触发webhook:该钩子默认仅传递订单ID作为入参,如果你没有在回调逻辑中根据ID拉取完整订单对象,返回内容自然只会包含订单ID - 若你是通过WooCommerce后台自带的Webhook功能配置的钩子:通常是Webhook主题配置错误、有效载荷版本过低、或是关联的API账号没有订单查看权限,导致Payload被截断
解决方法
场景1:使用WooCommerce后台自带Webhook功能
- 进入WooCommerce后台 → 设置 → 高级 → Webhook,点击对应钩子进入编辑页
- 「主题」选项选择
订单已完成,不要选择自定义钩子选项;「有效载荷版本」选择WP REST API集成 v3 - 确认创建Webhook时关联的用户账号拥有
view_shop_orders权限,推荐使用管理员权限账号生成Webhook - 保存配置后触发测试,即可收到包含商品、金额、收货人、支付信息等全量字段的订单数据
场景2:自定义代码实现Webhook触发
- 在钩子回调函数中先通过传入的订单ID获取完整订单对象,再组装全量数据发送,参考代码如下:
add_action('woocommerce_order_status_completed', 'custom_push_order_to_webhook', 10, 1); function custom_push_order_to_webhook($order_id) { // 校验订单ID有效性,获取订单对象 $order = wc_get_order($order_id); if (empty($order)) return; // 获取订单全量原生数据 $post_data = $order->get_data(); // 此处替换为你的Webhook接收地址 $target_url = 'https://你的webhook接收地址'; // 发送请求 wp_remote_post($target_url, [ 'headers' => ['Content-Type' => 'application/json'], 'body' => json_encode($post_data), 'timeout' => 60, ]); }
- 如果需要传递订单自定义字段,可以在
$post_data数组中自行追加对应的字段值即可
内容的提问来源于stack exchange,提问作者Al Maskari
相关产品推荐
相关产品推荐

