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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:48:18