Проблема: как задать минимальную сумму заказа для отдельных товаров в WooCommerce
В стандартном WooCommerce есть настройка минимальной суммы заказа, но она действует на весь заказ целиком. Часто требуется ограничить минимальную сумму заказа не для всего корзины, а для отдельных товаров или категорий товаров. Например, чтобы клиент не мог купить дешевый товар поштучно, а только от определенной суммы. В этой статье разберем, как реализовать такое требование программно с проверкой и сообщением об ошибке.
Диагностика задачи
Стандартные опции WooCommerce не позволяют задать минимальную сумму заказа по отдельным товарам. Плагины с похожим функционалом часто слишком громоздкие или не удовлетворяют требованиям точечной настройки. Поэтому необходимо добавить кастомный PHP-код в файл темы functions.php или в плагин для сайта.
Главные вопросы, на которые нужно ответить:
- Как определить сумму корзины с учетом только выбранных товаров?
- Как вывести понятное сообщение пользователю при несоответствии?
- Как проверить, что ограничение не мешает заказу, если товаров с ограничением нет?
Пошаговое решение: код для установки минимальной суммы заказа по отдельным товарам
Реализуем проверку на этапе оформления заказа с помощью хука woocommerce_checkout_process. Для примера ограничим минимальную сумму заказа для товаров категории с ярлыком min-order в размере 3000 рублей.
add_action('woocommerce_checkout_process', 'check_min_order_sum_for_category');
function check_min_order_sum_for_category() {
$min_sum = 3000; // минимальная сумма для категории
$category_slug = 'min-order';
$cart = WC()->cart->get_cart();
$category_sum = 0;
foreach ( $cart as $cart_item ) {
$product = $cart_item['data'];
if ( has_term( $category_slug, 'product_cat', $product->get_id() ) ) {
$category_sum += $cart_item['line_total'];
}
}
if ( $category_sum > 0 && $category_sum < $min_sum ) {
wc_add_notice( sprintf('Минимальная сумма заказа для товаров категории "%s" должна быть не менее %d рублей. Текущая сумма: %d рублей.', $category_slug, $min_sum, $category_sum), 'error' );
}
}
Код перебирает товары в корзине, суммирует цены товаров из нужной категории и сравнивает с порогом. Если сумма меньше, выводит ошибку и блокирует оформление.
Как расширить проверку на несколько категорий или товаров
Для нескольких категорий используйте массив:
$categories = ['min-order', 'premium'];
foreach ( $cart as $cart_item ) {
$product = $cart_item['data'];
foreach ($categories as $category_slug) {
if ( has_term( $category_slug, 'product_cat', $product->get_id() ) ) {
$category_sum[$category_slug] = ($category_sum[$category_slug] ?? 0) + $cart_item['line_total'];
}
}
}
foreach ($categories as $category_slug) {
if (isset($category_sum[$category_slug]) && $category_sum[$category_slug] < $min_sum) {
wc_add_notice(sprintf('Минимальная сумма заказа для товаров категории "%s" должна быть не менее %d рублей.', $category_slug, $min_sum), 'error');
}
}
Проверка результата после внедрения
1. Добавьте в корзину товары из категории min-order на сумму меньше 3000 рублей — при попытке оформить заказ должна появиться ошибка и блокировка.
2. Попробуйте добавить товаров на сумму от 3000 рублей — оформление должно пройти без ошибок.
3. Добавьте товары из других категорий — ошибки не должно быть.
4. Очистите корзину, убедитесь, что ошибки нет.
Частые ошибки и их исправление
- Ошибка: сообщение не выводится, оформление заказа проходит даже если сумма меньше. Проверьте, что код добавлен в
functions.phpактивной темы или в подключенный плагин. Хукwoocommerce_checkout_processдолжен срабатывать. - Проверка не срабатывает для вариаций товаров. Для вариаций используйте
$product->get_parent_id()вhas_termдля проверки категории родителя. - Минимальная сумма не учитывает скидки. В коде используется
line_total— это цена после скидки, что обычно правильно. Если хотите цену до скидок, используйтеline_subtotal. - Пользователь не понимает ошибку. Обеспечьте понятный текст и, если нужно, добавьте ссылку на каталог товаров категории.
Практические советы по производительности и безопасности
- Код выполняется только на этапе оформления заказа, не влияет на загрузку страниц.
- Не используйте дорогие запросы к базе — все данные берутся из объекта корзины.
- Выводите ошибки через
wc_add_notice— это стандартный способ WooCommerce. - Если много категорий, кешируйте результаты проверки.
Сравнение вариантов реализации
| Вариант | Плюсы | Минусы |
|---|---|---|
| Код в functions.php | Гибкость, контроль, нет лишних плагинов | Требуется навыки программирования |
| Плагин с ограничениями | Простота настройки, готовые функции | Избыточность, нагрузка, затраты на лицензии |
| Компромисс: кастомный плагин | Легче переносить, можно делиться с командой | Нужно поддерживать и обновлять |