Сценарий типичный: магазин работает только с оптовыми заказами, а в корзину добавляют один товар и пытаются оформить покупку. В WooCommerce это можно ограничить без тяжелых плагинов — через проверку корзины на этапе оформления заказа. Такой подход удобен, когда нужно задать минимальное количество товаров, минимальную сумму или оба условия сразу.
Ниже разберем, как диагностировать проблему, какие есть варианты решения и как проверить, что ограничение реально работает, а не только выводит сообщение на странице корзины.
Когда это нужно и как выглядит проблема
Ограничение обычно требуется в трех случаях:
- оптовый магазин, где заказ меньше определенного количества не имеет смысла;
- доставка или упаковка окупается только от минимальной суммы;
- нужно отсечь случайные тестовые заказы от клиентов, которые еще не готовы покупать.
Если ограничение не настроено, покупатель спокойно нажимает кнопку оформления заказа, даже если корзина почти пустая. Иногда это приводит к лишним ручным отменам заказов и переписке с клиентом.
Диагностика: что именно надо ограничить
Перед кодом важно понять, что считать минимумом. В WooCommerce есть несколько разных метрик, и их часто путают:
- количество позиций — сколько единиц товара в корзине;
- количество уникальных товаров — сколько разных товаров добавлено;
- сумма корзины — стоимость товаров без учета доставки;
- сумма с налогом — зависит от вашей логики учета НДС.
Если вам нужен именно минимальный заказ по сумме, не стоит проверять количество товаров. И наоборот: если магазин продает одинаковые коробки, сумма может быть вторичной, а важнее именно число единиц.
Что выбрать: плагин, код или гибрид
Для такой задачи есть три рабочих подхода. Если ограничение простое, код обычно надежнее: он не добавляет лишних настроек и не зависит от стороннего интерфейса. Плагин имеет смысл, если менеджеры должны менять правило без разработчика.
| Подход | Плюсы | Минусы | Когда брать |
|---|---|---|---|
| Код в теме или мини-плагине | Прозрачно, быстро, без лишних зависимостей | Нужно аккуратно тестировать обновления | Если правило одно и оно стабильно |
| Плагин для минимального заказа | Есть интерфейс, можно менять без кода | Чужая логика, лишние настройки | Если правила часто меняются |
| Гибрид: код + настройки | Гибко и удобно для поддержки | Сложнее в сопровождении | Если минимум зависит от роли, категории или способа оплаты |
Если нужен именно практический и предсказуемый вариант, я бы начинал с кода в небольшом mu-plugin или в отдельном плагине для сайта. Так правило не потеряется при смене темы.
Пошаговое решение через проверку корзины
Самый безопасный способ — использовать хук woocommerce_check_cart_items. Он срабатывает на этапе проверки корзины и позволяет остановить оформление заказа, если условие не выполнено.
Ниже пример: покупка запрещается, если в корзине меньше 5 единиц товара или сумма товаров меньше 3000 рублей. Сообщение выводится в стандартные уведомления WooCommerce.
<?php
add_action( 'woocommerce_check_cart_items', 'wpai_min_cart_rules' );
function wpai_min_cart_rules() {
if ( ! WC()->cart ) {
return;
}
$min_qty = 5;
$min_total = 3000;
$cart_qty = WC()->cart->get_cart_contents_count();
$cart_total = (float) WC()->cart->get_cart_contents_total();
if ( $cart_qty < $min_qty ) {
wc_add_notice(
sprintf( 'Минимальный заказ — %d шт. Сейчас в корзине %d шт.', $min_qty, $cart_qty ),
'error'
);
}
if ( $cart_total < $min_total ) {
wc_add_notice(
sprintf( 'Минимальная сумма заказа — %s. Сейчас в корзине %s.', wc_price( $min_total ), wc_price( $cart_total ) ),
'error'
);
}
}Если вам нужно ограничить только сумму, удалите проверку $cart_qty. Если нужен только минимум по количеству, оставьте только первую часть.
Где разместить код
Лучше не вставлять такой код в functions.php активной темы, если тема может меняться. Практичнее сделать мини-плагин или добавить код в mu-plugins. Тогда правило не исчезнет после обновления темы.
Пример минимального файла плагина:
<?php
/**
* Plugin Name: WP AI Minimum Cart Rules
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
add_action( 'woocommerce_check_cart_items', 'wpai_min_cart_rules' );
function wpai_min_cart_rules() {
if ( ! WC()->cart ) {
return;
}
$min_qty = 5;
$min_total = 3000;
$cart_qty = WC()->cart->get_cart_contents_count();
$cart_total = (float) WC()->cart->get_cart_contents_total();
if ( $cart_qty < $min_qty ) {
wc_add_notice( 'Добавьте еще товаров до минимального количества.', 'error' );
}
if ( $cart_total < $min_total ) {
wc_add_notice( 'Сумма заказа ниже минимальной.', 'error' );
}
}Как сделать правило гибче: по ролям или по категориям
В реальных магазинах минимальный заказ часто отличается для разных групп клиентов. Например, для розницы правило одно, а для опта другое. Или минимум нужен только для конкретной категории товаров.
Для этого можно добавить условия до проверки корзины. Ниже пример, где минимальная сумма применяется только к пользователям с ролью customer, а для администраторов и менеджеров проверка не мешает работе в админке и тестах.
<?php
add_action( 'woocommerce_check_cart_items', 'wpai_min_cart_rules_by_role' );
function wpai_min_cart_rules_by_role() {
if ( is_admin() && ! wp_doing_ajax() ) {
return;
}
if ( ! is_user_logged_in() ) {
return;
}
$user = wp_get_current_user();
if ( in_array( 'administrator', (array) $user->roles, true ) ) {
return;
}
$min_total = 3000;
$cart_total = (float) WC()->cart->get_cart_contents_total();
if ( $cart_total < $min_total ) {
wc_add_notice( 'Минимальная сумма заказа для вашего аккаунта не достигнута.', 'error' );
}
}Если нужно ограничение по категории, используйте проверку товаров в корзине через has_term() или wc_get_product(). Но не делайте это наугад: сначала определите, что именно должно блокировать заказ — любой товар в корзине или только товары из конкретной категории.
Проверка результата после внедрения
После установки кода важно проверить не только сообщение на странице корзины, но и сам процесс оформления заказа. Ошибки часто проявляются на AJAX-обновлении корзины или на странице checkout.
- добавьте в корзину товар на сумму ниже минимума;
- перейдите в корзину и убедитесь, что WooCommerce показывает уведомление;
- попробуйте открыть checkout напрямую по URL;
- проверьте, что заказ не создается, пока условие не выполнено;
- добавьте еще товары и убедитесь, что ошибка исчезает.
Если у вас включен кэш на страницах магазина, отдельно проверьте, что уведомление не сохраняется в кэше и не показывается тем, у кого корзина уже соответствует условиям.
Что смотреть в логах и браузере
Если сообщение не появляется, откройте консоль браузера и проверьте, нет ли ошибок JavaScript на странице корзины. Затем посмотрите, не отключен ли стандартный вывод уведомлений WooCommerce в шаблоне темы. Иногда тема убирает блок wc_print_notices(), и тогда сообщение есть в системе, но не видно пользователю.
Еще один полезный тест — временно заменить текст уведомления на очевидный, например TEST MIN CART. Если текст не появился, проблема не в условии, а в том, где и как подключен код.
Частые ошибки и как их исправить
Проверяют не тот показатель
Самая частая ошибка — используют get_cart_contents_count(), когда на самом деле нужен минимум по сумме. Или наоборот. Сначала зафиксируйте бизнес-правило, потом выбирайте метод проверки.
Код вставили в тему, а потом потеряли после обновления
Если правило критично для продаж, не храните его в шаблоне темы. После обновления или смены темы ограничение может исчезнуть. Для таких задач лучше мини-плагин или mu-plugin.
Уведомление есть, но заказ все равно проходит
Это обычно означает, что проверка стоит не на том хуке или используется только визуальное сообщение без блокировки оформления. Для остановки checkout нужен именно серверный контроль, а не только текст на странице.
Ошибка ломает админку или AJAX
Если не добавить проверку is_admin() и wp_doing_ajax(), код может мешать служебным запросам. Особенно это заметно при обновлении мини-корзины и в некоторых сценариях редактирования заказа.
Безопасность и производительность
Для такой задачи не нужен тяжелый плагин с десятками опций, если правило одно и его можно выразить в нескольких строках кода. Это уменьшает риск конфликтов и упрощает поддержку.
Если магазин крупный, не делайте сложные запросы к базе на каждом рендере корзины. Проверка должна опираться на данные, которые уже есть в объекте WC()->cart. В большинстве случаев этого достаточно.
Если вы используете дополнительные плагины для скидок, подписок или B2B-цен, тестируйте правило отдельно для каждой схемы цен. Минимальная сумма может считаться по-разному: до скидки, после скидки или с учетом налогов. Это лучше зафиксировать заранее, иначе менеджеры будут видеть одно, а покупатели — другое.
Если нужен более широкий набор технических настроек магазина, иногда удобнее подключить инструменты вроде Clearfy Pro для чистки лишнего и упрощения конфигурации сайта, но само ограничение минимального заказа все равно лучше держать в отдельном коде, а не прятать в случайных настройках.
В итоге рабочая схема простая: определяете правило, ставите серверную проверку на woocommerce_check_cart_items, тестируете корзину и checkout, затем переносите код в устойчивое место, которое не зависит от темы.