Проблема: заказ товаров, которых нет в наличии
В стандартной комплектации WooCommerce иногда допускает оформление заказов на товары, которые отсутствуют на складе. Это может привести к перебоям с выполнением заказов и неудовлетворенности клиентов. Особенно часто встречается при одновременных заказах с высокой нагрузкой или при неправильных настройках управления запасами.
Диагностика проблемы
Чтобы убедиться, что проблема с заказом отсутствующих товаров именно у вас, проверьте следующее:
- В настройках WooCommerce включено ли управление запасами (
WooCommerce > Настройки > Товары > Управление запасами). - Для конкретных товаров в карточках задано количество на складе и включена опция управления запасами.
- В процессе оформления заказа клиент может добавить в корзину количество, превышающее остаток.
- Нет ли кастомных плагинов или кода, которые отключают проверку наличия.
Пошаговое решение: автоматическая проверка и блокировка заказа отсутствующих товаров
1. Включите управление запасами в WooCommerce
Перейдите в WooCommerce > Настройки > Товары > Управление запасами и активируйте «Включить управление запасами». Укажите параметры удержания запасов (например, 60 минут), если нужно.
2. Добавьте проверку наличия товаров при оформлении заказа с помощью хука woocommerce_checkout_process
В файле functions.php вашей темы или в кастомном плагине добавьте следующий код, который блокирует оформление заказа, если в корзине есть товары с нехваткой на складе:
add_action('woocommerce_checkout_process', 'wpc_check_stock_before_checkout');
function wpc_check_stock_before_checkout() {
foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item) {
$product = $cart_item['data'];
$quantity = $cart_item['quantity'];
if ($product->managing_stock() && !$product->has_enough_stock($quantity)) {
wc_add_notice(sprintf('Товар "%s" доступен в количестве %d, но в корзине указано %d.', $product->get_name(), $product->get_stock_quantity(), $quantity), 'error');
}
}
}3. (Опционально) Предотвратите добавление в корзину товаров с недостатком
Чтобы сразу блокировать добавление в корзину, используйте фильтр woocommerce_add_to_cart_validation:
add_filter('woocommerce_add_to_cart_validation', 'wpc_validate_stock_on_add_to_cart', 10, 3);
function wpc_validate_stock_on_add_to_cart($passed, $product_id, $quantity) {
$product = wc_get_product($product_id);
if ($product->managing_stock() && !$product->has_enough_stock($quantity)) {
wc_add_notice('Извините, товара "' . $product->get_name() . '" недостаточно на складе.', 'error');
return false;
}
return $passed;
}Проверка результата после внедрения
- Попробуйте добавить в корзину количество товара, превышающее остаток. Добавление должно быть заблокировано с ошибкой.
- При оформлении заказа с уже добавленным товаром в недостаточном количестве должна появиться ошибка и оформление заказа не пройдет.
- Проверьте логику на товарах с управлением запасами и без него.
Частые ошибки и как их исправить
- Ошибка: Проверка не срабатывает, заказ все равно создается.
Причина: Кэширование страниц оформления заказа или корзины, либо конфликт с другими плагинами.
Решение: Отключите кэширование для страниц корзины и оформления заказа, временно деактивируйте плагины, влияющие на корзину. - Ошибка: Сообщения об ошибках не отображаются.
Причина: В теме отсутствует вызов функцииwc_print_notices()в шаблонах корзины/чекаута.
Решение: Проверьте и добавьте эту функцию в нужные шаблоны. - Ошибка: Некорректное поведение при вариациях товаров.
Причина: Неправильное получение объекта товара для вариаций.
Решение: Используйтеwc_get_product($variation_id)для вариаций в проверках.
Практические советы по безопасности и производительности
- Не используйте слишком тяжелые проверки в хуках оформления заказа, чтобы не замедлять процесс.
- Кэширование страниц корзины и чекаута должно быть отключено, иначе результаты проверки будут некорректными.
- Регулярно обновляйте WooCommerce и плагины, чтобы избежать несовместимостей.
- Для сайтов с высокой нагрузкой рассмотрите использование специализированных сервисов для управления запасами и синхронизации с внешними системами.
Сравнение способов проверки наличия товаров в WooCommerce
| Метод | Где реализуется | Плюсы | Минусы |
|---|---|---|---|
| Стандартные настройки WooCommerce | Админка WooCommerce | Простота настройки, встроенная поддержка | Не всегда блокирует заказ, если есть кастомный код |
| Проверка при добавлении в корзину (код) | functions.php | Блокирует сразу, улучшает UX | Не защищает, если товар изменили после добавления |
| Проверка при оформлении заказа (код) | functions.php | Гарантирует проверку перед оплатой | Ошибка появляется позже, можно потерять клиента |