计算 Woocommerce 中每个订单状态的不同订单状态计数和总现金
Calculate different order status count and total cash for each order status in Woocommerce
我需要在 woocommerce 查询中的某些天之间获取不同状态的订单总数。为了让它循环遍历某天之间的所有订单,我使用以下查询:
$args = array(
'post_type' => 'shop_order',
'post_status' => 'publish',
'posts_per_page' => -1,
'date_query' => array(
array(
'after' => array(
'year' => 2016,
'month' =>01,
'day' =>01,
),
'before' => array(
'year' => 2016,
'month' => 01,
'day' =>30,
),
'inclusive' => true,
),
),
);
$loop=new WP_Query($args);
通过使用此代码,我可以遍历所有查询并正确获取详细信息。
现在我需要将详细信息转换为以下格式
wc-shipped : Total order -> 10 total_cash -> 300$
wc- completed :
Totla order -> 34 total_cash -> 4580$
wc-cancelled : Total order ->
12 total_cash -> 100$
如何获得这种格式的详细信息?
我知道如何获取wc-shipped : Total order -> 10
为此我使用:
$order_status_get[]=$order->post_status;
$order_status_get= array_count_values($order_status_get);
foreach ($order_status_get as $key => $value) {
echo $key.'->'.$value;
}
但是我也需要价格。为了获得价格,我可以使用 $order_total_array[]=$order->get_total();
但我不知道如何组合它们并获得所需格式的结果。
如果我对你的问题的理解正确,你希望所有订单都简化为由 post_status
字段求和的行列表,对吗?
最后你想要这样的东西:
$order_status = array(
'wc-shipped' => 10,
'wc-completed' => 20,
'wc-cancelled' => 30
);
我看到两个选项:
1) 将查询更改为仅利用 posts_groupby
汇总列 return。
2) 遍历结果集中的所有行并通过post_status
手动汇总它们。使用带有状态键的数组并将值递增 $order->get_total()
我知道的最简单的方法...
使用 WC_Admin_Report
class...您可以获得结果数组并根据需要对其进行操作...示例结果打印在下方...
include_once( WP_PLUGIN_DIR . '/woocommerce/includes/admin/reports/class-wc-admin-report.php');
$reports = new WC_Admin_Report();
$args = array(
'data' => array(
'_order_total' => array(
'type' => 'meta',
'function' => 'SUM',
'name' => 'total_cash'
),
'ID' => array(
'type' => 'post_data',
'function' => 'COUNT',
'name' => 'total_orders'
),
'post_status' => array(
'type' => 'post_data',
'function' => '',
'name' => 'status'
),
),
'where' => array(
array(
'key' => 'post_date',
'value' => date( 'Y-m-d', strtotime( '02/01/2016' ) ), // starting date
'operator' => '>'
),
array(
'key' => 'post_date',
'value' => date( 'Y-m-d', strtotime( '02/31/2016' ) ), // end date...
'operator' => '<'
),
),
'where_meta' => array(
array(
'meta_key' => 'who',
'meta_value' => 'manik',
'operator' => '='
)
),
'order_status' => array( 'cancelled', 'completed', 'shipped' ),
'group_by' => 'posts.post_status',
'query_type' => 'get_results',
);
$data = $reports->get_order_report_data($args);
print_r($data);
打印类似
的内容
Array
(
[0] => stdClass Object
(
[total_cash] => 35
[total_orders] => 2
[status] => wc-cancelled
)
[1] => stdClass Object
(
[total_cash] => 315
[total_orders] => 21
[status] => wc-completed
)
[2] => stdClass Object
(
[total_cash] => 211
[total_orders] => 11
[status] => wc-shipped
)
)
然后操纵$data
//print_r($data);
//
$currency = (function_exists('get_woocommerce_currency_symbol'))?get_woocommerce_currency_symbol():'';
foreach($data as $item) {
echo sprintf('<p>%s : Total Orders %s -> Total Cash -> %s%s </p>', $item->status, $item->total_orders, $item->total_cash, $currency);
}
demo of $data
. 单击执行代码按钮。
打印如下:
wc-cancelled : Total Orders 2 -> Total Cash -> 35$
wc-completed : Total Orders 21 -> Total Cash -> 315$
wc-shipped : Total Orders 11 -> Total Cash -> 211$
我会根据你的问题给出解决方案。
$order = new WC_Order('your order id ');
你的情况
while($loop->have_posts()): $loop->the_post();
$order_id=get_the_ID();
$order = new WC_Order($order_id);
(1) 从我们可以使用的订单中获取订单状态$order->post_status
(2) 要获得订单总数,我们可以使用 $order->get_total()
您可以将它们组合起来并存储在一个数组中
$order_status_array[]=$order->post_status .'*'.$order->get_total();
这里我结合使用 *
,你可以使用你自己的。
这样输出的数组就像
Array ( [0] => wc-cancelled*64 [1] => wc-cancelled*254 [2] =>wc-cancelled*93 [3] => wc-cancelled*44 [4] => wc-cancelled*213 [5] => wc-cancelled*44)
然后用下面的代码把这个数组排列成合适的格式
$new_array = [];
foreach($order_status_array as $key => $value) {
list($name, $val) = explode('*', $value);
if(array_key_exists($name, $new_array)) {
$new_array[$name]['total_cash'] += $val;
$new_array[$name]['total_order']++;
} else {
$new_array[$name]['total_cash'] = $val;
$new_array[$name]['total_order'] = 1;
}
}
现在您的阵列已准备就绪,就像
Array(
[wc-cancelled] => Array(
[total_cash] => ...
[total_order] =>...
)
...
)
现在使用下面的代码
foreach ($new_array as $l=>$m){
echo $l.'Total Order:->'.$m['total_order'] .'Total Cash:->'.$m['total_cash'].'</br>';
}
。这将工作。您也可以使用其他好的解决方案。试试这个。
所以整个代码是
while($loop->have_posts()): $loop->the_post();
$order_id=get_the_ID();
$order = new WC_Order($order_id);
$order_status_array[]=$order->post_status .'*'.$order->get_total();
endwhile;
$new_array = [];
foreach($order_status_array as $key => $value) {
list($name, $val) = explode('*', $value);
if(array_key_exists($name, $new_array)) {
$new_array[$name]['total_cash'] += $val;
$new_array[$name]['total_order']++;
} else {
$new_array[$name]['total_cash'] = $val;
$new_array[$name]['total_order'] = 1;
}
}
foreach ($new_array as $l=>$m){
echo $l.'Total Order:->'.$m['total_order'] .'Total Cash:->'.$m['total_cash'].'</br>';
}
我需要在 woocommerce 查询中的某些天之间获取不同状态的订单总数。为了让它循环遍历某天之间的所有订单,我使用以下查询:
$args = array(
'post_type' => 'shop_order',
'post_status' => 'publish',
'posts_per_page' => -1,
'date_query' => array(
array(
'after' => array(
'year' => 2016,
'month' =>01,
'day' =>01,
),
'before' => array(
'year' => 2016,
'month' => 01,
'day' =>30,
),
'inclusive' => true,
),
),
);
$loop=new WP_Query($args);
通过使用此代码,我可以遍历所有查询并正确获取详细信息。 现在我需要将详细信息转换为以下格式
wc-shipped : Total order -> 10 total_cash -> 300$
wc- completed : Totla order -> 34 total_cash -> 4580$
wc-cancelled : Total order -> 12 total_cash -> 100$
如何获得这种格式的详细信息?
我知道如何获取wc-shipped : Total order -> 10
为此我使用:
$order_status_get[]=$order->post_status;
$order_status_get= array_count_values($order_status_get);
foreach ($order_status_get as $key => $value) {
echo $key.'->'.$value;
}
但是我也需要价格。为了获得价格,我可以使用 $order_total_array[]=$order->get_total();
但我不知道如何组合它们并获得所需格式的结果。
如果我对你的问题的理解正确,你希望所有订单都简化为由 post_status
字段求和的行列表,对吗?
最后你想要这样的东西:
$order_status = array(
'wc-shipped' => 10,
'wc-completed' => 20,
'wc-cancelled' => 30
);
我看到两个选项:
1) 将查询更改为仅利用 posts_groupby
汇总列 return。
2) 遍历结果集中的所有行并通过post_status
手动汇总它们。使用带有状态键的数组并将值递增 $order->get_total()
我知道的最简单的方法...
使用 WC_Admin_Report
class...您可以获得结果数组并根据需要对其进行操作...示例结果打印在下方...
include_once( WP_PLUGIN_DIR . '/woocommerce/includes/admin/reports/class-wc-admin-report.php');
$reports = new WC_Admin_Report();
$args = array(
'data' => array(
'_order_total' => array(
'type' => 'meta',
'function' => 'SUM',
'name' => 'total_cash'
),
'ID' => array(
'type' => 'post_data',
'function' => 'COUNT',
'name' => 'total_orders'
),
'post_status' => array(
'type' => 'post_data',
'function' => '',
'name' => 'status'
),
),
'where' => array(
array(
'key' => 'post_date',
'value' => date( 'Y-m-d', strtotime( '02/01/2016' ) ), // starting date
'operator' => '>'
),
array(
'key' => 'post_date',
'value' => date( 'Y-m-d', strtotime( '02/31/2016' ) ), // end date...
'operator' => '<'
),
),
'where_meta' => array(
array(
'meta_key' => 'who',
'meta_value' => 'manik',
'operator' => '='
)
),
'order_status' => array( 'cancelled', 'completed', 'shipped' ),
'group_by' => 'posts.post_status',
'query_type' => 'get_results',
);
$data = $reports->get_order_report_data($args);
print_r($data);
打印类似
的内容Array
(
[0] => stdClass Object
(
[total_cash] => 35
[total_orders] => 2
[status] => wc-cancelled
)
[1] => stdClass Object
(
[total_cash] => 315
[total_orders] => 21
[status] => wc-completed
)
[2] => stdClass Object
(
[total_cash] => 211
[total_orders] => 11
[status] => wc-shipped
)
)
然后操纵$data
//print_r($data);
//
$currency = (function_exists('get_woocommerce_currency_symbol'))?get_woocommerce_currency_symbol():'';
foreach($data as $item) {
echo sprintf('<p>%s : Total Orders %s -> Total Cash -> %s%s </p>', $item->status, $item->total_orders, $item->total_cash, $currency);
}
demo of $data
. 单击执行代码按钮。
打印如下:
wc-cancelled : Total Orders 2 -> Total Cash -> 35$
wc-completed : Total Orders 21 -> Total Cash -> 315$
wc-shipped : Total Orders 11 -> Total Cash -> 211$
我会根据你的问题给出解决方案。
$order = new WC_Order('your order id ');
你的情况
while($loop->have_posts()): $loop->the_post();
$order_id=get_the_ID();
$order = new WC_Order($order_id);
(1) 从我们可以使用的订单中获取订单状态$order->post_status
(2) 要获得订单总数,我们可以使用 $order->get_total()
您可以将它们组合起来并存储在一个数组中
$order_status_array[]=$order->post_status .'*'.$order->get_total();
这里我结合使用 *
,你可以使用你自己的。
这样输出的数组就像
Array ( [0] => wc-cancelled*64 [1] => wc-cancelled*254 [2] =>wc-cancelled*93 [3] => wc-cancelled*44 [4] => wc-cancelled*213 [5] => wc-cancelled*44)
然后用下面的代码把这个数组排列成合适的格式
$new_array = [];
foreach($order_status_array as $key => $value) {
list($name, $val) = explode('*', $value);
if(array_key_exists($name, $new_array)) {
$new_array[$name]['total_cash'] += $val;
$new_array[$name]['total_order']++;
} else {
$new_array[$name]['total_cash'] = $val;
$new_array[$name]['total_order'] = 1;
}
}
现在您的阵列已准备就绪,就像
Array(
[wc-cancelled] => Array(
[total_cash] => ...
[total_order] =>...
)
...
)
现在使用下面的代码
foreach ($new_array as $l=>$m){
echo $l.'Total Order:->'.$m['total_order'] .'Total Cash:->'.$m['total_cash'].'</br>';
}
。这将工作。您也可以使用其他好的解决方案。试试这个。
所以整个代码是
while($loop->have_posts()): $loop->the_post();
$order_id=get_the_ID();
$order = new WC_Order($order_id);
$order_status_array[]=$order->post_status .'*'.$order->get_total();
endwhile;
$new_array = [];
foreach($order_status_array as $key => $value) {
list($name, $val) = explode('*', $value);
if(array_key_exists($name, $new_array)) {
$new_array[$name]['total_cash'] += $val;
$new_array[$name]['total_order']++;
} else {
$new_array[$name]['total_cash'] = $val;
$new_array[$name]['total_order'] = 1;
}
}
foreach ($new_array as $l=>$m){
echo $l.'Total Order:->'.$m['total_order'] .'Total Cash:->'.$m['total_cash'].'</br>';
}