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

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

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

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

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

Неактивные вариации — это вариации, которые:

  • Не используются в заказах и не продаются;
  • Имеют статус «черновик» или «не опубликованы»;
  • Не отображаются на сайте;
  • Их атрибуты не совпадают с текущими параметрами товара.

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

SELECT p.ID, p.post_title FROM wp_posts p
LEFT JOIN wp_woocommerce_order_items oi ON oi.order_item_name = p.post_title
WHERE p.post_type = 'product_variation'
AND p.post_status != 'publish'
AND oi.order_item_name IS NULL;

Этот запрос покажет вариации, которые не опубликованы и не связаны с заказами.

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

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

Шаг 1. Создать функцию для удаления неактивных вариаций

function delete_inactive_product_variations() {
    $args = [
        'post_type'      => 'product_variation',
        'posts_per_page' => -1,
        'post_status'    => ['draft', 'pending', 'private'],
        'fields'         => 'ids',
    ];
    $variations = get_posts($args);

    if (empty($variations)) {
        return 'No inactive variations found.';
    }

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

        if (!$order_count) {
            wp_delete_post($variation_id, true); // Полное удаление
            $deleted++;
        }
    }

    return "Deleted {$deleted} inactive variations.";
}

Шаг 2. Запуск функции вручную или по крону

Для разового запуска добавьте в functions.php или плагин:

add_action('admin_init', function() {
    if (isset($_GET['delete_inactive_variations'])) {
        $result = delete_inactive_product_variations();
        echo '<div class="notice notice-success is-dismissible"><p>' . esc_html($result) . '</p></div>';
    }
});

Затем вызовите в браузере https://site.ru/wp-admin/?delete_inactive_variations=1 (замените site.ru на ваш домен).

Для автоматизации можно добавить WP-Cron событие:

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

add_action('delete_inactive_variations_event', 'delete_inactive_product_variations');

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

  • Перейдите в раздел «Товары → Вариации» — проверьте, что неактивные вариации удалены.
  • Выполните SQL-запрос из раздела диагностики — количество неактивных вариаций должно быть нулевым.
  • Проверьте, что активные вариации и заказы с ними не затронуты.

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

  • Удаляются активные вариации. Проверьте логику проверки заказов и статусов. Не удаляйте вариации с «publish» статусом.
  • Функция не запускается по крону. Убедитесь, что на сайте работает WP-Cron (проверьте wp-cron.php), либо настройте системный cron.
  • Удаление не происходит из-за прав. Проверьте, что скрипт запущен с правами администратора и имеет доступ к базе данных.

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

  • Перед массовым удалением сделайте резервную копию базы данных.
  • Используйте wp_delete_post(..., true) для полного удаления, чтобы не оставлять мусор в БД.
  • Ограничьте запуск функции только для админов, чтобы исключить случайный запуск.
  • Если вариаций много, разбивайте удаление на партии, чтобы избежать таймаутов.

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

ВариантПлюсыМинусыКогда использовать
Ручное удаление в админкеПросто, не требует кодаДолго, ошибочно можно удалить нужные вариацииМалое количество вариаций
Кастомный код с проверкой заказовАвтоматизация, точечное удалениеТребует навыков, возможны ошибки при неправильной логикеСредние и крупные магазины
Плагины очистки WooCommerceУдобный интерфейс, часто расширенные функцииМогут быть платными, не всегда гибкиеДля пользователей без навыков разработки
Как добавить логику в шаблоны WordPress через хуки: практические примеры и советы
19.01.2026
Как создать автоматический импорт отзывов в WordPress с подтверждением
10.03.2026
WooCommerce: автоматическое изменение цен и скидок при импорте продуктов
10.05.2026
WooCommerce: как правильно удалить товар с вариациями из базы данных
31.05.2026
Отладка AJAX запросов в админ-панели WordPress: практическое руководство
06.12.2025

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