@alexiusgrey

Как сделать бесплатную доставку для всех товаров в корзине, если она будет хотя бы у одного из товаров?

Клиент хочет, чтобы если в корзине есть товар, у которого бесплатная доставка, то для всех товаров, которые в этом заказе, чтобы тоже применялась бесплатная доставка, а если товара с бесплатной доставкой в данном заказе нет - то чтобы стоимость доставки каждого товара не менялась.

По-любому условие должно быть через мета-поле. Как лучше сделать - задать класс доставки? Это же тоже мета-поле.
Поискал емного информацию на стаке, должно быть что-то вроде такого хука?
add_filter('woocommerce_package_rates', 'conditional_shipping_class_cost', 15, 2);
function conditional_shipping_class_cost( $rates, $package ){
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return $rates;

    // HERE define the targeted shipping method
    $shipping_class = 'Extra';

    // Initializing variables
    $found = $others = false;

    // Loop through cart items and checking for the specific product
    foreach( $package['contents'] as $item ) {
        if( $item['data']->get_shipping_class() == sanitize_title($shipping_class) ){
            $found = true; // Has the shipping class
        } else {
            $others = true; // NOT the shipping class
        }
    }

    // When items with the defined shipping are not alone in cart
    if( $found && $others ){
        // Loop through shipping rates
        foreach ( $rates as $rate_key => $rate ){
            // For Flat rate and Local pickup shipping methods
            if( $rate->method_id == 'flat_rate' ) {
                // Set the cost to zero
                $rates[$rate_key]->cost = 0;

                $rates[$rate_key]->label = 'f: '.$found.' | o: '.$others.' ';

                // Initializing variables
                $has_taxes = false;
                $taxes = [];

                // Loop through the shipping taxes array (as they can be many)
                foreach ($rates[$rate_key]->taxes as $key => $tax){
                    if( $rates[$rate_key]->taxes[$key] > 0 ){
                        // Set the tax cost to zero
                        $taxes[$key] = 0;
                        $has_taxes   = true;
                    }
                }
                // Set new taxes cost array
                if( $has_taxes )
                    $rates[$rate_key]->taxes = $taxes;
            }
        }
    }

    return $rates;
}

Как вообще лучше подойти к такому вопросу? С классами доставки или через что лучше такое настроить?
  • Вопрос задан
  • 37 просмотров
Пригласить эксперта
Ответы на вопрос 1
NikMaster777
@NikMaster777
Вот что говорит ИИ на этот счёт:

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

1. В административной панели WooCommerce перейдите в раздел "Настройки" и выберите вкладку "Доставка".

2. Создайте новый метод доставки, который будет представлять бесплатную доставку. Для этого нажмите на кнопку "Добавить способ доставки".

3. В разделе "Настройки способа доставки" выберите "Бесплатная доставка" из выпадающего списка.

4. Перейдите во вкладку "Условия" и настройте правила для применения бесплатной доставки. Для этого выберите "Добавить условие" и установите следующие параметры:

Поле: "Общая стоимость товаров"
Оператор: "Больше или равно"
Значение: "0" (или любую другую сумму, если вы хотите установить минимальную стоимость для бесплатной доставки)
Сохраните изменения.

Теперь, когда в корзине присутствует хотя бы один товар с бесплатной доставкой, все остальные товары в этом заказе также будут иметь бесплатную доставку. Если же товара с бесплатной доставкой в заказе нет, стоимость доставки каждого товара останется без изменений.

Обратите внимание, что реализация бесплатной доставки может варьироваться в зависимости от выбранной вами темы или установленных плагинов. Предоставленные инструкции основаны на стандартных функциях WooCommerce.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы