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

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;
}

代码说明

  1. 注册参数:通过woocommerce_rest_shop_order_collection_params过滤器将billing_country添加到API允许的参数列表中,确保请求参数能被正确接收和验证。
  2. 修正元数据键:使用正确的_billing_country作为查询键,匹配WooCommerce存储的订单数据。
  3. 参数格式化:将传入的国家代码转为大写,避免大小写不匹配的问题(WooCommerce存储的是大写ISO代码)。
  4. 安全处理:保留了参数 sanitize 步骤,确保输入安全。

测试请求

使用你原来的请求格式即可正常返回匹配的订单:
https://example.com/wp-json/wc/v3/orders?billing_country=US

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 11:15:31