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

Почему важно удалять неактивные вариации товаров в WooCommerce

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

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

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

В WooCommerce вариации — это дочерние товары с типом product_variation, связанные с родительским товаром. Неактивные вариации обычно имеют статус draft, pending или private, либо отсутствуют в каталоге, но остаются в базе.

Для диагностики можно выполнить SQL-запрос для подсчёта таких вариаций:

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'product_variation' AND post_status IN ('draft', 'pending', 'private');

Если число значительное, стоит автоматизировать их удаление.

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

1. Создаём PHP-функцию в functions.php вашей темы или в кастомном плагине

function wc_delete_inactive_variations() {
    global $wpdb;
    // Получаем ID неактивных вариаций (статус draft, pending, private)
    $variations = $wpdb->get_col(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'product_variation' AND post_status IN ('draft', 'pending', 'private')"
    );

    if (empty($variations)) {
        return;
    }

    foreach ($variations as $variation_id) {
        wp_delete_post($variation_id, true); // Без возможности восстановления
    }
}

2. Подключаем функцию к Cron для автоматизации

Добавляем событие, например, на еженедельное выполнение:

if (!wp_next_scheduled('wc_delete_inactive_variations_event')) {
    wp_schedule_event(time(), 'weekly', 'wc_delete_inactive_variations_event');
}

add_action('wc_delete_inactive_variations_event', 'wc_delete_inactive_variations');

3. Регистрируем событие при деактивации темы или плагина

function wc_delete_inactive_variations_deactivation() {
    wp_clear_scheduled_hook('wc_delete_inactive_variations_event');
}
register_deactivation_hook(__FILE__, 'wc_delete_inactive_variations_deactivation');

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

1. Запустите функцию вручную для теста:

wc_delete_inactive_variations();

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

3. В админке WooCommerce в разделе товаров убедитесь, что неактивные вариации исчезли.

4. Проверьте логи ошибок PHP — скрипт не должен вызывать предупреждений.

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

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

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

  • Перед удалением сделайте резервную копию базы.
  • Используйте wp_delete_post($id, true), чтобы удалить вариации без перемещения в корзину и экономить место.
  • Добавьте ограничение на количество удалений в одном запуске, например:
function wc_delete_inactive_variations_limited($limit = 50) {
    global $wpdb;
    $variations = $wpdb->get_col(
        $wpdb->prepare(
            "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'product_variation' AND post_status IN ('draft','pending','private') LIMIT %d",
            $limit
        )
    );
    if (empty($variations)) {
        return;
    }
    foreach ($variations as $variation_id) {
        wp_delete_post($variation_id, true);
    }
}
  • Регулярно мониторьте базу на предмет неактивных вариаций — это поможет избежать накопления большого количества удаляемых элементов.
  • Для больших магазинов используйте WP CLI для выполнения удаления пакетами вне веб-запросов.

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

МетодПлюсыМинусы
Ручное удаление в админкеПросто, без кодаТрудоёмко, подходит только для малого количества вариаций
Плагин для очистки базыАвтоматизация, удобствоДополнительная нагрузка, риск конфликтов, лицензии
Кодовое решение через Cron (как в статье)Контроль, лёгкость кастомизации, без лишних плагиновТребует навыков разработки, настройка Cron
WooCommerce: как автоматически удалять старые нераскрытые заказы по дате
19.05.2026
WooCommerce: автоматическое удаление неактивных вариаций товаров
31.05.2026
WooCommerce: оптимальные настройки для очистки базы от старого кода и данных
28.05.2026
Как создать автоматическое отправление email при новом комментарии в WordPress
21.02.2026
Как удалить неактивных пользователей WordPress с помощью скрипта
17.01.2026