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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 23:37:41