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

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

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

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

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

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

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

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

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

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

    $query = new WP_Query($args);

    if (empty($query->posts)) {
        return 'Неактивных вариаций не найдено';
    }

    foreach ($query->posts as $variation_id) {
        wp_delete_post($variation_id, true); // true для безвозвратного удаления
    }

    return count($query->posts) . ' неактивных вариаций удалено';
}

2. Расширение: удаление вариаций без родительского товара

function delete_orphan_variations() {
    global $wpdb;

    $variations = $wpdb->get_col(
        "SELECT p.ID FROM {$wpdb->posts} p
         LEFT JOIN {$wpdb->posts} parent ON p.post_parent = parent.ID
         WHERE p.post_type = 'product_variation'
         AND (parent.ID IS NULL OR parent.post_status != 'publish')"
    );

    if (empty($variations)) {
        return 'Вариаций-сирот не найдено';
    }

    foreach ($variations as $variation_id) {
        wp_delete_post($variation_id, true);
    }

    return count($variations) . ' вариаций-сирот удалено';
}

3. Как запустить функции

Для теста можно добавить вызов функций в файл functions.php темы или в отдельный плагин, но обязательно после загрузки WordPress, например через хук admin_init:

add_action('admin_init', function() {
    if (current_user_can('manage_woocommerce') && isset($_GET['delete_variations'])) {
        echo delete_inactive_variations();
        echo '<br>';
        echo delete_orphan_variations();
        exit;
    }
});

После добавления этого кода наберите в адресной строке админки WooCommerce: https://site.ru/wp-admin/?delete_variations=1, чтобы запустить очистку.

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

  • Перейдите в админку WooCommerce → Товары → Вариации. Убедитесь, что неактивные вариации отсутствуют.
  • Проверьте размер базы данных — таблица wp_posts должна уменьшиться на количество удалённых записей.
  • Сделайте экспорт товаров и убедитесь, что все активные вариации присутствуют.
  • Проверьте работу сайта и скорость загрузки страниц каталога.

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

  • Ошибка: Функции не удаляют вариации.
    Причина: Неправильный статус вариаций или отсутствуют подходящие записи.
    Решение: Проверьте статусы вариаций в базе post_status, можно вывести список var_dump($query->posts); для отладки.
  • Ошибка: Удаление происходит, но потом вариации появляются снова.
    Причина: Импорт или синхронизация автоматически создаёт вариации.
    Решение: Проверьте внешние интеграции и настройки импорта.
  • Ошибка: Ошибка доступа при вызове скрипта.
    Решение: Убедитесь, что запрос выполняет пользователь с правами manage_woocommerce.

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

  • Всегда делайте резервную копию базы перед массовым удалением данных.
  • Запускайте удаление в период низкой нагрузки, чтобы избежать проблем с производительностью.
  • Ограничьте доступ к запуску функции только администраторам или менеджерам магазина.
  • Если у вас много вариаций, используйте постраничную обработку, чтобы не перегружать сервер.
  • Для регулярной очистки можно настроить WP-Cron с функцией удаления по расписанию.

Сравнение подходов: плагин vs код

МетодПлюсыМинусы
Плагин очистки вариаций (например, WP Sweep, Advanced Database Cleaner)Простота использования, интерфейс, автоматизацияМогут удалять лишнее, нагружают базу, риск конфликтов
Код на PHP (как в статье)Точный контроль, настройка под свои задачи, минимальные зависимостиНужны базовые навыки программирования, риски при ошибках в коде
Оптимальные названия для постов и страниц в WordPress
23.01.2026
Как успешно отладить проблемы с отправкой писем из WordPress
28.05.2026
Автоматическое создание резервных копий WordPress без плагинов
30.11.2025
Как удалить удалённых пользователей WordPress по дате их последней активности
19.03.2026
Как создать собственный виджет в WordPress: подробное руководство
25.11.2025