Сортировка купонов в алфавитном порядке в WooCommerce

По некоторым причинам мне нужно применять купоны к заказу в правильной последовательности - алфавитной (A-B-C). Пользователь может добавлять купоны различными способами (B-A-C, C-A-B и т. д. или даже C-A). Поэтому я хотел бы отсортировать добавленные купоны и правильно добавить их в заказ.

Я пытаюсь исправить, но безуспешно:

add_action( 'woocommerce_applied_coupon', 'sort_coupon' );
if (!function_exists('sort_coupon') ) {

    function sort_coupon() {
        global $woocommerce;
        $cart_coupons = WC()->cart->get_applied_coupons();
        sort($cart_coupons);
        WC()->cart->remove_coupons();
        foreach ( $cart_coupons as $code ) {
            WC()->cart->add_discount( $code );
        }
        WC()->cart->calculate_totals();
    }
}

Как я могу заставить его работать?


person Fasolechka    schedule 09.07.2017    source источник


Ответы (1)


Так как хук woocommerce_applied_coupon уже находится в методе WC_Cart add_discount(), вы не можете его использовать, так как он создает своего рода петлю…

Вместо этого вы должны подключить свою функцию в хуке действия woocommerce_cart_coupon следующим образом:

add_action( 'woocommerce_cart_coupon', 'custom_sort_coupons' );
function custom_sort_coupons() {

    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    $applied_coupons = WC()->cart->get_applied_coupons();
    WC()->cart->remove_coupons();

    sort($applied_coupons);

    foreach ( $applied_coupons as $coupon_code ) {
        WC()->cart->add_discount( $coupon_code );
        wc_clear_notices(); // Avoid repetitive notices
    }
    WC()->cart->calculate_totals();
}

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

Теперь это работает. Я добавил wc_clear_notices() в последний цикл, чтобы избежать повторяющихся уведомлений.

person LoicTheAztec    schedule 09.07.2017
comment
Спасибо за ваш ответ. Вы правы - я уже повесил свой сервер. Использование woocommerce_cart_coupon instead woocommerce_applied_coupon работает нормально, но только если я нажимаю кнопку «Обновить корзину». Если пользователь нажимает Checkout, мы переходим к оформлению заказа без сортировки. - person Fasolechka; 09.07.2017
comment
@Fasolechka Поскольку ajax включен на моем тестовом сервере на страницах корзины и оформления заказа, у меня нет этой проблемы ... Я использую для тестирования классическую тему WooCommerce Storefront ... На моем все обновляется без обновления. - person LoicTheAztec; 09.07.2017