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

Что такое неактивные вариации и почему их нужно удалять

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

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

Диагностика: как понять, что вариаций слишком много и они неактивны

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

  • статусом draft или trash, которые не отображаются на сайте;
  • отсутствием цены или с ценой 0 (если это не бесплатный товар);
  • отсутствием запасов (если используется управление запасами);
  • отсутствием атрибутов или с некорректными данными.

Проверить количество вариаций по статусам можно SQL-запросом к базе данных (через phpMyAdmin или WP CLI):

SELECT post_status, COUNT(*) as count FROM wp_posts WHERE post_type = 'product_variation' GROUP BY post_status;

Если видите много вариаций в статусах draft или trash, это повод для очистки.

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

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

function wpset_delete_inactive_variations() {
    // Параметры для выборки вариаций
    $args = [
        'post_type'      => 'product_variation',
        'post_status'    => ['draft', 'trash'],
        'posts_per_page' => -1,
        'fields'         => 'ids',
    ];

    $variations = get_posts($args);
    if(empty($variations)) {
        return 'Нет неактивных вариаций для удаления';
    }

    $deleted_count = 0;
    foreach($variations as $variation_id) {
        $price = get_post_meta($variation_id, '_price', true);
        // Удаляем только если цена не установлена или 0
        if(empty($price) || $price == 0) {
            wp_delete_post($variation_id, true); // true - принудительное удаление
            $deleted_count++;
        }
    }

    return "Удалено вариаций: {$deleted_count}";
}

// Запуск функции вручную для теста
add_action('admin_init', function() {
    if(current_user_can('administrator') && isset($_GET['delete_inactive_variations'])) {
        $result = wpset_delete_inactive_variations();
        echo '<div class="notice notice-success is-dismissible"><p>' . esc_html($result) . '</p></div>';
    }
});

Для вызова очистки достаточно зайти в админку с параметром ?delete_inactive_variations=1 в URL, например: https://ваш-сайт.ru/wp-admin/?delete_inactive_variations=1

Как проверить, что удаление сработало

  • Повторно выполните SQL-запрос из раздела диагностики — количество вариаций в статусах draft и trash должно уменьшиться.
  • Проверьте в админке WooCommerce — в списке вариаций не должно отображаться удалённых позиций.
  • Просмотрите страницу с сообщением об успешном удалении, если вызываете функцию вручную.

Частые ошибки при удалении вариаций и как их избежать

  • Удаление активных вариаций: Убедитесь, что фильтр выбирает только вариации со статусом draft или trash, иначе можете случайно стереть продающиеся товары.
  • Неудаление из-за кеша: После удаления почистите кеш сайта и браузера, чтобы увидеть обновления.
  • Отсутствие резервной копии: Обязательно сделайте бэкап базы данных перед массовым удалением.
  • Запуск на продакшене без теста: Проверьте код сначала на тестовом сайте.

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

  • Для регулярной автоматизации удалений используйте WP-Cron с таймером, чтобы не запускать всю выборку в пиковую нагрузку.
  • Добавьте логирование удалённых вариаций в отдельный лог-файл для аудита.
  • Используйте wp_delete_post( $post_id, true ) с параметром true для полного удаления, а не перемещение в корзину, чтобы не накапливать мусор.
  • Ограничьте выборку небольшими порциями (posts_per_page 100 или 200), чтобы избежать превышения лимитов памяти.

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

МетодПлюсыМинусыКогда использовать
Ручное удаление через админкуПросто, без кодаМедленно при большом количестве, риск пропускаДля единичных случаев
Код в functions.phpАвтоматизация, точный контрольТребует базовых знаний PHPРегулярная очистка и большие магазины
Плагины оптимизации WooCommerceГотовые решения с интерфейсомМогут быть платными, нагрузкаЕсли нужна комплексная оптимизация
Как защитить WordPress от bruteforce атак с помощью кода
21.02.2026
Как установить и настроить OmniVideo в WordPress
27.01.2026
Как удалить ревизии записей в WordPress без плагинов
14.12.2025
Как удалить неиспользуемые метаполя в WordPress с помощью кода
30.03.2026
WooCommerce: автоматическое удаление заблокированных и неактивных пользователей
18.05.2026