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

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

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

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

Для начала нужно четко задать критерии отбора вариаций:

  • Вариации с нулевым остатком (stock_quantity = 0)
  • Вариации без продаж за последний год
  • Вариации с определённым значением атрибута (например, цвет «черный»)
  • Вариации, отключённые в админке (post_status != 'publish')

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

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

1. Создаем WP-CLI команду для массового удаления

WP-CLI позволяет запускать скрипты из командной строки, что удобно для больших сайтов.

if ( defined( 'WP_CLI' ) && WP_CLI ) {
    WP_CLI::add_command( 'wc-clear-variations', function() {
        $args = [
            'post_type' => 'product_variation',
            'posts_per_page' => -1,
            'meta_query' => [
                [
                    'key' => '_stock_status',
                    'value' => 'outofstock',
                ],
            ],
            'fields' => 'ids',
        ];

        $variations = get_posts( $args );
        $count = 0;

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

        WP_CLI::success( "Удалено $count вариаций с нулевым запасом." );
    } );
}

2. Используем PHP скрипт для удаления вариаций по атрибуту

Если нужна фильтрация по атрибуту, например, цвет «черный» (slug black):

$args = [
    'post_type' => 'product_variation',
    'posts_per_page' => -1,
    'tax_query' => [
        [
            'taxonomy' => 'pa_color',
            'field' => 'slug',
            'terms' => 'black',
        ],
    ],
    'fields' => 'ids',
];

$variations = get_posts( $args );

foreach ( $variations as $variation_id ) {
    wp_delete_post( $variation_id, true );
}
echo 'Удалены вариации с цветом черный: ' . count( $variations );

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

  • Зайдите в админку WooCommerce → Товары → Вариации, убедитесь, что выбранные вариации отсутствуют.
  • Выполните SQL-запрос для проверки остатка вариаций:
    SELECT COUNT(*) FROM wp_posts WHERE post_type = 'product_variation';
  • Проверьте логи ошибок для отсутствия сбоев во время удаления.
  • Если запускали WP-CLI, убедитесь, что вывод команды подтверждает количество удалённых вариаций.

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

  • Ошибка: Вариации не удаляются — проверьте права доступа, скрипт должен запускаться с достаточными правами администратора или через WP-CLI.
  • Ошибка: Удаляются не те вариации — перепроверьте условия выборки, иногда атрибуты могут иметь другой slug, или мета-ключи отличаются.
  • Ошибка: Ошибка памяти при массовом удалении — разбейте удаление на партии по 100-200 вариаций или используйте WP-CLI для управления ресурсами.
  • Ошибка: Потеря связей — не удаляйте вариации без резервного копирования, всегда делайте бэкап базы перед массовыми изменениями.

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

  • Перед удалением сделайте полный бэкап базы.
  • Запускайте операции удаления при минимальной нагрузке на сервер, например, ночью.
  • Используйте WP-CLI для больших объёмов, так как он эффективнее и не зависит от таймаутов веб-сервера.
  • После удаления запустите оптимизацию базы данных (например, с помощью плагина Clearfy Pro) для очистки мусора и ускорения запросов.
  • Если вариаций много, используйте пагинацию в запросах, чтобы не перегружать память:
$paged = 1;
do {
    $args['posts_per_page'] = 100;
    $args['paged'] = $paged;
    $variations = get_posts( $args );
    foreach ( $variations as $variation_id ) {
        wp_delete_post( $variation_id, true );
    }
    $paged++;
} while ( count( $variations ) > 0 );

Сравнение способов удаления вариаций WooCommerce

МетодПлюсыМинусы
WP-CLI скриптБыстрое выполнение, без таймаутов, подходит для больших сайтовТребует доступа к серверу и навыков командной строки
PHP через админкуПростой запуск, подходит для небольшого количества вариацийРиск таймаутов, нагрузка на сервер
Плагины очисткиУдобный интерфейс, дополнительные функции оптимизацииИногда дорогие, лишние зависимости
Как автоматически обновлять плагины WordPress без рисков
12.03.2026
Как создать автоматическое отображение связанных постов в WordPress
20.02.2026
Как создать автоматический импорт атрибутов в WooCommerce с помощью кода
04.04.2026
Как создать настройку мультиязычности в WordPress без плагинов
25.01.2026
Как автоматически отключить неиспользуемые плагины в WooCommerce
20.04.2026