php WordPress(WooCommerce):使用SELECT获取30天的order_total(获取总收入金额)

omvjsjqw  于 2023-09-29  发布在  PHP
关注(0)|答案(1)|浏览(97)

我有一个代码,假设连接到WordPress数据库,并从shop_order(WooCommerce插件)获取自定义日期的_order_total。下面是我的函数:

<?php
function get_total_income_a(){
    global $wpdb;
    return $wpdb->get_var( "
        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 p.post_date BETWEEN '2023-09-01' AND '2023-09-02'
        AND pm.meta_key = '_order_total'
    " );
}
?>

这是回显总订单值的代码:

<?php echo strip_tags( get_total_income_a() ) ?>

这些代码对于代码中定义的日期工作正常。我有几个问题

  1. AND p.post_date BETWEEN '2023-09-01' AND '2023-09-02'应该只选择一天。还有其他选择吗?我的意思是,而不是定义一个范围,我怎么能只输入一个日期。例如,如果我只想获取2023-09-01日期的数据,该怎么办?只是为了速记。
    1.正如你可以看到我的代码,它将返回数据只有一个日期。我想创建一个图表,需要30天的此值。因此,在一个非常初学者和简单的模式下,我必须每天复制一次此代码并更改日期!这意味着我必须复制上面的代码30次!有没有更简单、更轻松的方法来做到这一点?我的意思是保留一个SELECT并仅使用以下代码从自定义日期获取数据:
// Get data for 2023-09-01:
<?php echo strip_tags( get_total_income_a('2023-09-01') ) ?>

// Get data for 2023-09-02:
<?php echo strip_tags( get_total_income_a('2023-09-02') ) ?>

// Get data for 2023-09-03:
<?php echo strip_tags( get_total_income_a('2023-09-03') ) ?>

// And so on until the end of the month
dced5bon

dced5bon1#

关于你的第一个问题:由于'post_date'的类型是'datetime',并且您希望忽略时间部分以选择一整天,因此您可以使用字符串比较或强制转换为'date':

AND p.post_date LIKE '2023-09-01%'

AND CAST(p.post_date AS DATE) = '2023-09-01'

至于你的第二个问题,你只需要按post_date对结果进行分组。同样,由于这是一个datetime列,因此还需要将其转换为date:

GROUP BY CAST(p.post_date AS DATE)

当然,这将返回一个数组,所以你想使用'get_results'而不是'get_var'。要将post_date添加到结果集中,还需要将造型添加到select中:

SELECT CAST(p.post_date AS date), SUM(pm.meta_value)

因此完整的(未测试的)函数可能如下所示:

<?php
function get_total_income_a(){
    global $wpdb;
    return $wpdb->get_results( "
        SELECT CAST(p.post_date AS DATE), 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 p.post_date BETWEEN '2023-09-01' AND '2023-09-26'
        AND pm.meta_key = '_order_total' 
        GROUP BY CAST(p.post_date AS DATE)
    " );
}
?>

编辑:正如@CBroe在评论中指出的,在这种情况下,“DATE(p.post_date)”应该和“CAST(p.post_date AS DATE)”一样好用。

相关问题