Стоимость доставки скидка на основе классов доставки в Woocommerce - PullRequest
0 голосов
/ 20 октября 2018

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

В бэкэнде Woocommerce установлена ​​опция оплаты каждого класса доставки отдельно.Кроме того, я использую только один метод доставки, который называется «фиксированная ставка».

На основе Переопределить все расходы по доставке для определенного класса доставки в Woocommerce , следующий код, который должен применять скидку:

add_filter('woocommerce_package_rates', 'shipping_class_null_shipping_costs', 10, 2);
function shipping_class_null_shipping_costs( $rates, $package ){

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

    $shipping_class_slug = 'large'; // Your shipping class slug
    $found = false;

    // Loop through cart items and checking for the specific defined shipping class
    foreach( $package['contents'] as $cart_item ) {
        if( $cart_item['data']->get_shipping_class() == $shipping_class_slug )
            $found = true;
    }
    $percentage = 50; // 50%
    $subtotal = WC()->cart->get_cart_shipping_total();

    // Set shipping costs to 50% discount if shipping class is found
    if( $found ){
        foreach ( $rates as $rate_key => $rate ){
            $has_taxes = false;

            // Targetting "flat rate"
            if( 'flat_rate' === $rate->method_id ){
                $rates[$rate_key]->cost = $subtotal;
            }
        }       
    }
    return $rates;
}

Но что бы я ни пытался,Расчетный результат доставки составляет $ 0.

Что я здесь не так делаю и как правильно применить скидку к классу доставки?

Спасибо.

1 Ответ

0 голосов
/ 20 октября 2018

Обновление (только настройки)

Чтобы добавить скидку только для "большого" класса доставки по методу "Единый тариф", вам потребуется:

  • Установите цену со скидкой непосредственно на стоимость способа доставки.
  • Возможность расчета "Для класса: платная доставка для каждого класса доставки отдельно"

Как:

enter image description here


Оригинальный ответ:

Следующий кодустановит стоимость доставки в размере 50% для метода доставки с фиксированной ставкой, если в корзине найден определенный определенный способ доставки.

Тестирование: Временное "Включите режим отладки"в настройках доставки в разделе" Параметры доставки "* вкладка 1036 * ...

Настройки доставки" Единый тариф ": Стоимость классов доставки должнабыть определенным.

В приведенном ниже коде определите в каждой функции свой слаг класса доставки и свое специальное уведомление:

add_filter('woocommerce_package_rates', 'shipping_costs_discounted_based_on_shipping_class', 10, 2);
function shipping_costs_discounted_based_on_shipping_class( $rates, $package ){
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return $rates;

    // Your settings bellow
    $shipping_class = 'large'; // <=== Shipping class slug
    $percentage     = 50; //      <=== Discount percentage

    $discount_rate  = $percentage / 100;
    $is_found       = false;

    // Loop through cart items and checking for the specific defined shipping class
    foreach( $package['contents'] as $cart_item ) {
        if( $cart_item['data']->get_shipping_class() == $shipping_class )
            $is_found = true;
    }

    // Set shipping costs to 50% if shipping class is found
    if( $is_found ){
        foreach ( $rates as $rate_key => $rate ){
            $has_taxes = false;
            // Targeting "flat rate"
            if( 'flat_rate' === $rate->method_id  ){
                $rates[$rate_key]->cost = $rate->cost * $discount_rate;

                // Taxes rate cost (if enabled)
                foreach ($rates[$rate_key]->taxes as $key => $tax){
                    if( $tax > 0 ){
                        $has_taxes = true;
                        $taxes[$key] = $tax * $discount_rate;
                    }
                }
                if( $has_taxes )
                    $rates[$rate_key]->taxes = $taxes;
            }
        }
    }
    return $rates;
}

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

Не забудьте отключить «режим отладки» в настройках доставки после того, как это было проверено один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...