Диагностика проблемы: почему товары с нулевым запасом остаются в корзине
В стандартной настройке WooCommerce товары с нулевым количеством на складе не удаляются из корзины пользователя автоматически. Это может привести к конфликтам при оформлении заказа и неудобствам для клиента, если товар уже недоступен к покупке. Проверить проблему можно, создав товар с ограниченным запасом, добавив его в корзину, а затем уменьшив запас до нуля в админке. При обновлении корзины товар останется, хотя купить его уже нельзя.
Пошаговое решение: автоматическое удаление товаров с нулевым запасом из корзины
1. Добавление фильтра для проверки запаса товаров в корзине
Ниже приведён рабочий пример кода, который проверяет каждый товар в корзине и удаляет его, если запас равен нулю. Код нужно добавить в файл functions.php вашей темы или в отдельный плагин.
add_action('woocommerce_check_cart_items', 'remove_out_of_stock_items_from_cart');
function remove_out_of_stock_items_from_cart() {
$cart = WC()->cart;
$items_to_remove = [];
foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
$product = $cart_item['data'];
if ( ! $product->is_in_stock() ) {
$items_to_remove[] = $cart_item_key;
}
}
foreach ( $items_to_remove as $cart_item_key ) {
$cart->remove_cart_item( $cart_item_key );
}
if ( ! empty( $items_to_remove ) ) {
wc_add_notice( 'Из корзины удалены товары, которых нет в наличии.', 'notice' );
}
}2. Проверка работы кода на сайте
Добавьте товар с ограниченным запасом в корзину, затем в админке измените количество товара на 0. После обновления страницы корзины товар должен автоматически удалиться и появиться уведомление. Если этого не произошло, проверьте правильность вставки кода и включение корзины WooCommerce.
Проверка результата после внедрения
- Добавьте в корзину товар с запасом 1–5 штук.
- В админке уменьшите запас товара до 0.
- Обновите страницу корзины в браузере.
- Товар должен исчезнуть из корзины автоматически.
- Появится уведомление о удалении недоступных товаров.
Частые ошибки и как их исправить
- Код не срабатывает: Убедитесь, что WooCommerce активен и корзина инициирована (
WC()->cartне равнаnull). - Товары не удаляются: Проверьте, что функция
is_in_stock()корректно отражает состояние запасов. Если используется сторонний плагин управления запасами, метод может работать иначе. - Уведомление не отображается: Проверьте, что шаблоны WooCommerce корректно выводят системные уведомления (
wc_print_notices()вызывается в корзине). - Производительность: Для больших корзин используйте кэширование или оптимизацию, чтобы не нагружать сервер.
Практические советы по безопасности и производительности
- Не используйте код в
functions.phpнапрямую на продакшн-сайте без тестирования в staging-среде. - Добавляйте проверку nonce и права пользователя, если модифицируете корзину по AJAX.
- Для сайтов с большим количеством товаров и пользователей рассмотрите внедрение AJAX-очистки корзины по таймеру, чтобы избежать лишних запросов.
- При использовании сторонних плагинов управления запасами убедитесь в совместимости с функцией
is_in_stock().
Сравнение вариантов решения удаления товаров с нулевым запасом из корзины
| Вариант | Преимущества | Недостатки |
|---|---|---|
| Код в functions.php | Полный контроль, бесплатно, без зависимостей | Требует навыков, возможны ошибки при обновлениях |
| Плагин очистки корзины | Простота установки, готовый функционал | Может быть избыточным, замедляет сайт, зависит от стороннего разработчика |
| Комбинация с WP-Cron | Автоматическое регулярное очищение, не зависит от действий пользователя | Сложнее в реализации, возможны задержки удаления |