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

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

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

Как определить неактивные вариации товаров

Вариация считается неактивной, если у неё статус private или draft, либо если она отключена (поле menu_order или мета _stock_status может помочь выявить отсутствие наличия). Также можно учитывать дату последнего изменения или наличие продаж.

Пример запроса для поиска неактивных вариаций

$args = [
    'post_type'      => 'product_variation',
    'post_status'    => ['draft', 'private'],
    'posts_per_page' => -1
];
$query = new WP_Query($args);
$variations = $query->posts;

Этот код найдёт все вариации с черновым или приватным статусом.

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

Ниже пример функции, которую можно добавить в functions.php или в кастомный плагин. Она удаляет вариации с указанными статусами и без последних продаж.

function wpgenerate_delete_inactive_variations() {
    $args = [
        'post_type'      => 'product_variation',
        'post_status'    => ['draft', 'private'],
        'posts_per_page' => -1
    ];
    $query = new WP_Query($args);

    foreach ($query->posts as $variation) {
        // Проверим наличие продаж для вариации
        $orders = wc_get_orders([
            'limit'        => 1,
            'status'       => ['completed', 'processing'],
            'meta_key'     => '_product_id',
            'meta_value'   => $variation->ID
        ]);
        if (empty($orders)) {
            wp_delete_post($variation->ID, true); // жёсткое удаление
        }
    }
}

// Запуск по крону или вручную
add_action('init', function() {
    if (isset($_GET['delete_inactive_variations'])) {
        wpgenerate_delete_inactive_variations();
        echo 'Удаление завершено';
        exit;
    }
});

Чтобы запустить удаление, достаточно добавить параметр ?delete_inactive_variations=1 к URL сайта (например, https://example.com/?delete_inactive_variations=1). Рекомендуется запускать это на тестовом сайте или использовать WP-Cron для периодической очистки.

Настройка регулярного запуска через WP-Cron

if (!wp_next_scheduled('wpgenerate_cron_delete_variations')) {
    wp_schedule_event(time(), 'daily', 'wpgenerate_cron_delete_variations');
}
add_action('wpgenerate_cron_delete_variations', 'wpgenerate_delete_inactive_variations');

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

  • В админке WooCommerce откройте список вариаций товара и проверьте, что неактивные вариации удалены.
  • Проверьте базу данных, используя phpMyAdmin или аналог, запросом SELECT * FROM wp_posts WHERE post_type = 'product_variation' AND post_status IN ('draft', 'private'). Результат должен быть пустым или содержать только актуальные вариации.
  • При запуске с параметром ?delete_inactive_variations=1 в браузере вы должны увидеть сообщение «Удаление завершено».

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

  • Неправильный статус вариации: Некоторые вариации могут иметь статус publish, но быть фактически неактивными. Нужно расширить критерии поиска, например, добавить проверку наличия или мета-данных.
  • Удаление активных вариаций: Внимательно проверяйте фильтры, чтобы не удалить активные товары. Используйте логи и резервное копирование перед запуском.
  • Отсутствие прав для удаления: Если код не удаляет, проверьте права пользователя и настройки безопасности хостинга.
  • Пропуск вариаций с заказами: Убедитесь, что проверка заказов по ID вариации реализована корректно. В WooCommerce мета ключи для вариаций в заказах могут отличаться.

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

  • Всегда делайте резервное копирование перед массовым удалением данных.
  • Ограничьте запуск функции только администраторам или по защищённому триггеру.
  • При большом количестве вариаций используйте пакетную обработку — удаляйте по 50-100 штук за один запуск, чтобы избежать таймаутов.
  • Логируйте удалённые вариации для аудита. Например, записывайте ID и дату удаления в отдельный файл или таблицу.
  • Для ускорения запросов создайте индексы в базе на поле post_status и пост-тип.

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

ВариантПлюсыМинусыИспользование
Ручное удаление через админкуПросто, не требует кодаМедленно, риск пропуска вариацийМаленькие магазины
Код с WP_Query и wp_delete_postАвтоматизация, гибкостьТребует навыков, возможны ошибкиСредние и большие магазины
Плагины очистки WooCommerceГотовые решения, интерфейсМогут быть платными, ограничены функционаломБыстрая настройка без кода
Как создать собственный визуальный композитор в WordPress
14.11.2025
Как создать динамический виджет в WordPress с использованием REST API
15.12.2025
WooCommerce: автоматическое создание отзывов после покупки
23.05.2026
Как добавить автоматическое сохранение черновиков в WordPress
30.12.2025
Как установить автоматический редирект в WordPress без плагинов
24.01.2026