WooCommerce REST API按账单国家筛选订单插件报错求助
解决WooCommerce REST API订单按账单国家筛选返回空数组的问题
你的代码核心问题在于账单国家的元数据键错误,同时缺少自定义查询参数的注册步骤,导致筛选逻辑无法匹配到正确的订单数据。以下是修复方案:
错误原因分析
WooCommerce中订单的账单国家存储在元数据_billing_country中(下划线开头),而非你代码里写的billing.country。这是导致查询返回空数组的直接原因。另外,WooCommerce REST API默认不会识别自定义请求参数,需要先注册该参数才能正常接收。
完整修复代码
// 注册自定义查询参数到订单API端点 add_filter( 'woocommerce_rest_shop_order_collection_params', 'register_billing_country_param', 10, 1 ); function register_billing_country_param( $params ) { $params['billing_country'] = array( 'description' => '按账单国家筛选订单,使用ISO国家代码(如US、CN)', 'type' => 'string', 'validate_callback' => 'rest_validate_request_arg', 'sanitize_callback' => 'sanitize_text_field', ); return $params; } // 实现订单筛选逻辑 add_filter( 'woocommerce_rest_shop_order_object_query', 'filter_orders_by_billing_country', 999, 2 ); function filter_orders_by_billing_country( $args, $request ) { // 检查请求中是否包含billing_country参数 if ( empty( $request['billing_country'] ) ) { return $args; } $billing_country = sanitize_text_field( strtoupper( $request['billing_country'] ) ); // 构建元数据查询 $country_meta_query = array( 'key' => '_billing_country', 'value' => $billing_country, 'compare' => '=' ); // 合并到现有meta_query中 if ( isset( $args['meta_query'] ) && is_array( $args['meta_query'] ) ) { // 如果已有relation,保留并追加条件;否则添加AND关系 if ( ! isset( $args['meta_query']['relation'] ) ) { $args['meta_query']['relation'] = 'AND'; } $args['meta_query'][] = $country_meta_query; } else { $args['meta_query'] = array( $country_meta_query ); } return $args; }
代码说明
- 注册参数:通过
woocommerce_rest_shop_order_collection_params过滤器将billing_country添加到API允许的参数列表中,确保请求参数能被正确接收和验证。 - 修正元数据键:使用正确的
_billing_country作为查询键,匹配WooCommerce存储的订单数据。 - 参数格式化:将传入的国家代码转为大写,避免大小写不匹配的问题(WooCommerce存储的是大写ISO代码)。
- 安全处理:保留了参数 sanitize 步骤,确保输入安全。
测试请求
使用你原来的请求格式即可正常返回匹配的订单:https://example.com/wp-json/wc/v3/orders?billing_country=US
内容的提问来源于stack exchange,提问作者Timbokun
相关产品推荐
相关产品推荐

