Проблема: вариации товаров в WooCommerce не отключаются при отсутствии на складе
В интернет-магазинах на WooCommerce часто возникает ситуация, когда вариации товаров остаются доступными для выбора, хотя их запас на складе равен нулю или отрицательный. Это приводит к ошибкам при оформлении заказа и негативному опыту клиентов.
Диагностика проблемы
Для начала проверьте настройки WooCommerce в разделе Товары > Запасы. Там есть опция Отключать товар, если запас равен нулю. Однако она не всегда применяется к вариациям по умолчанию.
Чтобы убедиться, что проблема именно в вариациях, откройте любой товар с вариациями:
- Перейдите в редактирование товара в админке WordPress.
- Выберите вкладку Вариации.
- Проверьте наличие запасов в каждой вариации.
Если вариации с нулевым запасом продолжают быть активными и видимыми на фронтенде, значит стандартные настройки WooCommerce не отключают их автоматически.
Пошаговое решение: автоматическое отключение вариаций с нулевым запасом
Реализуем код, который будет автоматически менять статус вариаций на "выключено", если их запас равен нулю или меньше.
1. Добавьте следующий код в functions.php вашей дочерней темы или в плагин для кастомных функций:
add_action('woocommerce_product_set_stock', 'disable_variations_with_no_stock', 10, 1);
function disable_variations_with_no_stock($product) {
if (!$product->is_type('variable')) {
return;
}
$variations = $product->get_children();
foreach ($variations as $variation_id) {
$variation = wc_get_product($variation_id);
if (!$variation) continue;
$stock_quantity = $variation->get_stock_quantity();
// Отключаем вариацию, если запас 0 или меньше
if ($stock_quantity !== null && $stock_quantity <= 0) {
if ($variation->get_status() !== 'private') {
$variation->set_status('private');
$variation->save();
}
} else {
// Включаем вариацию, если запас появился
if ($variation->get_status() !== 'publish') {
$variation->set_status('publish');
$variation->save();
}
}
}
}Код использует хук woocommerce_product_set_stock, который срабатывает при изменении запаса товара и автоматически обновляет статус вариаций.
2. Дополнительно: массовая обработка существующих товаров
Если у вас уже есть много товаров с вариациями, которые нужно быстро обновить, используйте следующий скрипт (однократный запуск):
function bulk_disable_out_of_stock_variations() {
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'post_status' => 'publish',
'fields' => 'ids',
'tax_query' => [
[
'taxonomy' => 'product_type',
'field' => 'slug',
'terms' => 'variable',
],
],
];
$query = new WP_Query($args);
foreach ($query->posts as $product_id) {
$product = wc_get_product($product_id);
if (!$product) continue;
$variations = $product->get_children();
foreach ($variations as $variation_id) {
$variation = wc_get_product($variation_id);
if (!$variation) continue;
$stock_quantity = $variation->get_stock_quantity();
if ($stock_quantity !== null && $stock_quantity <= 0) {
if ($variation->get_status() !== 'private') {
$variation->set_status('private');
$variation->save();
}
}
}
}
}
// Запустите один раз для применения
bulk_disable_out_of_stock_variations();Проверка результата после внедрения
- Измените запас на ноль или меньше в вариации товара через админку.
- Обновите страницу товара на фронтенде — вариация должна исчезнуть из списка выбора.
- Убедитесь, что при увеличении запаса вариация снова появляется.
- Проверьте статус вариации в админке — он должен быть «private» для отключённых и «publish» для активных.
Частые ошибки и как их исправить
- Код не срабатывает при изменении запаса: убедитесь, что используется именно хук
woocommerce_product_set_stock, а не устаревший или отсутствующий. - Вариации не исчезают с фронтенда, хотя статус изменён: проверьте, что в настройках WooCommerce не отключено отображение товаров с приватным статусом. Можно использовать статус
privateилиdraft, в зависимости от логики магазина. - Массовый скрипт не запускается или выдает ошибки: проверьте лимит памяти и время выполнения PHP, лучше запускать в консоли WP-CLI или через специально созданный админский скрипт.
- Другие плагины вмешиваются в статус вариаций: временно отключите плагины, которые управляют запасами или статусами товаров, чтобы проверить конфликт.
Практические советы по производительности и безопасности
- Используйте кеширование запросов и избегайте частых массовых обновлений — лучше обрабатывать изменения по событию.
- Для массовой обработки больших каталогов используйте WP-CLI, чтобы избежать таймаутов.
- Регулярно проверяйте логи ошибок для выявления конфликтов с другими плагинами.
- Если у вас много вариаций, оптимизируйте базу данных WooCommerce, удаляя неиспользуемые метаданные (например, с помощью Clearfy Pro https://wpshop.ru/plugins/clearfy?utm_source=wpcontrol.ru&utm_medium=article&utm_campaign=woocommerce-avtomaticheskoe-otkljuchenie-neaktivnyh-variacij-tovarov).
Сравнение вариантов решения
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Встроенные настройки WooCommerce | Отключение товаров с нулевым запасом | Простота, не требует кода | Не работает для вариаций по умолчанию |
Код на хуке woocommerce_product_set_stock |
Автоматическое переключение статуса вариаций | Полный контроль, работает сразу | Требует базовых знаний PHP, нужно тестировать |
| Массовая обработка через WP-CLI | Обновление существующих товаров и вариаций | Подходит для больших магазинов | Нужен доступ к серверу, опыт работы с консолью |