Диагностика проблемы с отсутствием товаров на складе в WooCommerce
Проблема возникает, когда покупатель добавляет товар в корзину, но после обновления склада товар становится недоступен. WooCommerce по умолчанию не удаляет такие товары из корзины, что приводит к ошибкам при оформлении заказа и снижению конверсии.
Чтобы подтвердить проблему, добавьте в корзину товар с количеством 1. Затем в админке выставьте для этого товара запас 0 и попробуйте оформить заказ. Если 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() {
foreach (WC()->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" удалён из корзины, так как отсутствует на складе.', $product->get_name()), 'error');
}
}
}2. Обработка AJAX для динамического обновления корзины без перезагрузки страницы
Чтобы пользователь видел обновления сразу, нужно добавить AJAX-обработку. WooCommerce уже использует AJAX для обновления корзины, но кастомный код можно дополнить, например, так:
add_action('wp_ajax_check_cart_stock', 'ajax_check_cart_stock');
add_action('wp_ajax_nopriv_check_cart_stock', 'ajax_check_cart_stock');
function ajax_check_cart_stock() {
remove_out_of_stock_items_from_cart();
wp_send_json_success(array('message' => 'Корзина обновлена'));
}И вызвать этот AJAX из JS при загрузке страницы корзины.
Проверка результата после внедрения
- Добавьте в корзину товар с положительным запасом.
- Обнулите запас товара в админке WooCommerce.
- Обновите страницу корзины — товар должен исчезнуть, а на экране появится уведомление.
- Попробуйте оформить заказ с отсутствующим товаром — корзина должна обновиться и запретить оформление.
Частые ошибки и как их исправить
- Код не срабатывает: Проверьте, что функция подключена к хуку
woocommerce_check_cart_itemsи что корзина доступна (она загружена). - Сообщение об удалении не отображается: Убедитесь, что в теме есть вывод сообщений WooCommerce через
wc_print_notices(). - Товары не удаляются при обновлении без перезагрузки: Нужно добавить JS, который будет вызывать AJAX для проверки и обновления корзины после изменений.
- Проблемы с кэшированием: Используйте исключения для страниц корзины и оформления заказа в плагинах кэширования.
Практические советы по улучшению производительности и безопасности
- Не выполняйте проверку наличия товара при каждом запросе без необходимости — ограничьте вызов хука только на страницах корзины и оформления заказа.
- Кэшируйте результаты проверки на короткий промежуток, если у вас много товаров и высокая нагрузка.
- Для безопасности используйте встроенные функции WooCommerce и избегайте прямых запросов к базе.
Сравнение вариантов реализации автоматического удаления товаров из корзины
| Метод | Преимущества | Недостатки | Когда использовать |
|---|---|---|---|
| Добавление кода в functions.php | Быстро, без сторонних плагинов, полный контроль | Требует навыков PHP, нужно поддерживать самостоятельно | Для небольших сайтов и разработчиков |
| Использование плагина (например, Out of Stock Manager) | Готовое решение, поддержка, дополнительные функции | Может влиять на производительность, зависит от разработчика | Для крупных магазинов и без опыта кода |
| Комбинация кода и AJAX | Обновление корзины без перезагрузки, лучше UX | Сложнее в реализации, требует JS навыков | Для профессиональных решений |