Устанавливаем минимальное количество товара для заказа

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

Все сниппеты кода можете вставлять в functions.php текущей или дочерней темы.

Хотите изучить WooCommerce на значительно более крутом уровне, чем на уровне вставки готовых сниппетов в functions.php? Тогда рекомендую вам мой видеокурс 🚀

1. Счётчики количества товара

Для того, чтобы заформить какое-то определённое минимальное значение для счётчиков товара мы можем использовать фильтр-хук woocommerce_quantity_input_min (ну и логично предположить что woocommerce_quantity_input_max – для максимального значения).

Устанавливаем минимальное количество товара в счётчиках товара
То есть, когда я пытаюсь уменьшить количество товара меньше 2 в этом поле – ничего не происходит.

1.1 По количеству единиц товара

/**
 * Для страницы товара
 */
add_filter( 'woocommerce_quantity_input_min', 'truemisha_min_kolvo', 20, 2 );
 
function truemisha_min_kolvo( $min, $product ){
 
	if ( 500 == $product->get_id() ) { // только для товара с ID 500
		$min = 2; // должно быть хотя бы 2 единицы товара в корзине
	}
	return $min;
}
 
/**
 * Для корзины
 */
add_filter( 'woocommerce_cart_item_quantity', 'truemisha_min_kolvo_cart', 20, 3 );
 
function truemisha_min_kolvo_cart( $product_quantity, $cart_item_key, $cart_item ) {
 
	$product = $cart_item['data'];
	$min = 0;
 
	if ( 500 === $product->get_id() ) { // товар с ID 500
		$min = 2;
	}
 
	return woocommerce_quantity_input(
		array(
			'input_name'   => "cart[{$cart_item_key}][qty]",
			'input_value'  => $cart_item['quantity'],
			'max_value'    => $product->get_max_purchase_quantity(),
			'min_value'    => $min,
			'product_name' => $product->get_name(),
		),
		$product,
		false
	);
 
 
}
  • Благодаря тому, что внутри функции хука мы получаем объект товара $product, то мы можем делать много всего, например проверять, что товар в определённой категории, проверять какие-то мета-поля товара и т.д.
  • Также если сразу после вставки кода, в корзине не заработало, то напоминаю вам про кэш AJAX фрагментов в WooCommerce.

1.2 По сумме

И небольшой бонус для вас – иногда нужно привязаться не к количеству единиц товара, а к сумме, то есть например, если вы добавили 2 единицы товара в корзину, но для того, чтобы по сумме получилось 1000 или больше, нужно добавить 3 единицы. Условие можно законнектить на этом.

Замените соответствующие строчки в коде выше.

if ( 500 == $product->get_id() )
	$min = ceil( 1000 / $product->get_price() ); // минимум на 1000 по сумме
}

и

if ( 500 === $product->get_id() ) {
	$min = ceil( 50 / $product->get_price() );
}

Ого, обе замены кода абсолютно одинаковы, нужно только сделать их на разных строчках! 😁

2. Не даём совершить заказ, если количество определённого товара меньше, чем нужно

Если вы не случайно тут оказались, а читаете мой блог, то вы однозначно уже знакомы с woocommerce_checkout_process, с которым мы поработали в одном из предыдущих уроков.

Даже несмотря на то, что мы уже запретили добавлять в корзину либо изменять количество на меньшее значение, чем допустимое у товара, нам всё равно лучше подстраховаться и добавить ещё одну проверку на шаге оформления заказа.

add_action( 'woocommerce_checkout_process', 'truemisha_min_tovar_qty' );
 
function truemisha_min_tovar_qty(){
 
	$qty = 0; // обязательно сначала ставим 0
 
	foreach ( WC()->cart->get_cart() as $cart_item ) { 
		if( 500 == $cart_item[ 'product_id' ] ){
			$qty = $cart_item[ 'quantity' ];
			break;
		}
	}
 
	if( $qty && $qty < 2 ) {
		wc_add_notice( 'Недостаточно товара для заказа!', 'error' );
	}
 
}

Если же нам нужно проверить именно по цене, то нужно лишь изменить пару строк!

$qty = $cart_item[ 'quantity' ];
$price = $cart_item['data']->get_price();

и

if( $qty && $qty < ceil( 1000 / $price ) ) {

Кстати говоря, условие if( $qty ) позволяет проверить, что товар вообще в корзине.

Сообщение о недостаточном количестве товара для заказа на странице оформления заказа
В итоге при нажатии на кнопку «Оформить заказ», у вас будет появляться такое сообщение, в случае, если целевого товара в корзине меньше чем нужно.

Миша

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

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

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

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

Комментирование этого поста более не доступно.
  • Михаил 1 июля 2020 #

    Здравствуйте, Михаил.

    Спасибо за столь полезную информацию, все толково как всегда. А можно сделать ограничение по количеству для вариативных товаров? Переписал для максимального количества (только убрал ID товара), все работает, но стоит выбрать какую-то вариацию, и ограничение уже не действует. Или придется перечислять все ID товаров?

    • Миша 1 июля 2020 #

      Добрый день!

      Спасибо!

      По вариативным пока что не могу вам подсказать

      • Николай 7 августа 2020 #

        Тоже хотелось бы, чтобы работало с вариациями: по размерам, весу и так далее 🙂

    • Миша 8 августа 2020 #

      Уговорили, вот JS код для вариаций для страницы товара, возможно не идеален:

      jQuery( function( $ ) {
      	$('.single_variation_wrap').on( 'show_variation', function( event, variation ) {
       
      		if( variation && variation.variation_id == 109 ) { // ID вариации
      			$( '.qty' ).attr( 'min', 2 ); // 2 – минимальное количество
      			$( '.qty' ).val( 2 ); // 2 – минимальное количество
      		}
       
      	});
      });
  • Николай 2 июля 2020 #

    Здравствуйте! А возможно ли усложнить и сделать так, чтобы действовало правило по кол-ву и по стоимости. То есть есть минимальное кол-во для заказа 10 ед. одного вида товара, который лежит в корзине перед оформлением. Минимальная стоимость заказа при этом допустим 1,000$. Получается, что несмотря на то, что покупатель выбрал 10 ед. товара в корзину, но общая сумма меньше чем 1,000$, его заказ не должен быть оформлен. То есть ему придется или увеличивать кол-во ед. уже выбранного товара до 1,000$ или же добавлять другие виды товаров с минимальным кол-вом в 10 ед. до получения нужного порога. И наоборот. Если выбрано товара на общую стоимость в 1,500$, но кол-во одного вида товара составляет всего 3 ед., то также не представляется возможным оформить заказ пока покупатель не увеличит кол-во по каждому типу товара до мин. 10 ед.

    • Миша 2 июля 2020 #

      Добрый день, Николай,

      Попробуйте скомбинировать с этим гайдом.

  • Виталий 7 июля 2020 #

    Здравствуйте ! Возможно ли сделать именно правило для корзины 8,16,24 товара не больше не меньше ??? (либо 8 товаров, или 16 или 24)
    Спасибо

    • Миша 7 июля 2020 #

      Добрый вечер,

      Ну что-то вроде этого, я так понимаю:

      if( $qty !== 8 && $qty !== 16 && $qty !== 24 ) {

      Не больше и не меньше!

  • Алекс 6 августа 2020 #

    Добрый день! Какие еще могут быть варианты почему не работает? Может из-за выбора размеров? Заметил что при обновлении страницы товара на долю секунды отображается «2» и потом возвращается «1». 🙁

    • Миша 6 августа 2020 #

      Добрый день!

      Да, вероятно из-за размеров 🙂 Когда при загрузке страницы товара происходит смена вариации на js, тогда и сбрасывается количество товара.