Этот урок в какой-то степени похож на мой урок про минимальную сумму заказа. Ну в отличие от него, тут мы не только заблокируем возможность оформления заказа в случае, если в корзине есть целевой товар и его количество в ней недостаточно, но мы также при помощи хука установим минимальное значение товара в счётчике количества товара, который у нас присутствует не только в корзине, но и иногда на странице товара.
Все сниппеты кода можете вставлять в functions.php
текущей или дочерней темы.
Хотите изучить WooCommerce на значительно более крутом уровне, чем на уровне вставки готовых сниппетов в functions.php
? Тогда рекомендую вам мой видеокурс 🚀
Для того, чтобы заформить какое-то определённое минимальное значение для счётчиков товара мы можем использовать фильтр-хук woocommerce_quantity_input_min
(ну и логично предположить что woocommerce_quantity_input_max
– для максимального значения).
/** * Для страницы товара */ 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
, то мы можем делать много всего, например проверять, что товар в определённой категории, проверять какие-то мета-поля товара и т.д.И небольшой бонус для вас – иногда нужно привязаться не к количеству единиц товара, а к сумме, то есть например, если вы добавили 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() ); }
Ого, обе замены кода абсолютно одинаковы, нужно только сделать их на разных строчках! 😁
Если вы не случайно тут оказались, а читаете мой блог, то вы однозначно уже знакомы с 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 )
позволяет проверить, что товар вообще в корзине.
Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.
Здравствуйте, Михаил.
Спасибо за столь полезную информацию, все толково как всегда. А можно сделать ограничение по количеству для вариативных товаров? Переписал для максимального количества (только убрал ID товара), все работает, но стоит выбрать какую-то вариацию, и ограничение уже не действует. Или придется перечислять все ID товаров?
Добрый день!
Спасибо!
По вариативным пока что не могу вам подсказать
Тоже хотелось бы, чтобы работало с вариациями: по размерам, весу и так далее :)
Уговорили, вот JS код для вариаций для страницы товара, возможно не идеален:
Здравствуйте! А возможно ли усложнить и сделать так, чтобы действовало правило по кол-ву и по стоимости. То есть есть минимальное кол-во для заказа 10 ед. одного вида товара, который лежит в корзине перед оформлением. Минимальная стоимость заказа при этом допустим 1,000$. Получается, что несмотря на то, что покупатель выбрал 10 ед. товара в корзину, но общая сумма меньше чем 1,000$, его заказ не должен быть оформлен. То есть ему придется или увеличивать кол-во ед. уже выбранного товара до 1,000$ или же добавлять другие виды товаров с минимальным кол-вом в 10 ед. до получения нужного порога. И наоборот. Если выбрано товара на общую стоимость в 1,500$, но кол-во одного вида товара составляет всего 3 ед., то также не представляется возможным оформить заказ пока покупатель не увеличит кол-во по каждому типу товара до мин. 10 ед.
Добрый день, Николай,
Попробуйте скомбинировать с этим гайдом.
Здравствуйте ! Возможно ли сделать именно правило для корзины 8,16,24 товара не больше не меньше ??? (либо 8 товаров, или 16 или 24)
Спасибо
Добрый вечер,
Ну что-то вроде этого, я так понимаю:
Не больше и не меньше!
Добрый день! Какие еще могут быть варианты почему не работает? Может из-за выбора размеров? Заметил что при обновлении страницы товара на долю секунды отображается «2» и потом возвращается «1». :(
Добрый день!
Да, вероятно из-за размеров 🙂 Когда при загрузке страницы товара происходит смена вариации на js, тогда и сбрасывается количество товара.
Спасибо за такую полезную информацию и в целом за сайт.
Помогите пожалуйста с задачей.
У товара есть атрибут "kratnost" кратность заказа (может меняться в зависимости от товара).
Как проверить что пользовать заказал кратное количество товара?
Заранее благодарю!
Пожалуйста! :)
Вы можете попробовать использовать метод
$product->get_attribute( 'kratnost' )
.Можно ли использовать в условии следующий код, чтобы установить минимальное количество товара для определенной категории?
if( has_term( 'category_slug', 'product_cat' ))
И да и нет. В том варианте, в котором вы указали – нет, потому что функция
has_term()
использует глобальное значение ID товара. Но да, потому что вы можете передать в неё ID товара третьим параметром.Например так
has_term( 'category_slug', 'product_cat', $product->get_id() )
.Здравствуйте, Михаил!
Спасибо за урок. Подскажите, если товаров, скажем много, например, 50, то получается по каждому id придется ручками в function.php этот код вписать?
Здравствуйте, теоретически да, но не весь код, а всего лишь одну строчку с условием.
Здравствуйте, Михаил! Огромное спасибо! В карточке товара все работает на отлично. Подскажите, пожалуйста, какой код нужно добавить, чтобы эта опция также работала в Рекомендованных товарах, апсейлах и везде, где есть кнопка сразу добавить в корзину?
Здравствуйте,
поделился бы с вами, если у меня был этот код, но его у меня нет 🙃
Добрый день. А можно как то реализовать минимальное количество для заказа как поле товара, чтобы для каждого товара задавать из админки индивидуально? Я на WC впервые собираю, застрял немного, необходим небольшой каталог с уникальными минимальными тиражами для каждого товара.
Здравствуйте.
Спасибо, для конкретного товара работает, а подскажите как сделать чтобы работало для всех товаров на сайте?
сделал для всех товаров на сайте
Все как правило покупают комплект шин, то есть кол-во 4, а можно будет дать возможность клиентам купить 1,2 или 3 шины, то есть чтобы изначально как сейчас было сразу 4, но шаги назад тоже были возможны?
И ещё один вопрос. В каталоге есть кнопка добавить в корзину, нажав на неё товар добавляется по одному. Как сделать чтобы и в каталоге по умолчанию сразу добавлялось в корзину кол-во 4?