Диагностика: как понять, что проверка наличия товара в корзине не работает
В WooCommerce нередко возникает ситуация, когда магазин не блокирует добавление товара в корзину, хотя его запас (stock) равен нулю или меньше. Это приводит к оформлению заказов с отсутствующим товаром, конфликтам с поставками и негативным отзывам.
Основные признаки проблемы:
- Клиенты добавляют в корзину товары, которых нет в наличии.
- В админке WooCommerce указано, что товар закончился (Out of stock), но на сайте корзина все равно принимает его.
- Используются кастомные решения или плагины, которые работают с корзиной, и они не учитывают статус наличия.
Как проверить, действительно ли проверка не работает
Для диагностики вручную:
- Перейдите в WooCommerce → Товары и выберите товар с нулевым запасом.
- Убедитесь, что галочка
Управлять запасом?включена, а количество на складе равно 0. - Откройте страницу этого товара в публичной части сайта и попробуйте добавить его в корзину.
- Если товар добавляется — проверка не работает.
Если в стандартном шаблоне WooCommerce проблема не воспроизводится, значит, конфликт скорее всего вызван кастомным кодом или сторонним плагином.
Пошаговое решение: как исправить проверку наличия товара в корзине
WooCommerce по умолчанию должен блокировать добавление товара в корзину, если запас равен 0. Если это не происходит, рекомендуем сделать следующее.
1. Проверка настроек WooCommerce
- В админке перейдите в WooCommerce → Настройки → Товары → Запасы.
- Убедитесь, что опция
Включить управление запасамиактивирована. - Проверьте, что
Разрешить заказы под заказ(Allow backorders) отключена или установлена в значение «Нет».
2. Отключение сторонних плагинов, влияющих на корзину
Отключите все плагины, которые могут вмешиваться в процесс добавления товара в корзину (кэш, оптимизация, кастомные фильтры). Проверьте, работает ли проверка без них.
3. Исправление с помощью кода: фильтр woocommerce_add_to_cart_validation
Если предыдущие шаги не помогли, добавьте следующий код в functions.php вашей темы или в кастомный плагин:
add_filter('woocommerce_add_to_cart_validation', 'custom_check_product_stock_before_add', 10, 3);
function custom_check_product_stock_before_add($passed, $product_id, $quantity) {
$product = wc_get_product($product_id);
if (!$product->is_in_stock()) {
wc_add_notice(__('Извините, этот товар отсутствует на складе и не может быть добавлен в корзину.'), 'error');
return false;
}
if ($product->get_stock_quantity() < $quantity) {
wc_add_notice(sprintf(__('На складе доступно только %d единиц этого товара.'), $product->get_stock_quantity()), 'error');
return false;
}
return $passed;
}Этот фильтр блокирует добавление товара в корзину, если он отсутствует на складе, или если запрошенное количество превышает доступное.
Проверка результата после внедрения
Для проверки:
- Обновите страницу продукта с нулевым запасом.
- Попробуйте добавить в корзину — должно появиться сообщение об ошибке, и товар не добавится.
- Проверьте добавление товара с ограниченным запасом, превышая количество — также должна быть ошибка.
- Убедитесь, что товары с достаточным запасом добавляются без проблем.
Частые ошибки и как их исправить
- Ошибка: Включены заказы под заказ (backorders).
Решение: Отключите эту опцию в настройках WooCommerce, если не хотите, чтобы товары с нулевым запасом добавлялись. - Ошибка: Кэширование страниц корзины или товара.
Решение: Настройте исключения для страниц корзины и оформления заказа в плагинах кэширования (например, WP Super Cache, LiteSpeed Cache). - Ошибка: Кастомные фильтры или действия изменяют поведение корзины.
Решение: Проанализируйте сторонние плагины и кастомный код, временно отключите их для теста.
Практические советы по безопасности и производительности
- Всегда проверяйте логи ошибок PHP и WooCommerce (WooCommerce → Статус) при подозрениях на проблемы с корзиной.
- Используйте функцию
wc_add_notice()для информирования пользователя о невозможности добавить товар. - Минимизируйте количество сторонних плагинов, влияющих на корзину, чтобы снизить риск конфликтов.
- Соблюдайте стандартные хуки и фильтры WooCommerce для совместимости при обновлениях.
Сравнение вариантов решения проблемы
| Метод | Плюсы | Минусы |
|---|---|---|
| Настройки WooCommerce | Быстро, без кода | Иногда недостаточно при кастомных решениях |
| Отключение конфликтных плагинов | Устраняет сторонние проблемы | Может нарушить функционал сайта |
Код с фильтром woocommerce_add_to_cart_validation | Точный контроль, легко масштабируется | Требует навыков программирования |