Диагностика проблемы: почему варианты товаров с нулевым запасом не отключаются
В стандартной настройке WooCommerce варианты товаров с нулевым запасом остаются активными и видимыми на сайте, если не включена строгая проверка наличия. Это приводит к тому, что покупатели могут добавлять в корзину товары, которых фактически нет, что создает неудобства и негативно влияет на продажи.
Чтобы проверить текущую ситуацию, зайдите в админку WooCommerce в раздел Товары > Вариации и посмотрите запас у нескольких вариантов. Затем на фронтенде откройте страницу товара и проверьте, доступны ли для выбора варианты с нулевым запасом.
Если варианты с нулём на складе доступны для выбора и покупки, значит требуется автоматическая их деактивация.
Шаги решения: как автоматически отключать варианты при отсутствии запаса
1. Включение управления запасами в WooCommerce
Убедитесь, что в WooCommerce > Настройки > Запасы включена опция Включить управление запасами. Это базовое требование для работы с запасами товаров.
2. Добавление кода для автоматической деактивации вариантов с нулевым запасом
Добавьте следующий код в файл functions.php вашей дочерней темы или в пользовательский плагин. Этот код автоматически устанавливает статус вариантов с запасом 0 как draft, что делает их недоступными на сайте.
add_action('woocommerce_product_set_stock_status', 'disable_variations_with_no_stock', 10, 3);
function disable_variations_with_no_stock($product_id, $stock_status, $product) {
if ($product->is_type('variable')) {
$variations = $product->get_children();
foreach ($variations as $variation_id) {
$variation = wc_get_product($variation_id);
if ($variation->managing_stock() && !$variation->is_in_stock()) {
if ($variation->get_status() !== 'draft') {
$variation->set_status('draft');
$variation->save();
}
} else {
if ($variation->get_status() === 'draft') {
$variation->set_status('publish');
$variation->save();
}
}
}
}
}
// Запустить проверку статусов при загрузке админки (для синхронизации)
add_action('admin_init', function() {
$args = [
'post_type' => 'product',
'post_status' => 'publish',
'numberposts' => -1
];
$products = get_posts($args);
foreach ($products as $post) {
$product = wc_get_product($post->ID);
if ($product->is_type('variable')) {
do_action('woocommerce_product_set_stock_status', $post->ID, '', $product);
}
}
});3. Очистка кэша и проверка работы скрипта
После добавления кода очистите кэш сайта (если используете плагин кэширования), а также кэш браузера. Затем на фронтенде проверьте страницу вариативного товара с нулевыми запасами — варианты с нулём должны быть скрыты или недоступны для выбора.
Проверка результата после внедрения
- Обновите страницу вариативного товара и убедитесь, что варианты с запасом 0 не отображаются в селекторе вариаций.
- В админке в разделе «Вариации» варианты с нулевым запасом должны иметь статус
Черновик (draft). - Попробуйте вручную изменить запас варианта с 0 на положительное число — статус должен автоматически измениться обратно на
Опубликовано (publish), и вариант должен стать доступен на сайте.
Частые ошибки и как их исправить
- Код не срабатывает при массовом обновлении запасов. Проверьте, что функция
woocommerce_product_set_stock_statusвызывается корректно, и что переменная$productдействительно является объектомWC_Product_Variable. - Варианты остаются видимыми, хотя запас 0. Возможно, у варианта отключено управление запасами (
manage_stock=false). В этом случае код не отключит вариант. Проверьте настройку управления запасами у каждого варианта. - Изменения не применяются сразу на фронтенде. Очистите кэш сайта, а также кэш браузера. Если используете CDN, очистите кэш там.
- Функция не запускается при импорте товаров. При импорте запасов через CSV или API может не срабатывать хук. В этом случае запустите ручную проверку через
admin_initили выполните скрипт вручную.
Практические советы по безопасности и производительности
- Резервное копирование. Перед внесением изменений в код и автоматической сменой статусов сделайте резервную копию базы данных.
- Отложенная обработка. Если у вас очень большой каталог, рекомендуется запускать проверку запасов в фоне через WP-Cron или отдельный скрипт, чтобы не нагружать страницу админки.
- Логирование. Добавьте логирование изменений статусов вариантов для отладки и мониторинга.
- Минимизация прямого редактирования. Лучше оформить код в отдельный плагин, чтобы не потерять изменения при обновлении темы.
Сравнение способов решения задачи
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Код в functions.php | Автоматическая смена статуса варианта на draft | Бесплатно, гибко, автоматизация | Нужен опыт, возможны ошибки при обновлениях |
| Плагины управления запасами | Плагины с настройками скрытия товаров без запаса | Простота настройки, поддержка | Дополнительные нагрузки, платные решения |
| Ручное управление | Ручное отключение вариантов в админке | Простота и контроль | Трудозатратно, риск ошибок |