Задача. Необходимо в форму заказа магазина на Woocommerce вывести дополнительный сбор / добавочную стоимость на упаковку товаров, в зависимости от общей суммы заказа. Например, набрали товаров на сумму 2000 руб — добавляет к заказу — 50 руб на упаковку. Добавили товаров на сумму свыше 3000 руб. — упаковка заказа уже 100 руб. И еще добавилось условие, когда выбран самовывоз, то сбор не добавляется (Решение 3).
Решение 1. Чтобы настроить добавочную стоимость в корзине можно использовать бесплатный плагин WooCommerce Advanced Extra Fees Lite [IDOMIT] (похоже плагин закрыли, но возможно что-то изменится в будущем, поэтому ссылка пока постоит):
- После установки переходим в его настройки или в меню админки слева появится пункт «Advanced Extra Fees».
- Добавить новый Fees «Add new Fees».
- Настраиваем условие (логику): Устанавливаем зависимость по «Subtotal» (Промежуточный итог), устанавливаем условие (больше или равно) и указываем значение при котором будет срабатывать функция.
- Прописываем заголовок «Fees title» — он будет отображать вместе с ценой в форме заказа.
- «Fees cost» — цена которая будет отображаться при условии выполнения заданных параметров.
Далее, чтобы отображалась цена на упаковку заказа при не достижении порога, нужно по аналогии добавить еще один Fees, только уже с условием меньше заданного ранее порога и другой ценой.
Решение 2. Решение с помощью добавления кода в functions.php
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// Дополнительная стоимость за упаковку товара в корзине add_action( 'woocommerce_cart_calculate_fees', 'packaging_add_fee', 25 ); function packaging_add_fee() { $packaging_cost_min = 50; // Цена упаковки до порога $threshold_subtotal = 3000; // Порог при котором буде срабатывать увеличение цены $packaging_cost_max = 100; // Цена упаковки после порога if ( WC()->cart->subtotal >= $threshold_subtotal ) { // Сравниваем промежуточную сумму с нашим порогом WC()->cart->add_fee( 'Упаковка заказа', $packaging_cost_max ); // Добавляем добавочную стоимость 100 } WC()->cart->add_fee( 'Упаковка заказа', $packaging_cost_min ); // Если if не сработал, добавляем добавочную стоимость 50 } |
Решение 3. Можно добавить еще такое условие, чтобы при определенном методе доставки добавочная стоимость не прибавлялась к сумме заказа. Например, чтобы при самовывозе не прибавлялась упаковка. Используем Код №2:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
/* Сбор или добавочная стоимость заказа от общей суммы заказа от метода доставки */ add_action( 'woocommerce_cart_calculate_fees', 'packaging_add_fee', 25 ); function packaging_add_fee() { $chosen_methods = WC()->session->get( 'chosen_shipping_methods' ); // Получаем методы доставки $packaging_cost_min = 50; // Цена упаковки до порога $threshold_subtotal = 3000; // Порог при котором буде срабатывать увеличение цены $packaging_cost_max = 100; // Цена упаковки после порога if ($chosen_methods[0] !== 'local_pickup:7') { // Если метод доставки не с идентификатором 'local_pickup:7' if ( WC()->cart->subtotal >= $threshold_subtotal ) { // Сравниваем промежуточную сумму с нашим порогом WC()->cart->add_fee( 'Упаковка заказа', $packaging_cost_max ); // Добавляем добавочную стоимость 100 } WC()->cart->add_fee( 'Упаковка заказа', $packaging_cost_min ); // Если if не сработал, добавляем добавочную стоимость 50 } } |
'local_pickup:7'
— идентификатор метода доставки, который можно узнать через инспектор кода. Он находится в атрибуте value
тега input
, отвечающего за нужный метод (См. Изображение 3)
Решение 2 сработало отлично. А как исключить добавления цены на определенные категории товаров. Например, на одежду надо сделать допцену, а на продукты — нет. И вы можете поправить сайт (в 2-3 местах стили, кнопку сдвинуть) за допплату?
Здравствуйте! Решение 3 не сработало, можно поконкретнее, не могу додумать как убрать сумму за упаковку при самовывозе. Решение 1 сработало на отлично, огромное спасибо.
Код работает. Вероятно вы не правильно установили идентификатор метода доставки. Смотрите Изображение 3, у всех он разный будет.
Пожалуйста, расскажите подробнее, где конкретно посмотреть идентификатор метода доставки, не могу найти. Заранее спасибо!
Ну вот же в Изображение 3 показано. Открываете страницу оформления заказа. Открываете панель разработчика браузера (F12, или правой кнопкой мыши в контекстном меню «Исследовать элемент») инспектором (Ctrl+Shift+C) выберите элемент input, т.е. кнопку самовывоза. И в HTML смотрите значение value в input (как на скриншоте).