Как вывести бесплатную доставку от суммы итога корзины, а не подытога (с учетом скидки)?

Ссылка скопирована
1 ответ

Подскажите, пожалуйста, как заставить woocommerce выводить бесплатную доставку, к примеру, от 1000 руб., когда пользователю дополнительно предоставляется скидка и сумма итога уже становится 900 руб. В стандартных методах доставки можно указать условие с учетом минимальной суммы и купона. Но, скидка считается не купоном и необходимо считать итог корзины, а не подытог. Сторонние плагины также считают по подытогу, то есть позволяют сделать бесплатную доставку человеку, у кого итоговая стоимость корзины не 1000, а 900 рублей (применена скидка 10%).

Дополнительно

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Антон С. Ответ

WooCommerce по умолчанию считает бесплатную доставку от условий shipping method: минимальная сумма, купон и т.п. Если ваша скидка не купон, а кастомная скидка/fee, стандартная логика может смотреть не на тот итог. Нужно фильтровать доступные способы доставки и проверять текущий total после скидок.

Пример идеи:

add_filter('woocommerce_package_rates', function ($rates, $package) {
    $threshold = 1000;
    $total = WC()->cart ? (float) WC()->cart->get_total('edit') : 0;
 
    foreach ($rates as $rate_id => $rate) {
        if ($rate->method_id === 'free_shipping' && $total < $threshold) {
            unset($rates[$rate_id]);
        }
    }
 
    return $rates;
}, 20, 2);

add_filter('woocommerce_package_rates', function ($rates, $package) { $threshold = 1000; $total = WC()->cart ? (float) WC()->cart->get_total('edit') : 0; foreach ($rates as $rate_id => $rate) { if ($rate->method_id === 'free_shipping' && $total < $threshold) { unset($rates[$rate_id]); } } return $rates; }, 20, 2);

Но проверьте, что get_total('edit') в вашей версии WooCommerce возвращает нужную сумму именно после скидок и до/после доставки так, как вам нужно. Иногда лучше считать вручную:

$total = WC()->cart->get_subtotal() - WC()->cart->get_discount_total();

$total = WC()->cart->get_subtotal() - WC()->cart->get_discount_total();

После изменения условий доставки нужно очистить shipping cache/session, иначе WooCommerce может показывать старые rates. Для проверки меняйте товары/количество и обновляйте checkout.

Итог: бесплатную доставку можно скрывать через woocommerce_package_rates, ориентируясь на итог после вашей скидки, а не только на стандартные настройки метода.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно