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

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

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

  • загромождению базы данных;
  • путанице в админке;
  • ошибкам при синхронизации и отображении товаров на сайте;
  • замедлению работы магазина.
Поэтому важно регулярно чистить устаревшие варианты товаров.

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

Под «старыми» вариантами понимаются варианты, которые:

  • не соответствуют текущим атрибутам товара;
  • не появляются в импортируемом файле или админке;
  • не используются в заказах и не нужны для истории, если это приемлемо.

Для начала нужно проверить, какие варианты сейчас есть и какие должны остаться.

Пошаговое решение: удаление старых вариантов через PHP

Самый надёжный способ — написать кастомный скрипт, который:

  1. получит все вариативные товары;
  2. соберёт ID вариантов, которые должны остаться;
  3. удалит все остальные варианты.

Пример кода для этого:

function delete_old_product_variations( $parent_product_id, $valid_variation_ids ) {
    // Получаем все вариации товара
    $args = array(
        'post_type'      => 'product_variation',
        'post_status'    => array('publish', 'private'),
        'numberposts'    => -1,
        'post_parent'    => $parent_product_id,
        'fields'         => 'ids',
    );
    $variation_ids = get_posts( $args );

    foreach ( $variation_ids as $variation_id ) {
        // Если вариация не в списке валидных, удаляем
        if ( ! in_array( $variation_id, $valid_variation_ids ) ) {
            wp_delete_post( $variation_id, true ); // true - безвозвратно
        }
    }
}

// Пример вызова функции
$parent_id = 123; // ID вариативного товара
$valid_variations = array(456, 789); // ID актуальных вариантов

// Запускаем удаление
delete_old_product_variations($parent_id, $valid_variations);

Этот код можно запустить через WP-CLI, добавить в кастомный плагин или выполнить на странице админки с проверкой безопасности.

Автоматизация для всего магазина

Если нужно очистить все товары, можно собрать ID актуальных вариантов из базы или импортного файла и пройтись по всем вариативным товарам:

function delete_old_variations_all_products( $valid_variations_map ) {
    $args = array(
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'fields'         => 'ids',
        'tax_query'      => array(
            array(
                'taxonomy' => 'product_type',
                'field'    => 'slug',
                'terms'    => 'variable',
            ),
        ),
    );
    $products = get_posts( $args );

    foreach ( $products as $product_id ) {
        $valid_variations = isset( $valid_variations_map[$product_id] ) ? $valid_variations_map[$product_id] : array();
        delete_old_product_variations( $product_id, $valid_variations );
    }
}

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

  • В админке WooCommerce в разделе вариаций выбранного товара не должно быть удалённых вариантов.
  • Запрос к базе данных через phpMyAdmin или WP-CLI:
    SELECT ID FROM wp_posts WHERE post_type = 'product_variation' AND post_parent = <ID_товара>;
    должен возвращать только актуальные ID.
  • Сайт не должен выдавать ошибки при отображении вариаций товаров.

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

  • Удаление нужных вариантов: проверьте правильность списка $valid_variation_ids. Используйте вывод ID до и после удаления.
  • Потеря данных заказов: не удаляйте вариации, которые используются в заказах, иначе могут возникнуть ошибки аналитики и статистики.
  • Ошибки прав доступа: запускайте код под администратором, убедитесь, что сервер позволяет выполнять операции удаления.
  • Кэширование: очистите кэш сайта после удаления, чтобы изменения отразились корректно.

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

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

Сравнение способов удаления старых вариантов

МетодПлюсыМинусыРекомендации
Удаление вручную через админкуПросто, не требует кодаДолго, неудобно при большом количестве товаровПодходит для единичных случаев
Использование плагинов (например, Bulk Variations Manager)Быстро, интерфейсДополнительные зависимости, нагрузкаДля средних магазинов с ограниченным бюджетом
Кастомный код (как в статье)Гибко, без лишних плагинов, автоматизацияТребует навыков программированияЛучший вариант для регулярной чистки и крупных магазинов
Как создать автоматический импорт визиток в WordPress с помощью REST API
30.03.2026
Как удалить или изменить slug таксономии в WordPress без редиректа
23.02.2026
Как решить проблему: не работает фильтрация товаров в WooCommerce
24.06.2026
Использование WP-Cron для автоматического удаления старых записей в WordPress
24.04.2026
Автоматический импорт продуктов из CSV в WooCommerce: пошаговое руководство
17.03.2026