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

Диагностика проблемы: почему нужно удалять неактивные вариации

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

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

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

1. Определение неактивных вариаций

Для начала определим, что считать «неактивной» вариацией. Обычно это вариации, у которых статус private или draft, либо отсутствует запас товара (_stock_status равен outofstock).

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

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

function wpset_delete_inactive_variations() {
    // Получаем вариации с статусом 'draft' или 'private'
    $args = [
        'post_type'      => 'product_variation',
        'post_status'    => ['draft', 'private'],
        'posts_per_page' => -1,
        'fields'         => 'ids',
    ];
    $variations = get_posts($args);

    // Удаляем вариации
    foreach ($variations as $variation_id) {
        wp_delete_post($variation_id, true); // true — без возможности восстановления
    }

    // Дополнительно удаляем вариации с outofstock
    // Получаем все вариации
    $all_variations = get_posts([
        'post_type'      => 'product_variation',
        'post_status'    => 'publish',
        'posts_per_page' => -1,
        'fields'         => 'ids',
    ]);

    foreach ($all_variations as $variation_id) {
        $stock_status = get_post_meta($variation_id, '_stock_status', true);
        if ('outofstock' === $stock_status) {
            wp_delete_post($variation_id, true);
        }
    }
}

// Запускаем функцию через WP-CLI или вручную
// Для автоматизации можно привязать к крону
add_action('wp_scheduled_delete_inactive_variations', 'wpset_delete_inactive_variations');

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

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

if (!wp_next_scheduled('wp_scheduled_delete_inactive_variations')) {
    wp_schedule_event(time(), 'daily', 'wp_scheduled_delete_inactive_variations');
}

Этот код запустит функцию удаления один раз в день.

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

Чтобы убедиться, что код работает:

  • Перейдите в раздел «Товары» → «Вариации» в админке и проверьте, что вариации со статусом draft и private удалены.
  • Проверьте базу данных, выполнив SQL-запрос по таблице wp_posts с фильтром post_type = 'product_variation', чтобы убедиться, что неактивных вариаций больше нет.
  • Включите WP_DEBUG и проверьте логи на наличие ошибок при запуске функции.

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

  • Удаление не происходит: Проверьте, что функция привязана к действию и что WP-Cron работает (проверьте наличие событий через плагин WP Crontrol).
  • Удаляются нужные вариации: Пересмотрите условие в коде, возможно, нужно добавить дополнительные проверки, например, исключить вариации с определенным атрибутом.
  • Ошибки прав доступа: Убедитесь, что пользователь, запускающий код, имеет права на удаление постов.
  • Проблемы с производительностью при большом количестве вариаций: Разбейте удаление на пакеты по 100–200 вариаций за раз и используйте транзиенты для отслеживания прогресса.

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

  • Резервное копирование: Перед автоматическим удалением сделайте резервную копию базы данных.
  • Тестирование на staging-сайте: Проверьте работу функции на копии сайта, чтобы избежать потери данных.
  • Логирование действий: Добавьте логирование ID удаленных вариаций в отдельный файл или в базу для аудита.
  • Оптимизация запросов: Используйте WP_Query с минимальным числом полей для снижения нагрузки.
  • Альтернативы плагинам: В таблице ниже сравним ручной код, использование плагина и их компромисс.

Сравнение способов удаления неактивных вариаций

СпособПреимуществаНедостатки
Код в functions.phpПолный контроль, нет нагрузки плагина, можно кастомизироватьТребует навыков, возможна ошибка при обновлениях темы
Плагин (например, WP Bulk Delete)Простой интерфейс, автоматизация, поддержкаДополнительная нагрузка, ограниченная гибкость
Комбинация: код + плагинГибкость кода + удобство плагинаУвеличение сложности, возможный конфликт
Как удалить ревизии записей в WordPress без плагинов
14.12.2025
Как отключить системные email-уведомления WordPress без плагинов
07.04.2026
Использование хука woocommerce_order_status_changed для автоматизации в WooCommerce
17.04.2026
Как удалить неактуальные transienty в WordPress и оптимизировать кэш
23.03.2026
WooCommerce: установка лимитов на количество товаров в заказе с помощью кода
05.06.2026