Как автоматически удалить вариации товаров 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 через админкуПростой запуск, подходит для небольшого количества вариацийРиск таймаутов, нагрузка на сервер
Плагины очисткиУдобный интерфейс, дополнительные функции оптимизацииИногда дорогие, лишние зависимости
⭐⭐⭐⭐⭐