wpcontrol.ru wordpress WPControl.ru

WooCommerce: как автоматически отключить неактивные вариации товаров

Проблема: вариации товаров в 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 Обновление существующих товаров и вариаций Подходит для больших магазинов Нужен доступ к серверу, опыт работы с консолью
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее