WooCommerce REST API v2:向订单添加自定义数据遇问题
我完全懂你遇到的困扰——升级WooCommerce到3.3+版本后,原来依赖旧Legacy API的woocommerce_api_order_response钩子突然失效,自定义数据不再出现在API响应里。这其实是因为新版WooCommerce的REST API已经彻底切换到基于WordPress原生REST API的架构,和旧版API的运行逻辑完全不同了。
为什么旧钩子没用了?
WooCommerce 2.x的旧API(也就是你用的wc-api/v3端点)是一套独立的系统,woocommerce_api_order_response是专门为这套旧系统设计的钩子。而3.0+版本启用的新REST API(wp-json/wc/v2及后续版本)是基于WP REST API构建的,它有自己专属的过滤器和钩子体系,旧钩子自然不会被触发。
正确的解决方案:使用新REST API的专属过滤器
你需要改用针对新REST API订单响应的过滤器woocommerce_rest_prepare_shop_order来添加自定义数据,下面是具体的代码示例:
add_filter( 'woocommerce_rest_prepare_shop_order', 'add_custom_data_to_order_rest_response', 10, 3 ); function add_custom_data_to_order_rest_response( $response, $order, $request ) { // 替换成你实际存储自定义数据的元键 $custom_data = get_post_meta( $order->get_id(), 'your_custom_meta_key', true ); // 将自定义数据添加到API响应中,可自定义键名 $response->data['custom_order_data'] = $custom_data; // 如果要添加多个字段,重复上述步骤即可 // $response->data['another_custom_field'] = get_post_meta( $order->get_id(), 'another_meta_key', true ); return $response; }
代码使用说明:
- 把这段代码添加到你的主题
functions.php文件,或者自定义插件中 - 替换
your_custom_meta_key为你实际用来存储自定义数据的元键 custom_order_data是你希望在API响应中显示的键名,可以根据需求自由修改
验证方法
保存代码后,调用新的API端点https://example.com/wp-json/wc/v2/orders?consumer_key=KEY&consumer_secret=SECRET,查看返回的订单数据,你添加的自定义字段应该已经出现在响应里了。
如果你的自定义数据不是存在订单的post meta中,只需要调整代码里获取数据的逻辑即可——比如从订单的其他属性、自定义表中读取数据,再添加到$response->data数组里就好。
内容的提问来源于stack exchange,提问作者Ian Fraser

