Получить заказы на общую сумму покупок за день в Woocommerce - PullRequest
0 голосов
/ 03 июля 2018

Для Woocommerce я написал код ниже, пытаясь получить общую сумму заказов за сегодня:

function order_total_woo_fahad(){

    // Get orders from people named John that were paid in the year 2016.
$orders = wc_get_orders( array(
    'date_paid' => '2018-07-03'
) );
$total_of_all=0;
for($i=0;$orders[i];$i++)
    $total_of_all= $orders[i]->get_total();
    return $total_of_all;
}

Но возвращается ноль.

Что я делаю не так? Как я могу получить заказы на общую сумму покупок за день?

Ответы [ 2 ]

0 голосов
/ 04 июля 2018
<?php
global $wpdb;

$date_from = '2015-11-20';
$date_to = '2015-12-20';
$post_status = implode("','", array('wc-processing', 'wc-completed') );

$result = $wpdb->get_results( "SELECT * FROM $wpdb->posts 
            WHERE post_type = 'shop_order'
            AND post_status IN ('{$post_status}')
            AND post_date BETWEEN '{$date_from}  00:00:00' AND '{$date_to} 23:59:59'
        ");

echo "<pre>";
print_r($result);
?>
0 голосов
/ 04 июля 2018

Лучший и эффективный способ получить это - использовать следующий очень легкий SQL-запрос, который получит сумму всех итогов за последние 24 часа для статусов «обработки» и «выполненных» заказов:

function get_daily_purchases_total(){
    global $wpdb;

    return $wpdb->get_var( "
        SELECT DISTINCT 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 LIKE 'shop_order'
        AND p.post_status IN ('wc-processing','wc-completed')
        AND UNIX_TIMESTAMP(p.post_date) >= (UNIX_TIMESTAMP(NOW()) - (86400))
        AND pm.meta_key LIKE '_order_total'
    " );
}

Код помещается в файл function.php вашей активной дочерней темы (или активной темы). Проверено и работает.


ИСПОЛЬЗОВАНИЕ Пример - Отображение общей суммы ежедневных покупок в формате:

<?php echo '<p>Total purchased of the day: ' . strip_tags( wc_price(get_daily_purchases_total() ) ) . '</p>'; ?>

Если вы хотите вместо этого получить общую сумму на основе даты "сегодня" , вы замените в коде следующую строку:

AND UNIX_TIMESTAMP(p.post_date) >= (UNIX_TIMESTAMP(NOW()) - (86400))

по этой строке:

AND DATE(p.post_date) >= CURDATE()
...