Как получить список заказов WooCommerce, в которых используется определенный купон?

Я пытаюсь написать функцию, которая извлекает список заказов WooCommerce, которые используют указанный код купона и находятся в указанном диапазоне дат, а затем суммируют общие скидки, примененные к этим заказам.

После небольшого поиска в Google я чувствую, что должен использовать что-то вроде

$customer_orders = get_posts( array(
    'numberposts' => -1,
    'meta_key'    => ???,
    'meta_value'  => $CouponToSearchFor,
    'post_type'   => wc_get_order_types(),
    'post_status' => array_keys( wc_get_order_statuses() ),
) ); 

Я пробовал:

'meta_key' => 'coupon'
'meta_key' => 'shop_coupon'
'meta_key' => '_coupon'

Но ничего из этого не работает. Как я могу узнать, какие _3 _ / _ 4_ условия дадут мне то, что мне нужно?

Кроме того, я думаю, что meta_query можно использовать для выполнения фильтрации по дате как части этого get_posts() запроса, это правильно?


person capsid    schedule 13.03.2017    source источник


Ответы (1)


Ваш код не работает, потому что по умолчанию WooCommerce не хранит использованный код купона в wp_postmeta таблице. Он хранится в wp_woocommerce_order_items таблице под order_item_type => coupon и order_item_name => YOUR_CODE.

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

Вот код:

function wh_getOrderbyCouponCode($coupon_code, $start_date, $end_date) {
    global $wpdb;
    $return_array = [];
    $total_discount = 0;

    $query = "SELECT
        p.ID AS order_id
        FROM
        {$wpdb->prefix}posts AS p
        INNER JOIN {$wpdb->prefix}woocommerce_order_items AS woi ON p.ID = woi.order_id
        WHERE
        p.post_type = 'shop_order' AND
        p.post_status IN ('" . implode("','", array_keys(wc_get_order_statuses())) . "') AND
        woi.order_item_type = 'coupon' AND
        woi.order_item_name = '" . $coupon_code . "' AND
        DATE(p.post_date) BETWEEN '" . $start_date . "' AND '" . $end_date . "';";

    $orders = $wpdb->get_results($query);

    if (!empty($orders)) {
        $dp = ( isset($filter['dp']) ? intval($filter['dp']) : 2 );
        //looping throught all the order_id
        foreach ($orders as $key => $order) {
            $order_id = $order->order_id;
            //getting order object
            $objOrder = wc_get_order($order_id);

            $return_array[$key]['order_id'] = $order_id;
            $return_array[$key]['total'] = wc_format_decimal($objOrder->get_total(), $dp);
            $return_array[$key]['total_discount'] = wc_format_decimal($objOrder->get_total_discount(), $dp);
            $total_discount += $return_array[$key]['total_discount'];
        }
//        echo '<pre>';
//        print_r($return_array);
    }
    $return_array['full_discount'] = $total_discount;
    return $return_array;
}

Код находится в файле function.php вашей активной дочерней темы (или темы). Или также в любых php-файлах плагинов.

ИСПОЛЬЗОВАНИЕ

$orders = wh_getOrderbyCouponCode('my_code', '2016-09-17', '2016-10-07');
echo 'Total Discount : ' . $orders['full_discount'];
//print_r($orders);

Пожалуйста, обрати внимание:

Все даты указаны в формате YYYY-MM-DD.
print_r(array_keys(wc_get_order_statuses())); выведет что-то вроде этого:

Array
(
    [0] => wc-pending
    [1] => wc-processing
    [4] => wc-on-hold
    [5] => wc-completed
    [6] => wc-cancelled
    [7] => wc-refunded
    [8] => wc-failed
)

Код протестирован и работает.

Надеюсь это поможет!

person Raunak Gupta    schedule 13.03.2017
comment
Большое спасибо за объяснение. Это очень тщательно. Я подключил эту функцию внутри своего служебного плагина, но когда я печатаю $ orders после запроса, это пустой массив (). Я дважды проверил код купона и диапазон дат, чтобы убедиться, что для этого ввода существует заказ. И я напечатал $ query, и там все выглядело правильно. Я новичок в разработке PHP и Wordpress, но ваш код имеет смысл, поэтому мне интересно, что я делаю не так? - person capsid; 13.03.2017
comment
Я могу выбрать купоны, используя части вашего запроса внутри phpMyAdmin, чтобы знать, что они там есть. Я также дважды проверил, правильно ли указан префикс. Когда я запускаю весь печатный запрос внутри phpMyAdmin, я получаю тот же пустой набор. Спасибо за твои мысли. - person capsid; 13.03.2017
comment
Я могу правильно выбирать заказы в phpMyAdmin вплоть до части AND DATE(p.post_date) BETWEEN '11/01/2016' AND '12/31/2016'. Когда я добавляю этот бит в заказы, больше не выбирается правильно, даже если я вручную проверил даты применимых заказов. - person capsid; 13.03.2017
comment
Хорошо, я думаю, что я не предоставляю даты функции в правильном формате ГГГГ-ММ-ДД. Я исправлю это, а затем вернусь. Спасибо! - person capsid; 13.03.2017
comment
Вот и все! Все, что мне нужно было сделать с моими датами, прежде чем передать их вашей функции, было: $d1 = date('Y-m-d', strtotime($start_date)); Еще раз спасибо :) - person capsid; 13.03.2017
comment
Я не был в сети в то время, поэтому не мог ответить на ваш комментарий, но да, я знаю, что статус и дата заказа могут вызвать какие-либо проблемы, поэтому я указал на это в моем Примечании. В любом случае, я рад, что это помогло вам, более того, этот вопрос также поможет сообществу. - person Raunak Gupta; 14.03.2017