WordPress(WooCommerce):用SELECT获取30天order_total(总营收)
优化WooCommerce单日营收查询函数
先给出优化后的完整可复用函数:
<?php function get_total_income_a($target_date) { global $wpdb; // 验证日期格式,确保为YYYY-MM-DD格式 if (!DateTime::createFromFormat('Y-m-d', $target_date)) { return 0; // 格式错误时返回0,也可自定义提示 } // 安全拼接SQL并执行查询 $sql = $wpdb->prepare(" SELECT SUM(pm.meta_value) FROM {$wpdb->prefix}posts as p INNER JOIN {$wpdb->prefix}postmeta as pm ON p.ID = pm.post_id WHERE p.post_type = 'shop_order' AND p.post_status IN ('wc-completed','wc-processing') AND DATE(p.post_date) = %s AND pm.meta_key = '_order_total' ", $target_date); $total = $wpdb->get_var($sql); return $total ? $total : 0; // 无数据时返回0,避免输出NULL } ?>
问题解答
1. 单日数据筛选的简洁写法
可以直接使用MySQL的DATE()函数提取日期部分匹配,替代BETWEEN的范围写法:
AND DATE(p.post_date) = '2023-09-01'
这个写法仅需传入单个日期,比范围查询更直观简洁。如果追求更好的查询性能(能利用索引),也可以用自动生成的时间范围写法:
AND p.post_date >= '2023-09-01 00:00:00' AND p.post_date < '2023-09-02 00:00:00'
这种写法不需要手动输入次日日期,函数内可通过日期计算自动生成。
2. 支持传参的函数优化
优化后的函数已支持传入单个日期参数,调用方式如下:
// 获取2023-09-01的营收数据 <?php echo strip_tags(get_total_income_a('2023-09-01')); ?> // 获取2023-09-02的营收数据 <?php echo strip_tags(get_total_income_a('2023-09-02')); ?>
如果需要批量获取30天的数据,无需重复写30次调用,用循环自动生成日期即可:
<?php // 生成最近30天的日期并批量查询 $start_date = new DateTime('-29 days'); $end_date = new DateTime(); while ($start_date <= $end_date) { $date_str = $start_date->format('Y-m-d'); $daily_total = get_total_income_a($date_str); echo "日期:{$date_str},营收:{$daily_total}<br>"; $start_date->modify('+1 day'); } ?>
额外优化说明
- 加入日期格式验证,避免无效日期导致SQL错误
- 使用
$wpdb->prepare()拼接SQL,彻底避免SQL注入风险 - 处理无订单数据的场景,返回0而非
NULL,适配图表数据需求
内容的提问来源于stack exchange,提问作者Ahmad Karimi
相关产品推荐
相关产品推荐

