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

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

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

Реалистичное решение — написать PHP-скрипт, который по заданному атрибуту найдёт все вариативные товары и удалит их вместе с вариациями и метаданными, сохранив целостность базы.

Как найти вариативные товары по атрибуту в WooCommerce

В WooCommerce атрибуты товаров хранятся в таксономиях с префиксом pa_, например, pa_color или pa_size. Чтобы получить ID вариативных товаров, у которых установлен определённый атрибут, нужно:

  1. Выполнить запрос WP_Query с аргументом tax_query для выбранного термина атрибута.
  2. Отфильтровать товары по типу variable.
$args = [
    'post_type' => 'product',
    'posts_per_page' => -1,
    'tax_query' => [
        [
            'taxonomy' => 'pa_color', // замените на нужный атрибут
            'field'    => 'slug',
            'terms'    => 'red',       // замените на нужное значение атрибута
        ],
    ],
    'meta_query' => [
        [
            'key' => '_product_type',
            'value' => 'variable',
            'compare' => '=',
        ],
    ],
];
$query = new WP_Query($args);
$product_ids = wp_list_pluck($query->posts, 'ID');

Обратите внимание: параметр _product_type в мета-запросе не работает по умолчанию, поэтому для фильтрации по типу товара используйте 'post_type' => 'product' и проверяйте тип поста через get_post_type() или используйте фильтр wc_get_product_type() после выборки.

Пошаговое решение: скрипт для удаления вариативных товаров по атрибуту

Ниже пример рабочего кода, который:

  • Получает все вариативные товары с нужным атрибутом.
  • Удаляет все вариации каждого товара.
  • Удаляет сам вариативный товар.
function delete_variable_products_by_attribute($attribute_taxonomy, $term_slug) {
    $args = [
        'post_type' => 'product',
        'posts_per_page' => -1,
        'tax_query' => [
            [
                'taxonomy' => $attribute_taxonomy,
                'field'    => 'slug',
                'terms'    => $term_slug,
            ],
        ],
    ];

    $query = new WP_Query($args);
    if (!$query->have_posts()) {
        return 'Товары с таким атрибутом не найдены';
    }

    foreach ($query->posts as $product_post) {
        $product = wc_get_product($product_post->ID);
        if (!$product || 'variable' !== $product->get_type()) {
            continue; // пропускаем не вариативные товары
        }

        // Удаляем вариации
        $variations = $product->get_children();
        foreach ($variations as $variation_id) {
            wp_delete_post($variation_id, true); // true — удалить без корзины
        }

        // Удаляем сам вариативный товар
        wp_delete_post($product->get_id(), true);
    }

    return 'Удаление завершено';
}

// Пример вызова
// echo delete_variable_products_by_attribute('pa_color', 'red');

Этот код можно запускать из файла темы (functions.php) или через плагин для управления сниппетами.

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

  • В админке WooCommerce перейдите в «Товары» и примените фильтр по атрибуту (например, цвет «red»). Все вариативные товары с этим атрибутом должны исчезнуть.
  • Проверьте базу данных, например через phpMyAdmin, по таблицам wp_posts (post_type = 'product' и 'product_variation') — записи с указанным атрибутом должны отсутствовать.
  • Обновите страницу магазина — удалённые товары не должны отображаться.

Частые ошибки и как их избежать

  • Удаление не тех товаров: неверно указан атрибут или термин. Проверьте точное имя таксономии и slug термина через раздел «Атрибуты» в админке.
  • Удаление только вариаций, без основного товара: в коде надо явно удалять и вариации, и сам товар.
  • Удаление не всех вариаций: убедитесь, что функция get_children() возвращает все вариации; если нет, используйте прямой SQL-запрос по post_parent.
  • Переполнение памяти или тайм-аут при большом количестве товаров: делайте удаление пакетами, используя пагинацию WP_Query или WP CLI.

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

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

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

МетодПреимуществаНедостатки
Ручное удаление через админкуПростота, не требует кодаМедленно, риск пропуска товаров
Плагины массового удаленияАвтоматизация, удобный интерфейсМожет нагружать сайт, не всегда точное удаление вариаций
Скрипт на PHP (как в статье)Точный контроль, быстро, без лишних плагиновТребует навыков, риск ошибки без тестирования
WP CLIОчень быстро и безопасно для больших сайтовТребует доступа к серверу и знаний консоли
WooCommerce: как удалить товар и все его данные через код без плагинов
08.05.2026
Как отключить пагинацию в WordPress без плагинов
25.02.2026
WooCommerce: как удалить товар и все его данные через код без плагинов
15.05.2026
WooCommerce: автоматическое удаление заказов по статусу и времени через код
19.06.2026
Как использовать WPRemark для автоматического сбора отзывов в WordPress
18.02.2026