Как установить минимальную сумму для заказа?

Эта задачка недавно прилетела к моему другу.

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

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

Шаг 1. Добавляем уведомления на страницу Корзины и Оформления заказа

Уведомление о минимальной сумме заказа в корзине WooCommerce

Код из этого урока мы вставляем в 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'
		);
	}
 
}
  • На строке 5 мы вручную устанавливаем минимальную сумму для заказа, хотя правильнее было бы поместить её где-нибудь в настройках и вытаскивать функцией get_option().
  • WC()->cart->subtotal, как вы догадались, возвращает общую сумму товаров в корзине без учёта стоимости доставки.
  • wc_print_notice() – это удобная функция для вывода уведомлений в WooCommerce.
  • wc_price() позволяет отформатировать числовое значение цены – добавить знак валюты, разделитель целых и дробных частей, и т.д.
  • В ядре WooCommerce вообще очень часто используется функция sprintf(), привыкайте к этому.

Для того, чтобы вывести точно то же самое на странице оформления заказа, мы можем законнектить нашу функцию к хуку woocommerce_before_checkout_form вот так:

add_action( 'woocommerce_before_checkout_form', 'truemisha_minimum_order_amount' );

Но я бы наверное не стал это туда добавлять, потому что во втором шаге мы и так настроим отображение сообщения об ошибке там, когда люди будут оформлять заказ, а нам не надо, чтобы отображалось сразу два сообщения, верно же?

Шаг 2. Блокируем возможность оформления заказа с маленькой суммой

Тут нам поможет другой хук 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'
		);
 
	}
 
}

В итоге при нажатии на кнопку «Подтвердить заказ» у нас будет вылетать такое сообщение:

Ошибка о минимальной сумме заказа во время оформления заказа WooCommerce

Миша

В последние годы я долго не знал, что мне делать с сайтом misha.blog, ведь он практически не приносит никакого профита, но недавно я осознал, что моя миссия – способствовать распространению WordPress. Ведь WordPress – это лучший движок для разработки сайтов – как для тех, кто готов использовать заложенную структуру этой CMS, так и для тех, кто предпочитает headless решения.

Сам же я впервые познакомился с WordPress в 2009 году. Организатор WordCamp. Преподаватель в школах Epic Skills и LoftSchool.

Если вам нужна помощь с вашим сайтом или может даже разработка с нуля на WordPress / WooCommerce — пишите. Я и моя команда сделаем вам всё на лучшем уровне.

Комментарии — 12

Комментирование этого поста более не доступно.
  • Владислав 20 апреля 2020 #

    Круто! А есть ли открытые решения с изменением цены ТОВАРА в зависимости от количества его в корзине?

    • Миша 20 апреля 2020 #

      В среду попробую опубликовать об этом урок, но ничего не обещаю

      • Владислав 21 апреля 2020 #

        Будет очень здорово! Спасибо!

      • Миша 22 апреля 2020 #

        Готово, вот опубликовал, пожалуйста!

  • Владислав 2 мая 2020 #

    На основании ваших уроков (и немного своих наблюдений), собрал код минимального КОЛИЧЕСТВА определенного товара в корзине. Конечно, данный код можно поместить в функцию, указать параметры, если не хотите дублировать код и у вас много товаров, под который вы хотите применять решение, но мне необходимо было это сделать для одного товара. Вообще, если бы не wc_print_notice и wc_add_notice, можно было бы использовать лишь одну функцию под все action. Миша, нужен совет. Реально ли передать параметры в функцию хука? В зависимости от переданного параметра вызывать wc_add_notice или wc_print_notice.

    add_filter( 'woocommerce_quantity_input_min', 'filter_function_name_7954', 10, 2 ); //устанавливаем минимальное количество товара для заказа
    function filter_function_name_7954( $empty, $product ){
    if ($product->get_id() == 323) {
      $empty = 100;
    }
    	return $empty;
    }
     
     
    add_action( 'woocommerce_checkout_process', 'truemisha_checkout_minimum_order_amount' );
    add_action( 'woocommerce_before_checkout_form', 'truemisha_minimum_order_amount' );
    add_action( 'woocommerce_before_cart', 'truemisha_minimum_order_amount' );
     
    function truemisha_minimum_order_amount(){
    $cart_object = WC()->cart;
    $product_id = 323;
    $my_product = $cart_object->generate_cart_id( $product_id );
    $my_order = $cart_object->find_product_in_cart( $my_product );
    $quantity = 0;
    $quantity_minimum = 100;
      if( $my_order ) {
        $cart_item = $cart_object->cart_contents[$my_order];
        $quantity = $cart_item['quantity'];
        if ($quantity < $quantity_minimum) {
          wc_print_notice(
            sprintf(
              'Минимальная партия для заказа: %s шт.' ,
             $quantity_minimum
            ),
            'notice'
          );
        }
      }
    }
     
    function truemisha_checkout_minimum_order_amount(){
    $cart_object = WC()->cart;
    $product_id = 323;
    $my_product = $cart_object->generate_cart_id( $product_id );
    $my_order = $cart_object->find_product_in_cart( $my_product );
    $quantity = 0;
    $quantity_minimum = 100;
      if( $my_order ) {
        $cart_item = $cart_object->cart_contents[$my_order];
        $quantity = $cart_item['quantity'];
        if ($quantity < $quantity_minimum) {
          wc_add_notice(
            sprintf(
              'Минимальная партия для заказа: %s шт.' ,
             $quantity_minimum
            ),
            'error'
          );
        }
      }
    }
    • Миша 2 мая 2020 #

      Кайф! Вы молодец.

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

      Я наверное чуть позже немного подредактирую ваш код и оформлю его в качестве отдельного поста.

      • Владислав 2 мая 2020 #

        Было бы здорово!

      • Миша 8 мая 2020 #

        Готово!

  • Антон 7 мая 2020 #

    Когда то давно встречал на просторах плагин который показывает в магазине и в корзине сумму не достающюю до минимального заказа. Типа: Вам осталось на 152 до минимального..... не подскажите может кто вспомнит как сие чудо называется? или ручками как реализовать?

    • Миша 7 мая 2020 #

      Подождите, а в уроке разве не об этом говорится? 🙂

  • Кирилл 19 июня 2020 #

    Здравствуйте! Можете подсказать как реализовать такую задачу: Метод доставки показывается только тогда , если в корзине есть определенная сумма?

    • Миша 21 июня 2020 #

      Здравствуйте!

      Пока что не могу скинуть вам готовый код, т к у меня его нет, но надеюсь опубликую об этом пост на неделе.