如何通过WooCommerce WC_Order_Query按元数据及订单号获取订单
我来帮你搞定这两个WooCommerce订单查询的问题,都是开发中经常碰到的场景,直接上解决方案:
1. 使用WC_Order_Query按元数据获取订单
WC_Order_Query本身就支持通过元数据筛选订单,你只需要在查询参数里加入meta_query数组即可,下面给几个常用的示例:
- 基础场景:匹配特定元键和元值
比如要获取所有元键为_my_custom_meta且元值为special_customer的订单:
$orders = wc_get_orders( array( 'status' => 'completed', // 可选,可指定筛选订单状态 'meta_query' => array( array( 'key' => '_my_custom_meta', 'value' => 'special_customer', 'compare' => '=', // 默认就是=,可以省略 ), ), ) );
- 进阶场景:使用比较操作符
如果需要更灵活的筛选,比如元值大于某个数字,或者包含特定字符串:
// 获取元键_total_spent值大于1000的订单 $orders = wc_get_orders( array( 'meta_query' => array( array( 'key' => '_total_spent', 'value' => 1000, 'type' => 'numeric', 'compare' => '>', ), ), ) );
- 多条件元数据查询
如果需要同时满足多个元数据条件,可以在meta_query里添加多个数组:
$orders = wc_get_orders( array( 'meta_query' => array( 'relation' => 'AND', // 可选,默认AND,也可以用OR array( 'key' => '_my_custom_meta', 'value' => 'special_customer', ), array( 'key' => '_order_total', 'value' => 500, 'type' => 'numeric', 'compare' => '>=', ), ), ) );
2. 通过订单号而非订单ID获取订单(解决
number参数无效问题) 你调用wc_get_orders( array( 'number' => '1000' ) )没生效,是因为wc_get_orders根本不支持number这个参数,得根据你的订单号类型来选择正确的查询方式:
情况1:默认订单号(和Post ID一致)
WooCommerce默认的订单号其实就是订单的Post ID,如果你用的是默认设置,直接用wc_get_order()传入订单号即可:
$order = wc_get_order( 1000 ); // 这里的1000就是订单号(等于Post ID)
如果不确定订单号是否对应Post ID,也可以用WC_Order_Query的p参数(对应Post ID):
$orders = wc_get_orders( array( 'p' => 1000, // 通过Post ID(默认订单号)查询 ) ); // 取第一个结果 if ( ! empty( $orders ) ) { $order = $orders[0]; }
情况2:自定义订单号(非Post ID)
如果你用了自定义订单号插件,或者自己开发了自定义订单号功能,订单号通常存储在_order_number这个元键里,这时候需要用meta_query来查询:
$orders = wc_get_orders( array( 'meta_query' => array( array( 'key' => '_order_number', 'value' => '1000', // 你的自定义订单号 'compare' => '=', ), ), ) ); // 取第一个结果 if ( ! empty( $orders ) ) { $order = $orders[0]; }
另外,如果你需要频繁通过自定义订单号查询订单,可以封装成一个小函数,方便复用:
function get_order_by_custom_number( $order_number ) { $orders = wc_get_orders( array( 'meta_query' => array( array( 'key' => '_order_number', 'value' => $order_number, 'compare' => '=', ), ), 'limit' => 1, // 只取第一个结果,因为订单号唯一 ) ); return ! empty( $orders ) ? $orders[0] : false; } // 使用示例 $order = get_order_by_custom_number( '1000' );
内容的提问来源于stack exchange,提问作者OhMad
相关产品推荐
相关产品推荐

