WooCommerce: автоматическое удаление неиспользуемых вариаций товаров после продажи

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

Магазины на WooCommerce часто сталкиваются с тем, что после продажи вариаций товаров остаются в базе без активности. Эти «мертвые» вариации накапливаются и приводят к замедлению работы сайта и усложнению управления каталогом. Проблема особенно заметна при большом количестве товаров с вариациями (цвет, размер и т.п.), когда многие варианты больше не актуальны.

Как понять, что вариации неиспользуемые? Основные признаки:

  • Вариации не продаются длительное время (например, более 6 месяцев);
  • Отсутствуют заказы с этими вариациями;
  • В пользовательских фильтрах и страницах товара вариации не отображаются;
  • Администратор магазина не планирует пополнять эти вариации или обновлять их.

Пошаговое решение: автоматическое удаление неиспользуемых вариаций через код

1. Создаем функцию для поиска неиспользуемых вариаций

Основной критерий — вариации, у которых нет связанных заказов и которые были созданы или обновлены более 6 месяцев назад. Используем WP_Query и прямые запросы к базе для проверки заказов.

function get_unused_variations( $months = 6 ) {
    global $wpdb;
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$months} months"));

    // Получаем ID вариаций товаров (post_type = 'product_variation') старше даты
    $args = [
        'post_type'      => 'product_variation',
        'post_status'    => 'publish',
        'date_query'     => [
            ['before' => $date_threshold],
        ],
        'fields'         => 'ids',
        'posts_per_page' => -1,
    ];
    $variations = get_posts( $args );

    $unused_variations = [];

    foreach ( $variations as $var_id ) {
        // Проверяем, есть ли заказы с данной вариацией
        $order_items = $wpdb->get_var( $wpdb->prepare(
            "SELECT COUNT(oi.order_item_id) FROM {$wpdb->prefix}woocommerce_order_items oi
            
            INNER JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim ON oi.order_item_id = oim.order_item_id
            WHERE oi.order_item_type = 'line_item' AND oim.meta_key = '_variation_id' AND oim.meta_value = %d",
            $var_id
        ));

        if ( !$order_items ) {
            $unused_variations[] = $var_id;
        }
    }
    return $unused_variations;
}

2. Функция удаления найденных вариаций

Для удаления используем стандартную функцию wp_delete_post с параметром true для полного удаления без перемещения в корзину.

function delete_unused_variations( $variation_ids ) {
    foreach ( $variation_ids as $var_id ) {
        wp_delete_post( $var_id, true );
    }
}

3. Запускаем процесс очистки по расписанию (WP-Cron)

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

add_action( 'wp_loaded', function() {
    if ( ! wp_next_scheduled( 'delete_unused_variations_cron' ) ) {
        wp_schedule_event( time(), 'monthly', 'delete_unused_variations_cron' );
    }
});

add_action( 'delete_unused_variations_cron', function() {
    $unused = get_unused_variations(6); // 6 месяцев
    if ( ! empty( $unused ) ) {
        delete_unused_variations( $unused );
    }
});

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

  • Запустите функцию вручную через WP-CLI или временно добавьте вызов в functions.php и проверьте, что вариации удалились.
  • Посмотрите в админке WooCommerce — количество вариаций уменьшилось.
  • Проверьте журнал заказов — не должно быть удалено вариаций с заказами.
  • Мониторьте скорость загрузки страниц с товарами до и после очистки.

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

  • Удаление вариаций с активными заказами: может случиться, если запрос к базе не учитывает все статусы заказов. Решение — убедиться, что проверка заказов учитывает только завершённые и оплаченные заказы.
  • Не срабатывает WP-Cron: часто из-за отсутствия посещений сайта или блокировок. Для надежности используйте системный cron или запускайте вручную.
  • Удаление не тех вариаций: проверьте логику даты и условия выборки, убедитесь, что дата обновления вариации корректно отображает актуальность.
  • Проблемы с производительностью запроса: при большом количестве вариаций запросы могут быть медленными. Оптимизируйте через индексы в базе и ограничение выборки по частям.

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

  • Перед автоматическим удалением создавайте резервные копии базы данных.
  • Добавьте логирование удаляемых вариаций для возможности отката.
  • Разбейте процесс удаления на партии по 50-100 вариаций, чтобы избежать таймаутов.
  • Используйте транзакции базы данных при массовом удалении для целостности данных.
  • Для запуска WP-Cron используйте альтернативные методы, например, системный cron на сервере.

Сравнение вариантов удаления неиспользуемых вариаций

МетодПлюсыМинусыКогда использовать
Ручное удаление через админку Простой контроль Трудоемко при большом количестве Малые магазины, редкие очистки
Автоматическое удаление через WP-Cron + код Автоматизация, масштабируемость Нужна внимательная настройка и тестирование Средние и крупные магазины с большим каталогом
Плагины очистки WooCommerce Готовые решения, UI Иногда избыточны, влияют на производительность Для тех, кто не хочет программировать
Как удалить старые метаданные в WordPress быстро и безопасно
25.03.2026
WooCommerce: как реализовать авторизацию через SMS без плагинов
01.07.2026
Как избежать конфликтов между плагинами WordPress
07.04.2026
WooCommerce: автоматическое удаление неиспользуемых вариаций товаров через код
26.05.2026
Логика оценки продуктивности в WordPress: практическое руководство с примерами
31.12.2025