跳转到主要内容

`wc_get_orders()` 和订单查询

wc_get_orders() 和 WC_Order_Query 提供了从数据库检索订单的标准方法,类似于 WordPress 的 get_posts() 和 WP_Query,但专门用于订单。

插件和主题的开发者应避免编写自定义的 WordPress 查询或直接的 SQL 语句,因为 WordPress 或 WooCommerce 数据库的更改可能会导致问题。 这些 API 提供了最佳实践,并且是获取 WooCommerce 中订单的未来兼容方式。

基本用法

示例

以下是一些示例:

// 获取名为 John 且于 2016 年付款的订单。
$orders = wc_get_orders(
    array(
        'billing_first_name' => 'John',
        'date_paid'          => '2016-01-01...2016-12-31',
    )
);
// 获取 10 个最近的订单 ID。
$query = new WC_Order_Query(
    array(
        'limit'   => 10,
        'orderby' => 'date',
        'order'   => 'DESC',
        'return'  => 'ids',
    )
);
$orders = $query->get_orders();
// 获取电子邮件为 'woocommerce@woocommerce.com' 的客户的订单。
$query = new WC_Order_Query();
$query->set( 'customer', 'woocommerce@woocommerce.com' );
$orders = $query->get_orders();

请注意,wc_get_orders() 主要是 WC_Order_Query::get_orders() 的一个快捷方式。

最佳实践

  • 避免直接的数据库查询,而应使用 wc_get_orders()。
  • 如果您的代码需要支持旧版本,请在启用和禁用 HPOS 时进行彻底测试。
  • 使用特定的参数来限制结果并提高性能。
  • 对于大型结果集,请考虑使用 limit 和 offset 进行分页。
  • 在适当的情况下缓存结果。
  • 对于复杂的过滤要求,请利用自 8.2 起在运行 HPOS 的站点上提供的新的查询参数 meta_query、field_query 和 date_query。

API 参考

方法 描述
wc_get_orders ( $args ) 检索与查询 $args 匹配的订单。
WC_Order_Query::get_query_vars() 获取当前查询对象上设置的所有查询变量的数组。
WC_Order_Query::get( string $key, mixed $default = '' ) 获取查询变量的值,如果未设置查询变量,则返回默认值。
WC_Order_Query::set( string $key, mixed $value ) 设置一个查询变量。
WC_Order_Query::get_orders() 获取与当前查询变量匹配的所有订单。

以下是可与这些函数一起使用的查询参数/参数。

查询参数参考

General

参数 描述
status 接受一个字符串数组:默认情况下设置为 wc_get_order_statuses() 函数的键。
type 接受一个字符串:'shop_order'、'shop_order_refund' 或自定义订单类型。
version 接受一个字符串:订单创建时使用的 WooCommerce 版本号。
created_via 接受一个字符串:'checkout'、'rest-api' 或自定义创建方法别名。
parent 接受一个整数:父订单的帖子 ID。
parent_exclude 接受一个整数数组:排除具有父 ID 在数组中的订单。
exclude 接受一个整数数组:排除具有这些 ID 的订单。
order 接受一个字符串:'DESC' 或 'ASC'。与 'orderby' 配合使用。默认值:'DESC'。
orderby 接受一个字符串:'none'、'ID'、'name'、'type'、'rand'、'date'、'modified'。默认值:'date'。
return 返回类型。接受一个字符串:'ids' 或 'objects'。默认值:'objects'。

示例

// 获取最近修改的订单。
$args = array(
    'orderby' => 'modified',
    'order' => 'DESC',
);
$orders = wc_get_orders( $args );
// 获取一些随机订单。
$orders = wc_get_orders( array( 'orderby' => 'rand' ) );
// 仅返回订单 ID。
$orders = wc_get_orders( array( 'return' => 'ids' ) );
// 获取处理中和待处理的订单。
$args = array(
    'status' => array( 'wc-processing', 'wc-on-hold' ),
);
$orders = wc_get_orders( $args );
// 获取过去 24 小时的退款订单。
$args = array(
    'type'         => 'shop_order_refund',
    'date_created' => '>' . ( time() - DAY_IN_SECONDS ),
);
$orders = wc_get_orders( $args );
// 获取在 WooCommerce 2.6.14 版本创建并通过网站结账的订单。
$args = array(
    'version'     => '2.6.14',
    'created_via' => 'checkout',
);
$orders = wc_get_orders( $args );
// 获取父帖子 ID 为 20 且不是订单 12 的订单。
$args = array(
    'parent'  => 20,
    'exclude' => array( 12 ),
);
$orders = wc_get_orders( $args );

分页

参数 描述
limit 接受一个整数:要检索的最大结果数,或 -1 表示无限制。默认值:站点 'posts_per_page' 设置。
paged 接受一个整数:要检索的结果页码。如果使用了 'offset',则无效。
offset 接受一个整数:订单结果的偏移量。
paginate 接受一个布尔值:如果为真,则启用分页,否则禁用分页(默认:false)。如果启用,则修改返回结果,使其包含一个对象,该对象具有以下字段:orders(找到的订单数组)、total(找到的订单数量)和 max_num_pages(总页数)。

示例

// 获取最新的 3 个订单。
$orders = wc_get_orders( array( 'limit' => 3 ) );
// 前 3 个订单。
$args = array(
    'limit' => 3,
    'paged' => 1,
);
$page_1_orders = wc_get_orders( $args );

// 后 3 个订单。
$args = array(
    'limit' => 3,
    'paged' => 2,
);
$page_2_orders = wc_get_orders( $args );
// 获取包含关于结果的额外信息的订单。
$results = wc_get_orders( array( 'paginate' => true ) );
echo $results->total . " 个订单已找到\n";
echo '第 1 页,共 ' . $results->max_num_pages . " 页\n";
echo '第一个订单 ID 是: ' . $results->orders[0]->get_id() . "\n";

支付和金额

参数 描述
currency 接受一个字符串:订单中使用的货币。
prices_include_tax 接受一个字符串:'yes' 或 'no'。
payment_method 接受一个字符串:使用的支付方法的别名。
payment_method_title 接受一个字符串:使用的支付方法的完整标题。
discount_total 接受一个浮点数:用于匹配的未四舍五入的金额。
discount_tax 接受一个浮点数:用于匹配的未四舍五入的金额。
shipping_total 接受一个浮点数:用于匹配的未四舍五入的金额。
shipping_tax 接受一个浮点数:用于匹配的未四舍五入的金额。
cart_tax 接受一个浮点数:用于匹配的未四舍五入的金额。
total 接受一个浮点数:用于匹配的未四舍五入的金额。

示例

// 获取使用 USD 支付的订单。
$orders = wc_get_orders( array( 'currency' => 'USD' ) );
// 获取使用支票支付的订单。
$orders = wc_get_orders( array( 'payment_method' => 'cheque' ) );
// 获取折扣总额为 20.00 的订单。
$orders = wc_get_orders( array( 'discount_total' => 20.00 ) );

客户

参数 描述
customer 接受一个字符串或一个整数:订单的账单电子邮件或客户 ID。
customer_id 接受一个整数:客户 ID。
customer_ip_address 接受字符串:用于匹配的值。

示例

// 获取客户电子邮件为 'woocommerce@woocommerce.com' 的订单。
$orders = wc_get_orders( array( 'customer' => 'woocommerce@woocommerce.com' ) );
// 获取客户 ID 为 12 的订单。
$orders = wc_get_orders( array( 'customer_id' => 12 ) );

账单和配送

参数 描述
billing_first_name 接受字符串:用于匹配的值。
billing_last_name 接受字符串:用于匹配的值。
billing_company 接受字符串:用于匹配的值。
billing_address_1 接受字符串:用于匹配的值。
billing_address_2 接受字符串:用于匹配的值。
billing_city 接受字符串:用于匹配的值。
billing_state 接受字符串:用于匹配的值。
billing_postcode 接受字符串:用于匹配的值。
billing_country 接受字符串:用于匹配的值。
billing_email 接受字符串:用于匹配的值。
billing_phone 接受字符串:用于匹配的值。
shipping_first_name 接受字符串:用于匹配的值。
shipping_last_name 接受字符串:用于匹配的值。
shipping_company 接受字符串:用于匹配的值。
shipping_address_1 接受字符串:用于匹配的值。
shipping_address_2 接受字符串:用于匹配的值。
shipping_city 接受字符串:用于匹配的值。
shipping_state 接受字符串:用于匹配的值。
shipping_postcode 接受字符串:用于匹配的值。
shipping_country 接受字符串:用于匹配的值。

示例

// 获取来自美国的订单。
$orders = wc_get_orders( array( 'billing_country' => 'US' ) );
// 获取名为 Bill Evans 的用户的订单。
$args = array(
    'billing_first_name' => 'Bill',
    'billing_last_name'  => 'Evans',
);
$orders = wc_get_orders( $args );

日期

日期参数接收以下标准格式的值,允许更灵活的查询。

参数 描述
date_created 匹配订单创建日期。 接受标准格式的字符串。
date_modified 匹配订单修改日期。 接受标准格式的字符串。
date_completed 匹配订单完成日期。 接受标准格式的字符串。
date_paid 匹配订单支付日期。 接受标准格式的字符串。

标准格式

  • YYYY-MM-DD - 匹配该站点时区内某一天内的订单。
  • >YYYY-MM-DD - 匹配该站点时区内该一天之后的订单。
  • >=YYYY-MM-DD - 匹配该站点时区内该一天及其之后的所有订单。
  • <YYYY-MM-DD - 匹配该站点时区内该一天之前的订单。
  • <=YYYY-MM-DD - 匹配该站点时区内该一天及其之前的订单。
  • YYYY-MM-DD...YYYY-MM-DD - 匹配该站点时区内某一天及其之间所有订单。
  • TIMESTAMP - 匹配 UTC 时区内某一个秒的订单。
  • >TIMESTAMP - 匹配 UTC 时区内该一个秒之后的订单。
  • >=TIMESTAMP - 匹配 UTC 时区内该一个秒及其之后的所有订单。
  • <TIMESTAMP - 匹配 UTC 时区内该一个秒之前的订单。
  • <=TIMESTAMP - 匹配 UTC 时区内该一个秒及其之前的订单。
  • TIMESTAMP...TIMESTAMP - 匹配 UTC 时区内某一个秒及其之间所有订单。

示例

// 获取 2016 年 2 月 12 日已支付的订单。
$orders = wc_get_orders( array( 'date_paid' => '2016-02-12' ) );
// 获取创建于过去一小时内的订单。
$args = array(
    'date_created' => '<' . ( time() - HOUR_IN_SECONDS ),
);
$orders = wc_get_orders( $args );
// 获取 2017 年 5 月 16 日 21:46:17 UTC 到 2017 年 5 月 17 日 12:46:17 UTC 之间的已完成订单。
$args = array(
    'date_completed' => '1494938777...1494971177',
);
$orders = wc_get_orders( $args );

元数据

参数 描述
meta_query 一个或多个包含键 key(元数据键)、value(可选,字符串或数组)以及可选的 type 和 compare 的数组。
此参数类似于 WP_Query 的 meta_query,支持各种比较运算符以及通过 AND/OR 关系连接的查询级别。

有关更多详细信息和示例,请参阅 HPOS 订单查询 指南。

:::警告

只有当 HPOS 是配置的订单数据存储时(自 WooCommerce 8.2 以来为默认设置),才支持 meta_query。

在使用之前,请使用 OrderUtil::custom_orders_table_usage_is_enabled() 检查是否已启用。 :::

示例

// 具有元数据 'custom_field' 设置为 'some_value' 且元数据 'weight' 大于 '50' 的订单。
$orders = wc_get_orders(
    array(
        'meta_query' => array(
            array(
                'key'     => 'custom_field',
                'value'   => 'some_value',
                'compare' => '='
            ),
            array(
                'key'     => 'weight',
                'value'   => '50',
                'compare' => '>='
            ),
            'relation' => 'AND'
        )
    )
);

订单字段

参数 描述
field_query 一个或多个包含键 field(任何订单属性)、value 以及可选的 type 和 compare 的数组。
此参数类似于前面部分中描述的 meta_query 参数,支持各种比较运算符以及通过 AND/OR 关系连接的查询级别。

有关更多详情和示例,请参考 HPOS 订单查询 指南。

:::警告

field_query 的支持仅在 HPOS 作为配置的订单数据存储时可用(自 WooCommerce 8.2 以来为默认设置)。

在使用前,请使用 OrderUtil::custom_orders_table_usage_is_enabled() 检查是否已启用。 :::

示例

// 获取总额大于 100 或来自纽约市的订单。
$orders = wc_get_orders(
    array(
        'field_query' => array(
            array(
                'field' => 'total',
                'value' => 100,
                'compare' => '>'
            ),
            array(
                'field' => 'billing_city',
                'value' => 'New York',
                'compare' => '='
            ),
            'relation' => 'OR'
        )
    )
);

高级日期查询

参数 描述
date_query 一个或多个包含键 column(订单日期:date_completed、date_created、date_updated 或 date_paid,可选地后跟 _gmt 表示 UTC 日期)、value 以及可选的 type 和 compare 的数组。
此参数类似于 WP_Query 的 date_query,支持各种比较运算符以及通过 AND/OR 关系连接的查询级别。

有关更多详情和示例,请参考 HPOS 订单查询 指南。

:::警告

date_query 的支持仅在 HPOS 作为配置的订单数据存储时可用(自 WooCommerce 8.2 以来为默认设置)。

在使用前,请使用 OrderUtil::custom_orders_table_usage_is_enabled() 检查是否已启用。 :::

示例

// 示例:获取过去一个月内已支付且创建时间在中午之前的订单。

$orders = wc_get_orders(
    array(
        'date_query' => array(
            'relation' => 'AND',
            array(
                'column'  => 'date_created_gmt',
                'hour'    => 12,
                'compare' => '<'
            ),
            array(
                'column'  => 'date_paid_gmt',
                'after'   => '1 month ago',
            ),
        ),
    )
);

添加对自定义参数的支持

开发者可以通过过滤生成的查询,为 wc_get_orders() 和 WC_Order_Query 添加对自定义参数的支持,从而扩展查询功能。

WooCommerce 当前支持两种订单存储机制:HPOS(默认)和旧版(使用 WordPress 帖子和元数据),每种机制都有自己的钩子,用于过滤生成的查询:

  • (HPOS) woocommerce_order_query_args 用于将参数转换为现有参数,或者 woocommerce_orders_table_query_clauses 用于编写自己的 SQL。
  • (旧版) woocommerce_order_data_store_cpt_get_orders_query 用于将参数转换为 WP_Query 参数。
/**
 * 示例:处理自定义 'customvar' 查询变量,以获取具有 'customvar' 元数据的订单。
 */
use Automattic\WooCommerce\Utilities\OrderUtil;

// HPOS 版本。
function handle_custom_query_var_hpos( $query_args ) {
    if ( ! empty( $query_args['customvar'] ) ) {
        if ( ! isset( $query_args['meta_query'] ) ) {
            $query_args['meta_query'] = array();
        }

		$query_args['meta_query'][] = array(
			'key'   => 'customvar',
			'value' => esc_attr( $query_args['customvar'] ),
		);

        unset( $query_args['customvar'] );
    }


    return $query_args;
}

// 旧版版本。
function handle_custom_query_var_legacy( $query, $query_vars ) {
	if ( ! empty( $query_vars['customvar'] ) ) {
		$query['meta_query'][] = array(
			'key'   => 'customvar',
			'value' => esc_attr( $query_vars['customvar'] ),
		);
	}

	return $query;
}

if ( OrderUtil::custom_orders_table_usage_is_enabled() ) {
    // HPOS。
    add_filter(
        'woocommerce_order_query_args',
        'handle_custom_query_var_hpos'
    );
} else {
    // 旧版支持。
    add_filter(
        'woocommerce_order_data_store_cpt_get_orders_query',
        'handle_custom_query_var_legacy',
        10,
        2
    );
}

用法:

$orders = wc_get_orders( array( 'customvar' => 'somevalue' ) );