提问人:TLP Masih 提问时间:9/26/2023 更新时间:9/26/2023 访问量:43
WordPress (WooCommerce):使用 SELECT 获取 30 天order_total(获取总收入金额)
WordPress (WooCommerce): Using SELECT to get order_total for 30 days (Getting total revenue amount)
问:
我有一个代码,假设连接到 WordPress 数据库并从(WooCommerce 插件)获取自定义日期。这是我的函数:_order_total
shop_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() ) ?>
这些代码适用于代码中定义的日期。但我有一些问题:
应该只选择一天。有没有其他选择?我的意思是,与其定义一个范围,不如说我怎么能只输入一个日期。例如,如果我只想获取日期数据,该怎么办?只是为了速记。
AND p.post_date BETWEEN '2023-09-01' AND '2023-09-02'
2023-09-01
正如你所看到的,我的代码,它只会返回一个日期的数据。我想创建一个图表,并且需要此值 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
答:
至于你的第一个问题:由于“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)”一样好。
评论
<?php echo strip_tags( get_total_income_a('2023-09-01') ) ?>
<?php echo strip_tags( get_total_income_a('2023-09-02') ) ?>
评论
DATE(p.post_date) = '2023-09-01'
GROUP BY DATE(p.post_date)
DATE(p.post_date)