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

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

В WooCommerce вариации (варианты) товаров создаются как дочерние записи типа product_variation, связанных с родительским товаром типа variable. Иногда возникает необходимость массово удалить вариации, например, при смене структуры каталога, очищении «мусорных» вариантов, исправлении ошибок импорта или для оптимизации базы данных. Удаление вручную через админку неудобно и долго, особенно при большом количестве вариаций.

Простой способ — написать PHP-скрипт, который удалит вариации программно, с контролем и возможностью фильтрации.

Как найти ID вариаций и проверить их количество

Перед удалением нужно убедиться, что мы правильно определяем вариации для удаления.

global $wpdb;

$product_id = 123; // ID вариативного товара

$variations = $wpdb->get_col($wpdb->prepare(
    "SELECT ID FROM {$wpdb->posts} WHERE post_parent = %d AND post_type = 'product_variation' AND post_status != 'trash'",
    $product_id
));
echo 'Найдено вариаций: ' . count($variations);
print_r($variations);

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

Пошаговое решение: удаление вариаций через WP-функции

Удалять нужно через функцию wp_delete_post() с параметром $force_delete = true, чтобы удалить пост без перемещения в корзину.

function wc_delete_product_variations( $product_id ) {
    $variations = get_children([
        'post_parent' => $product_id,
        'post_type'   => 'product_variation',
        'post_status' => ['publish', 'private', 'pending', 'draft']
    ]);

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

    foreach ( $variations as $variation ) {
        wp_delete_post( $variation->ID, true );
    }

    return 'Удалено вариаций: ' . count($variations);
}

// Пример вызова
echo wc_delete_product_variations(123);

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

Удаление вариаций по условию

Если нужно удалить вариации с определённым атрибутом, можно добавить фильтрацию:

function wc_delete_variations_by_attribute( $product_id, $attribute_slug, $attribute_value ) {
    $variations = get_children([
        'post_parent' => $product_id,
        'post_type'   => 'product_variation',
        'post_status' => ['publish', 'private']
    ]);

    $deleted_count = 0;

    foreach ( $variations as $variation ) {
        $variation_id = $variation->ID;
        $terms = wp_get_post_terms( $variation_id, 'pa_' . $attribute_slug );

        foreach ( $terms as $term ) {
            if ( $term->slug === $attribute_value ) {
                wp_delete_post( $variation_id, true );
                $deleted_count++;
                break;
            }
        }
    }

    return 'Удалено вариаций с атрибутом ' . $attribute_value . ': ' . $deleted_count;
}

// Пример: удалить все вариации с цветом red
echo wc_delete_variations_by_attribute( 123, 'color', 'red' );

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

  • Перейдите в админку WooCommerce, откройте товар 123. Вкладка вариаций должна быть пустой.
  • Повторно выполните код для подсчёта вариаций — должен вернуть 0.
  • Через базу данных проверьте, что для post_parent = 123 нет записей с типом product_variation.

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

  • Вариации не удаляются: проверьте, что используете wp_delete_post($id, true) с параметром true. Без него пост попадёт в корзину, и может казаться, что удаление не произошло.
  • Удаляются не те вариации: убедитесь, что правильно указали post_parent и фильтры по атрибутам.
  • Ошибка при попытке получить вариации: возможно, в базе нестандартные статусы или типы постов. Используйте расширенный запрос с перечислением статусов.
  • Проблемы с правами пользователя: код должен запускаться с правами администратора или через WP-CLI, иначе удаление заблокируется.

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

  • Перед массовым удалением сделайте резервную копию базы данных.
  • Для удаления вариаций большого количества товаров используйте WP-CLI, чтобы избежать тайм-аутов PHP.
  • Проверяйте нагрузку на сервер при массовых операциях, лучше делать пакетами по 50-100 вариаций.
  • Добавляйте проверку nonce и прав пользователя, если делаете интерфейс удаления в админке.
  • Если часто требуется подобная очистка, рассмотрите создание собственного плагина с журналированием удалений.

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

МетодПлюсыМинусыПример
Удаление вручную через админкуПростота, визуальный контрольДолго при большом количестве, нет автоматизацииWooCommerce > Товары > Вариации
SQL-запросы напрямую в базеСкорость, можно массовоРиск повреждения данных, нет очистки связанных метаданныхDELETE FROM wp_posts WHERE post_type = 'product_variation' AND post_parent = 123;
PHP-код с wp_delete_post()Безопасно, корректно удаляет все связиМедленнее, требует программированияПример из статьи
Как создать динамическую форму обработки данных в WordPress с примером кода
13.02.2026
Как использовать хук woocommerce_order_status_changed для автоматизации в WooCommerce
31.05.2026
Автоматическое отключение отзывов для отдельных товаров WooCommerce
03.06.2026
Как использовать хук woocommerce_before_calculate_totals для изменения цены товаров в WooCommerce
25.04.2026
Как правильно использовать сети REST API в WordPress для сложных проектов
07.01.2026