Получение самого высокого класса доставки и скидка других классов в WooCommerce - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь добавить скидку 50% на все классы доставки в корзине, кроме самого высокого класса доставки.

Если у меня в корзине 3 товара, каждый со своим классом доставки, например, P1 = 150 долларов США;P2 = $ 200;P3 = $ 300.Ожидаемая сумма стоимости доставки будет: (P1 / 50%) + (P2 / 50%) + P3 (самая дорогая) = 475

Продукты с ID1, ID2, ID3 не должны сбрасываться со счетов, даже если их доставкакласс дешевле, чем другие в корзине.Доставка для этих продуктов всегда должна быть полностью заряжена.

Сначала я попытался добавить скидку к отдельному классу доставки с помощью слаг-класса класса доставки, мой вопрос можно найти здесь [вопрос]: Скидка на стоимость доставки на основе классов доставки в Woocommerce

Но я не знаю, как получить самый высокий (самый дорогой) класс доставки в корзине и сделать скидку на все другие классы доставки на 50%, потому что каждый раз может быть другой класс доставки (с разным слагом)) в корзине, которая является самой дорогой.

Я изучал документацию по API WooCommerce, найденную здесь https://docs.woocommerce.com/wc-apidocs/class-WC_Shipping_Method.html, но я не могу сказать, какой метод будет полезен в моем случае.

Это очень похожий запрос на этот неотвеченный вопрос Woocommerce доставка - скидка на несколько товаров с разными ценами для класса

Есть ли способ, чтобы сделать скидку на все цены класса доставки в корзинекроме самого дорогого?

1 Ответ

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

Это, вероятно, не лучший способ сделать это, но он работает.Поскольку я не мог получить стоимость класса доставки более умным способом, я использовал поле описания класса доставки в качестве значения.Поэтому, если стоимость для класса «средний» равна 80, мое описание также равно 80.

Предполагая, что вы используете только один метод доставки «фиксированная ставка», этот код работает.

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;
    $shipping           = new \WC_Shipping();
    $shipping_classes   = $shipping->get_shipping_classes();
    $all_shipping_costs = array();

    foreach( $package['contents'] as $cart_item ) {
        foreach($shipping_classes as $shipping_class) {
            if( $cart_item['data']->get_shipping_class() == $shipping_class->slug )
            array_push($all_shipping_costs, $shipping_class->description);
        }
    }
    $max_value=max($all_shipping_costs);
    $new_rate=$max_value + (array_sum($all_shipping_costs)-$max_value)*0.50;
    foreach ( $rates as $rate_key => $rate ){
            if( 'flat_rate' === $rate->method_id  ){
            $rates[$rate_key]->cost = $new_rate;
            }
        }

    return $rates;

}

Еще раз, это рабочее решение, но не лучшее.

ПРИМЕЧАНИЕ. Поля описания класса доставки в серверной части должны иметь точно такое же значение, что и поле стоимости доставки!

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