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

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

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

Проверить наличие неактивных вариаций можно через SQL-запрос к базе данных или используя фильтры в админке:

SELECT ID, post_title, post_status FROM wp_posts WHERE post_type = 'product_variation' AND post_status = 'publish';

Если вариация имеет статус publish, но не продаётся (например, отсутствует на складе и не продаётся), её стоит отключить, изменив статус на private или draft.

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

Критерии неактивности вариации

Для автоматизации важно определить, когда вариация считается неактивной. Обычно это:

  • Отсутствие на складе (stock_quantity = 0)
  • Отсутствие продаж за последний период (например, 6 месяцев)
  • Статус вариации — publish (активна)

Реализация на PHP с использованием WP-Cron

Пример кода, который проверяет вариации и переводит неактивные в статус draft:

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

add_action('deactivate_inactive_variations_event', 'deactivate_inactive_variations_function');
function deactivate_inactive_variations_function() {
    $args = [
        'post_type' => 'product_variation',
        'post_status' => 'publish',
        'numberposts' => -1
    ];
    $variations = get_posts($args);
    foreach ($variations as $variation_post) {
        $variation = wc_get_product($variation_post->ID);
        if (!$variation) continue;

        // Проверяем наличие на складе
        if ($variation->managing_stock() && $variation->get_stock_quantity() === 0) {
            // Дополнительно можно добавить проверку продаж, если есть мета
            wp_update_post([
                'ID' => $variation_post->ID,
                'post_status' => 'draft'
            ]);
        }
    }
}

Этот код регистрирует ежедневное событие, которое проверяет все опубликованные вариации и переводит в черновики те, у которых запас равен нулю.

Расширение: проверка продаж за период

Чтобы учитывать продажи, можно использовать запрос к таблице заказов WooCommerce wp_woocommerce_order_items и wp_woocommerce_order_itemmeta, проверяя наличие заказов вариации за последние 6 месяцев. Это усложняет код и требует дополнительной оптимизации.

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

Чтобы убедиться, что автоматическое отключение работает:

  1. Создайте тестовую вариацию с запасом 0 и статусом publish.
  2. Запустите вручную функцию из кода (например, временно вызвав deactivate_inactive_variations_function() из админки или в шаблоне).
  3. Проверьте, что статус вариации изменился на draft.
  4. В админке WooCommerce -> Товары -> Вариации убедитесь, что вариация стала невидимой для покупателей.

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

  • Крон не запускается: Убедитесь, что на сайте есть трафик для запуска WP-Cron или настройте системный cronjob для запуска wp-cron.php.
  • Вариации не меняют статус: Проверьте правильность ID вариаций и права пользователя, под которым выполняется код.
  • Удаление активации происходит для нужных вариаций: Проверьте логику проверки запасов, возможно, стоит добавить дополнительные условия.

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

  • Не запускайте массовое обновление постов на каждом заходе пользователя — используйте WP-Cron или внешнее расписание.
  • Кэшируйте результаты запросов, особенно если расширяете проверку продаж.
  • Используйте транзиенты для ограничения частоты запуска тяжелых операций.
  • Резервное копирование базы перед массовыми изменениями статусов.

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

МетодПлагинКодКомпромисс
Отключение вариацийWooCommerce Bulk EditWP-Cron + PHP кодПлагин удобен, но не автоматизирует по условию; код гибче, требует поддержки
Проверка продажПлагины аналитикиSQL-запросы + PHPПлагины дают аналитику, но не отключают; код сложнее, но можно адаптировать
Как избежать конфликтов между плагинами в WordPress
19.11.2025
Реактивный фильтрованный вывод постов в WordPress с AJAX
20.03.2026
Как создать динамические блоки с помощью шорткодов в WordPress
27.12.2025
Как отключить системные email-уведомления WordPress без плагинов
07.04.2026
Как защитить WordPress от bruteforce атак с помощью кода
21.02.2026