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

WordPress (WooCommerce): Using SELECT to get order_total for 30 days (Getting total revenue amount)

提问人:TLP Masih 提问时间:9/26/2023 更新时间:9/26/2023 访问量:43

问:

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

<?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

  2. 正如你所看到的,我的代码,它只会返回一个日期的数据。我想创建一个图表,并且需要此值 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
php mysql wordpress 选择 woocommerce

评论

1赞 CBroe 9/26/2023
1.DATE(p.post_date) = '2023-09-01'
1赞 CBroe 9/26/2023
但对于 2.,你宁愿继续使用 BETWEEN。将其与 组合在一起,并添加到您的列列表中。也许 ORDER BY 也具有相同的值。GROUP BY DATE(p.post_date)DATE(p.post_date)

答:

1赞 volkerschulz 9/26/2023 #1

至于你的第一个问题:由于“post_date”的类型是“datetime”,并且你想忽略时间部分来选择一整天,你可以使用字符串比较或转换为“date”:

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

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

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

GROUP BY CAST(p.post_date AS DATE)

当然,这将返回一个数组,因此您希望使用 'get_results' 而不是 'get_var'。若要将post_date添加到结果集,请同时将强制转换添加到所选内容中:

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)”一样好。

评论

0赞 TLP Masih 9/26/2023
谢谢,我怎样才能从这个SQL中获取变量数据?我的意思是像 AND 这样的代码,用于从一个 SQL 语句中获取数据?还是我应该为每个日期复制 SQL?<?php echo strip_tags( get_total_income_a('2023-09-01') ) ?><?php echo strip_tags( get_total_income_a('2023-09-02') ) ?>
1赞 volkerschulz 9/26/2023
您将参数添加到函数声明中,例如“function get_total_income_a($from_date, $to_date){..”,然后使用这些变量而不是语句中的固定日期,例如“AND p.post_date BETWEEN '{$from_date}' AND '{$to_date}'”。如果不信任这些参数,请确保使用 wpdb->prepare。