WordPress date_query异常:WooCommerce订单统计数值不符求助
排查WooCommerce订单统计与日期筛选问题
先帮你拆解下遇到的两个核心问题,再给出针对性的修正方案:
问题1:带date_query时返回0订单
你调试输出的订单日期是2018-01-17,而代码里用了'after' => date('Y-m-d', strtotime('-90 days'))——假设当前是2024年,那90天前的日期远晚于2018年,这个订单自然不在筛选范围内,所以$customer_orders是空数组,返回0。如果你的核心需求是判断用户所有历史订单数是否为0,那完全不需要这个date_query参数;如果确实要筛选90天内的订单,得先确认订单日期是否在这个时间区间里。
问题2:移除date_query后$total显示19,但只有1条订单
这里你混淆了一个关键概念:$order->get_total()获取的是订单的总金额,不是订单数量!你循环里做的是$total += $order->get_total(),所以这个19是那单订单的金额,而不是订单数。如果要统计订单数量,直接用count($customer_orders)就可以,或者循环里做$total++。
修正后的代码
根据你的核心需求「判断用户是否注册超30天且订单数为0」,我调整了代码,解决了上述问题:
// 判断账号是否注册超指定天数 function woo_reg_matured( $days_old = 30 ) { $cu = wp_get_current_user(); return isset( $cu->data->user_registered ) && strtotime( $cu->data->user_registered ) < strtotime( sprintf( '-%d days', $days_old ) ); } // 短代码:判断用户活跃状态 function woo_inactive_shortcode( $atts = array(), $content = '' ) { if ( !is_user_logged_in() ) return ''; // 未登录直接返回空 // 获取用户所有已完成订单(如果要加日期筛选,再调整date_query) $customer_orders = get_posts( array( 'numberposts' => -1, 'meta_key' => '_customer_user', 'meta_value' => get_current_user_id(), 'post_type' => 'shop_order', 'post_status' => 'wc-completed' ) ); $order_count = count( $customer_orders ); // 统计订单数量 echo 'Orders: ' . $order_count . '<br>'; if ( $order_count === 0 ) { // 订单数为0时判断注册时长 if( woo_reg_matured( 30 ) ) { echo 'You are inactive with ' . $order_count . ' orders and account age over 30 days'; } else { echo 'You are inactive with ' . $order_count . ' orders and account age under 30 days'; } } else { echo 'You are active with over 30 days age and ' . $order_count . ' orders'; } } add_shortcode( 'woo_inactive', 'woo_inactive_shortcode' );
额外说明
- 如果你的需求是判断「90天内订单数为0且注册超30天」,那重新加
date_query时要注意逻辑:比如要先确认用户最近的订单日期是否早于90天前,而不是简单筛选订单。 - 用
count($customer_orders)比循环计数更高效,直接获取数组长度即可。
内容的提问来源于stack exchange,提问作者user9229528
相关产品推荐
相关产品推荐

