Диагностика проблемы: почему нужно отключать варианты без запаса
В стандартной установке WooCommerce вариации товаров с нулевым запасом остаются доступными для выбора покупателям, если не настроена соответствующая опция. Это ведет к ошибкам при оформлении заказа и ухудшает пользовательский опыт, так как клиенты могут выбрать товары, которых фактически нет на складе.
Цель — автоматически отключать варианты товаров (вариации) при отсутствии запаса, чтобы покупатель не мог их выбрать или добавить в корзину.
Пошаговое решение: реализация через функции темы
1. Проверка наличия вариации и запаса
Для начала нужно убедиться, что WooCommerce контролирует запас и что для вариаций корректно установлен параметр управления запасом. Если вариация закончилась, она должна становиться недоступной.
2. Отключение вариации в выпадающем списке выбора
Добавим фильтр, который будет делать варианты с нулевым запасом недоступными в выпадающем списке выбора вариаций.
add_filter('woocommerce_variation_is_active', 'disable_out_of_stock_variations', 10, 2);
function disable_out_of_stock_variations($active, $variation) {
if (!$variation->is_in_stock()) {
return false;
}
return $active;
}Этот код проверяет наличие товара на складе и отключает вариант, если его нет в наличии.
3. Запрет добавления в корзину недоступных вариаций
Иногда вариант может остаться доступным из-за кэша или других настроек. Чтобы гарантировать отсутствие возможности добавить товар без запаса в корзину, добавим проверку при добавлении:
add_filter('woocommerce_add_to_cart_validation', 'prevent_adding_out_of_stock_variations', 10, 3);
function prevent_adding_out_of_stock_variations($passed, $product_id, $quantity) {
$product = wc_get_product($product_id);
if ($product && !$product->is_in_stock()) {
wc_add_notice(__('Этот вариант товара отсутствует на складе и не может быть добавлен в корзину.'), 'error');
return false;
}
return $passed;
}4. Очистка кэша и проверка работы
После внесения изменений обязательно очистите кэш сайта, если используете плагины кэширования, и кэш браузера.
Как проверить, что решение сработало
- Перейдите на страницу товара с вариациями.
- Убедитесь, что варианты без запаса отображаются как отключённые (серые, не кликабельные) или отсутствуют в списке выбора.
- Попробуйте вручную добавить вариант с нулевым запасом в корзину — должна появиться ошибка и операция должна быть отменена.
- Проверьте оформление заказа, чтобы убедиться, что недоступные варианты не могут быть заказаны.
Частые ошибки и как их исправить
- Вариации не отключаются в списке выбора: проверьте, что в настройках WooCommerce включён контроль запаса (WooCommerce > Настройки > Товары > Запас). Без управления запасом код не сработает.
- Вариации отображаются, но можно добавить в корзину: возможно, кэш страницы не очищен, либо конфликт с плагинами, которые управляют корзиной. Попробуйте временно отключить плагины кэширования и проверить снова.
- Код не срабатывает для некоторых типов товаров: убедитесь, что вы работаете именно с вариациями типа 'variation', а не с простыми товарами.
Практические советы по безопасности и производительности
- Добавляйте код не напрямую в
functions.phpтемы, а через дочернюю тему или собственный плагин, чтобы избежать потери изменений при обновлении. - Минимизируйте количество фильтров и хуков, чтобы не создавать лишнюю нагрузку на страницы с большим количеством вариаций.
- Используйте встроенные кэширования WooCommerce аккуратно, очищая кэш после изменения логики отображения вариаций.
Сравнение подходов: плагин vs код
| Метод | Преимущества | Недостатки |
|---|---|---|
| Код в теме | Легко кастомизировать, без лишних плагинов, контроль на уровне кода | Требует навыков разработки, возможны ошибки при обновлениях |
| Плагин (например, WP Out of Stock Manager) | Простой в использовании, готовые настройки, поддержка | Дополнительная нагрузка, может конфликтовать с другими плагинами |