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

Диагностика проблемы с неактивными вариантами

В WooCommerce часто возникает ситуация, когда вариации товаров с нулевым остатком или давно не продававшиеся остаются активными и доступны для выбора покупателям. Это ведет к плохому UX: покупатели выбирают вариант, который нельзя купить, что вызывает лишние обращения в поддержку и снижает конверсию.

Проверьте, есть ли такие варианты на вашем сайте:

  • Откройте страницу товара с вариациями.
  • Выполните несколько заказов с разными вариантами.
  • Проверьте наличие вариантов с нулевым запасом или без продаж за последние 3 месяца.

Если такие варианты доступны к покупке, проблема актуальна.

Шаги решения: автоматическое отключение неактивных вариантов

1. Определение критериев неактивности варианта

Для отключения варианта будем использовать два условия:

  • Остаток товара равен 0
  • Нет продаж варианта за последние 90 дней

Для учета продаж используем мета-данные заказов WooCommerce.

2. Реализация функции отключения

Добавьте следующий код в файл functions.php вашей дочерней темы или в плагин для пользовательских функций.

function disable_inactive_variations() {
    $args = [
        'post_type'      => 'product_variation',
        'posts_per_page' => -1,
        'post_status'    => 'publish',
    ];

    $variations = get_posts($args);
    $today = current_time('timestamp');
    $days_limit = 90;
    $disabled_count = 0;

    foreach ($variations as $variation) {
        $variation_id = $variation->ID;
        $product = wc_get_product($variation_id);

        if (!$product->managing_stock() || !$product->is_in_stock()) {
            continue; // Вариант не управляет запасами или уже вне склада
        }

        $stock_quantity = $product->get_stock_quantity();
        if ($stock_quantity > 0) {
            continue; // Есть запас, не отключаем
        }

        // Проверяем продажи варианта за последние 90 дней
        $args_orders = [
            'limit'        => -1,
            'status'       => ['completed', 'processing'],
            'date_after'   => date('Y-m-d', strtotime("-{$days_limit} days")),
            'meta_key'     => '_product_id',
            'meta_value'   => $variation_id,
            'meta_compare' => '=',
        ];

        $orders = wc_get_orders($args_orders);
        $sales_count = 0;

        foreach ($orders as $order) {
            foreach ($order->get_items() as $item) {
                if ($item->get_product_id() == $variation_id) {
                    $sales_count += $item->get_quantity();
                }
            }
        }

        if ($sales_count == 0) {
            // Отключаем вариант
            $variation->post_status = 'draft';
            wp_update_post($variation);
            $disabled_count++;
        }
    }

    return $disabled_count;
}

// Запуск функции по крону или вручную
// Для ручного запуска вызовите: disable_inactive_variations();

3. Автоматизация через WP-Cron

Чтобы функция запускалась автоматически, добавьте планировщик событий:

function schedule_disable_variations_event() {
    if (!wp_next_scheduled('disable_inactive_variations_event')) {
        wp_schedule_event(time(), 'daily', 'disable_inactive_variations_event');
    }
}
add_action('wp', 'schedule_disable_variations_event');

add_action('disable_inactive_variations_event', function() {
    disable_inactive_variations();
});

Проверка результата после внедрения

  • Запустите функцию вручную из админки или через wp cli, если доступен: wp eval 'disable_inactive_variations();'
  • Проверьте статус вариаций в админке WooCommerce — они должны стать черновиками (draft).
  • На фронтенде вариации с отключённым статусом не отображаются и не доступны для выбора.
  • Отслеживайте работу планировщика в логах сервера или плагинах для cron.

Частые ошибки и как их исправить

  • Функция не отключает вариации: Проверьте, что у вариаций включено управление запасами (manage_stock), иначе условие $product->managing_stock() вернёт false.
  • Нет доступа к заказам через wc_get_orders(): Убедитесь, что WooCommerce версии 3.0+ и функция вызывается в правильном контексте (например, не в ранних хуках).
  • Крон задачи не запускаются: Проверьте, активен ли WP-Cron и нет ли блокировок на стороне хостинга.
  • Вариации не скрываются на сайте: Возможно, тема или плагин кэшируют данные, очистите кэш и проверьте снова.

Практические советы по безопасности и производительности

  • Не запускайте функцию отключения вариаций на каждом запросе, используйте WP-Cron с дневным запуском.
  • Для больших магазинов с тысячами вариаций делайте пакетную обработку, чтобы не превышать лимиты памяти и времени выполнения.
  • Всегда делайте резервную копию базы данных перед массовыми изменениями статусов товаров.
  • Для улучшения SEO используйте плагин Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wpsetup.ru&utm_medium=article&utm_campaign=woocommerce-avtomaticheskoe-otklyuchenie-neaktivnyh-variantov-tovarov) для удаления дублирующего контента и оптимизации индексации доступных вариантов.

Сравнение вариантов решения

МетодПлюсыМинусыКогда использовать
Ручное отключениеПростотаТрудозатратно, ошибкиМалый ассортимент товаров
Автоматизация через кодАвтоматически, гибко, бесплатноНужны навыки, требует тестированияСредние и крупные магазины
Плагин для автоматизацииУдобство, поддержкаСтоимость, нагрузкаБольшие магазины, без навыков программирования
Как добавить AJAX в формы WordPress без плагинов
25.02.2026
WordPress оптимизация базы данных: практические советы и примеры
14.11.2025
Как удалить и очистить комментарии в WordPress
18.02.2026
WooCommerce: как избежать проблемы с кешированием и отображением товаров при фильтрации AJAX
16.05.2026
Как отключить Emoji в WordPress: эффективные методы и примеры кода
19.03.2026