2016-02-04 3 views
4

Мне нужно получить общий статус заказа между несколькими днями в запросе 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); 

с помощью этого кода я могу перебрать все запрос и получить детали правильно. Теперь мне нужно, чтобы получить подробную информацию в следующем формате

туалет погруженные: Общий заказ -> 10 total_cash -> 300 $
WC- завершен: Totla заказ -> 34 total_cash -> 4580 $
туалет подавленные: Общий порядок -> 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();

Но я не знаю, как их объединить и получить результат в нужном формате.

ответ

3

Самый простой способ я знаю ...

используя WC_Admin_Report класс ... вы можете получить массив результатов и манипулировать им, как вы хотите ... результат образец печатается ниже ...

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. Нажмите кнопку Выполнить код.

печати как:

туалет подавленный: Всего заказы 2 -> Итого Денежные средства -> 35 $
туалет завершенные: Всего заказы 21 -> Total Cash -> 315 $
туалет-погруженные : Всего заказов 11 -> Всего наличных средств -> 211 $

+0

Спасибо, Рейгель. Я собираюсь проверить это. – Manik

+0

Вы можете проверить эту дату линии ('Ym-d', strtotime ('01/01/2016 ')),' value '=> date (' Ym-d ', strtotime ('02/01/2016')). Вы правильно пишете это или нет? – Manik

+0

также, как я могу проверить значение настраиваемого поля в этом запросе?. Потому что в типе shop_order у меня тоже есть настраиваемое поле. Я пишу это и в WP_Query, например 'meta_key' => 'кто', \t \t \t \t \t \t 'meta_value' => 'Маник' – Manik

1

Если я правильно понял ваш вопрос, вы хотите, чтобы все заказы были окутаны в список строк, суммированных полем post_status, не так ли?

В конце концов, вы хотите что-то вроде этого:

$order_status = array(
    'wc-shipped' => 10, 
    'wc-completed' => 20, 
    'wc-cancelled' => 30 
); 

Я вижу два варианта:

1) Измените запрос, чтобы использовать posts_groupby, чтобы возвращать только суммированные столбцы.

2) Переверните все строки в результирующем наборе и суммируйте их по post_status вручную. Используйте массив с ключом состояния и увеличения значения по $order->get_total()

+0

Спасибо другу. Но не могли бы вы написать весь запрос, чтобы я мог это понять. Это также поможет другим людям, которые имеют такую ​​же проблему. – Manik

+0

Привет, пожалуйста, проверьте этот вопрос http://stackoverflow.com/questions/36526268/sql-query-to-download-order-report-in-woocommerce – Manik

2

Я дам решение, основанное на вашем вопросе.

$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>'; 
} 
+0

Работа. Это то же самое, что и мой код. Спасибо. – Manik

+0

этот код плохой ... у вас есть WC_Order в цикле ... вы строите много запросов ... используя WC_Admin_Report, у вас есть только 1 запрос ... – Reigel

+0

, но его код работает хорошо – Manik

Смежные вопросы