Проблема: товары в корзине WooCommerce, которых нет в наличии
В интернет-магазинах на WooCommerce часто возникает ситуация, когда покупатели добавляют в корзину товары, которые к моменту оформления заказа уже отсутствуют на складе. Это приводит к ошибкам при оформлении заказа, плохому пользовательскому опыту и дополнительной нагрузке на службу поддержки.
Диагностика проблемы
Чтобы убедиться, что именно эта проблема есть на вашем сайте, выполните следующие шаги:
- Добавьте в корзину товар с количеством, превышающим остаток на складе;
- Перейдите в корзину и проверьте, отображается ли товар с пометкой «Нет в наличии»;
- Попробуйте оформить заказ — WooCommerce должен выдавать ошибку или предупреждение;
- Если товар висит в корзине и не удаляется автоматически, значит нужно реализовать очистку корзины от таких позиций.
Пошаговое решение: автоматическое удаление отсутствующих товаров из корзины
WooCommerce не удаляет автоматически товары из корзины при отсутствии на складе. Чтобы реализовать эту функцию, можно добавить следующий код в файл functions.php вашей темы (или в кастомный плагин):
add_action('woocommerce_before_calculate_totals', 'remove_out_of_stock_items_from_cart', 10, 1);
function remove_out_of_stock_items_from_cart($cart) {
if (is_admin() && !defined('DOING_AJAX')) {
return;
}
foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
$product = $cart_item['data'];
if (!$product->is_in_stock()) {
// Удаляем товар из корзины
WC()->cart->remove_cart_item($cart_item_key);
// Опционально: добавляем уведомление
wc_add_notice(sprintf(__('Товар "%s" удалён из корзины, так как отсутствует на складе.', 'woocommerce'), $product->get_name()), 'error');
}
}
}Этот код проверяет каждый товар в корзине перед подсчётом итогов и удаляет те, которые отсутствуют на складе. Также пользователю выводится уведомление об удалении товара.
Как проверить, что решение работает
- Добавьте в корзину товар с нулевым или отрицательным остатком;
- Перейдите в корзину — товар должен исчезнуть, а на странице появится сообщение об удалении;
- Если товар доступен на складе, он остаётся в корзине.
Частые ошибки и их исправление
- Код не срабатывает в админке: это нормальное поведение, проверка
is_admin()исключает работу в панели управления. Если хотите тестировать в админке, временно уберите проверку. - Товары не удаляются, если остаток больше 0, но меньше запрошенного количества: код проверяет только наличие товара на складе, а не количество. Для проверки количества используйте
$product->get_stock_quantity()и сравнивайте с количеством в корзине. - Уведомления не отображаются: проверьте, подключена ли функция
wc_print_notices()в шаблоне корзины.
Улучшение: учитываем количество товара в корзине и остаток на складе
Чтобы удалять только те товары, количество которых в корзине превышает текущий остаток, используйте расширенный код:
add_action('woocommerce_before_calculate_totals', 'remove_items_with_insufficient_stock', 10, 1);
function remove_items_with_insufficient_stock($cart) {
if (is_admin() && !defined('DOING_AJAX')) {
return;
}
foreach ($cart->get_cart() as $cart_item_key => $cart_item) {
$product = $cart_item['data'];
$quantity_in_cart = $cart_item['quantity'];
$stock_quantity = $product->get_stock_quantity();
if (!$product->is_in_stock() || $quantity_in_cart > $stock_quantity) {
WC()->cart->remove_cart_item($cart_item_key);
wc_add_notice(sprintf(__('Товар "%s" удалён из корзины из-за недостаточного количества на складе.', 'woocommerce'), $product->get_name()), 'error');
}
}
}Чек-лист для внедрения решения
- Проверить наличие товаров с нулевым остатком или ограниченным количеством;
- Добавить код в
functions.phpили создать плагин; - Очистить кэш сайта и браузера;
- Протестировать добавление товаров в корзину с разным количеством;
- Убедиться, что уведомления о удалении отображаются;
- Проверить совместимость с другими плагинами корзины и кеширования.
Практические советы по производительности и безопасности
- Код запускается на каждом расчёте корзины, поэтому избегайте тяжелых операций внутри цикла.
- Обрабатывайте только публичные запросы, чтобы не влиять на работу админки.
- Используйте локализацию сообщений через
__()или_e()для поддержки мультиязычности. - Если у вас много товаров, рассмотрите кэширование остатков для снижения нагрузки.
Сравнение вариантов реализации
| Метод | Плюсы | Минусы |
|---|---|---|
| Код в functions.php | Полный контроль, бесплатно, быстро | Требует правок кода, риск ошибок |
| Плагин сторонний | Простота установки, готовый функционал | Может быть платным, нагрузка, конфликт плагинов |
| Модификация шаблонов | Гибкость отображения сообщений | Сложнее поддерживать, требует знаний PHP и WooCommerce |