Эта задачка недавно прилетела к моему другу.
Как уже вы поняли из заголовка, нужно было сделать так, чтобы невозможно было оплатить заказ, если он на недостаточную сумму. И вот что мы сделаем:
Код из этого урока мы вставляем в functions.php
текущей или дочерней темы.
add_action( 'woocommerce_before_cart', 'truemisha_minimum_order_amount' ); function truemisha_minimum_order_amount(){ $minimum_amount = 1000; if ( WC()->cart->subtotal < $minimum_amount ) { wc_print_notice( sprintf( 'Минимальная сумма заказа %s, а у вы хотите заказать всего лишь на %s.' , wc_price( $minimum_amount ), wc_price( WC()->cart->subtotal ) ), 'notice' ); } }
WC()->cart->subtotal
, как вы догадались, возвращает общую сумму товаров в корзине без учёта стоимости доставки. sprintf()
, привыкайте к этому. Для того, чтобы вывести точно то же самое на странице оформления заказа, мы можем законнектить нашу функцию к хуку woocommerce_before_checkout_form
вот так:
add_action( 'woocommerce_before_checkout_form', 'truemisha_minimum_order_amount' );
Но я бы наверное не стал это туда добавлять, потому что во втором шаге мы и так настроим отображение сообщения об ошибке там, когда люди будут оформлять заказ, а нам не надо, чтобы отображалось сразу два сообщения, верно же?
Тут нам поможет другой хук WooCommerce – woocommerce_checkout_process
.
add_action( 'woocommerce_checkout_process', 'truemisha_no_checkout_min_order_amount' ); function truemisha_no_checkout_min_order_amount() { $minimum_amount = 1000; if ( WC()->cart->subtotal < $minimum_amount ) { wc_add_notice( sprintf( 'Минимальная сумма заказа %s, а у вы хотите заказать всего лишь на %s.', wc_price( $minimum_amount ), wc_price( WC()->cart->subtotal ) ), 'error' ); } }
В итоге при нажатии на кнопку «Подтвердить заказ» у нас будет вылетать такое сообщение:
Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.
Круто! А есть ли открытые решения с изменением цены ТОВАРА в зависимости от количества его в корзине?
В среду попробую опубликовать об этом урок, но ничего не обещаю
Будет очень здорово! Спасибо!
Готово, вот опубликовал, пожалуйста!
На основании ваших уроков (и немного своих наблюдений), собрал код минимального КОЛИЧЕСТВА определенного товара в корзине. Конечно, данный код можно поместить в функцию, указать параметры, если не хотите дублировать код и у вас много товаров, под который вы хотите применять решение, но мне необходимо было это сделать для одного товара. Вообще, если бы не wc_print_notice и wc_add_notice, можно было бы использовать лишь одну функцию под все action. Миша, нужен совет. Реально ли передать параметры в функцию хука? В зависимости от переданного параметра вызывать wc_add_notice или wc_print_notice.
Кайф! Вы молодец.
Параметры в функции хука уже предопределены, поэтому что-то новое мы туда не передадим, однако мы всегда можем сделать условие на основе глобальных переменных и функций, их использующих.
Я наверное чуть позже немного подредактирую ваш код и оформлю его в качестве отдельного поста.
Было бы здорово!
Готово!
Когда то давно встречал на просторах плагин который показывает в магазине и в корзине сумму не достающюю до минимального заказа. Типа: Вам осталось на 152 до минимального..... не подскажите может кто вспомнит как сие чудо называется? или ручками как реализовать?
Подождите, а в уроке разве не об этом говорится? :)
Здравствуйте! Можете подсказать как реализовать такую задачу: Метод доставки показывается только тогда , если в корзине есть определенная сумма?
Здравствуйте!
Пока что не могу скинуть вам готовый код, т к у меня его нет, но надеюсь опубликую об этом пост на неделе.
Михаил, а как сделать минимальный заказ только на определенный товар? то есть у меня минимальный заказ только по нескольким товарам.
Тут вам нужно использовать метод
WC()->cart->get_cart()
, я думаю, пример есть тут.Здравствуйте, Михаил. Подскажите, пожалуйста, как сделать чтобы заданная минимальная сумма заказа применялась только к простым товарам, а товары виртуальные/скачиваемые оплачивались от любой суммы?
Здравствуйте, тут нужно вероятнтно спользовать цикл через все товары корзины
foreach ( WC()->cart->get_cart() as $cart_item ) {
, получать объект товара при помощиwc_get_product()
и делать проверкуif( $product->is_virtual() || $product->is_downloadable() )
.Михаил, добрый день.
Пытаюсь настроить, чтобы минимальная сумма выходила только на определенные зоны доставки. В калькуляционной корзине данный код срабатывает, но при оформлении заказа не работает. Если подскажите, что не так, буду вам очень благодарин
Добрый день, это потому что
woocommerce_checkout_process
есть только в корзине, попробуйте ещё и на напримерwoocommerce_before_checkout_form
повесить.