WooCommerce升级至3.2.6后自定义订单代码失效,求get_posts正确用法
WooCommerce 3.0+ 中获取订单的正确方式
我来帮你梳理下升级后代码失效的原因,以及正确的订单查询姿势:
首先纠正一个误区:WooCommerce 3.0+ 并没有把订单状态迁移到分类(taxonomy)中,订单状态依然是以wc-为前缀的post_status存在的。你最初的代码思路其实没问题,但可能因为缺少关键参数导致无数据返回;而你尝试的tax_query写法是错误的——shop_order_status这个分类并不用于存储订单状态,反而会让查询条件失效。
一、用get_posts正确查询订单的写法
如果坚持使用get_posts,你需要确保参数完整,尤其是要设置获取所有符合条件的订单(默认get_posts仅返回5条),正确代码如下:
$orders = get_posts( array( 'post_type' => 'shop_order', 'post_status' => array( 'wc-processing', 'wc-completed' ), // 状态前缀依然保留wc- 'posts_per_page' => -1, // 必须设为-1才能获取全部订单,默认仅返回5条 'numberposts' => -1, // 兼容旧版WordPress,和posts_per_page作用一致 'orderby' => 'date', // 可选:按订单日期排序 'order' => 'DESC', // 可选:倒序排列,最新订单在前 ) );
你之前的代码大概率是因为没加posts_per_page => -1,导致只返回了前5条订单,而刚好这5条没有符合状态的,所以看起来没有数据。
二、更推荐的官方方式:wc_get_orders或WC_Order_Query
WooCommerce 3.0+ 官方推出了专门的订单查询类WC_Order_Query,以及封装好的函数wc_get_orders,这是更可靠的方案——它会自动处理WooCommerce内部逻辑(比如权限校验、订单状态映射、元数据查询等),后续版本更新也会优先维护这些API,避免直接操作post带来的兼容性问题。
基本用法:
// 构建查询参数 $order_args = array( 'status' => array( 'processing', 'completed' ), // 这里不需要加wc-前缀,直接用状态slug 'limit' => -1, // 获取所有符合条件的订单 'orderby' => 'date', 'order' => 'DESC', ); // 获取订单列表 $orders = wc_get_orders( $order_args ); // 也可以直接用WC_Order_Query类 // $order_query = new WC_Order_Query( $order_args ); // $orders = $order_query->get_orders();
遍历订单统计商品的正确姿势
升级后,获取订单商品的方式也有变化:如果用wc_get_orders,返回的直接是WC_Order对象,无需额外转换:
foreach ( $orders as $order ) { // 遍历订单中的每个商品 foreach ( $order->get_items() as $item ) { // 获取商品对象 $product = $item->get_product(); // 获取商品名称 $product_name = $item->get_name(); // 获取订购数量 $quantity = $item->get_quantity(); // 获取商品SKU(如果有) $sku = $product ? $product->get_sku() : ''; // 在这里加入你的统计逻辑即可 } }
如果还是用get_posts,返回的是WP_Post对象,需要先转换为WC_Order对象再操作:
foreach ( $orders as $post ) { $order = wc_get_order( $post->ID ); if ( !$order ) continue; // 后续商品操作和上面一致 }
总结
- 放弃错误的
tax_query写法,订单状态依然是post_status,前缀保留wc- - 使用
get_posts时,务必添加posts_per_page => -1来获取全部订单 - 优先选择
wc_get_orders,这是官方推荐的API,兼容性和稳定性更好
内容的提问来源于stack exchange,提问作者ComputerGiant
相关产品推荐
相关产品推荐

