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Очень быстро и безопасно для больших сайтовТребует доступа к серверу и знаний консоли
Как создать динамические поля в WordPress через Meta Box с примерами кода
31.03.2026
Как удалить и заблокировать неиспользуемые регистрации в WordPress с форумами
29.04.2026
Как изменить URL автора в WordPress без изменения ссылок постов
05.12.2025
Как создать автоматические резервные копии WordPress без плохой нагрузки на сервер
17.03.2026
WooCommerce: как удалить товар со всеми связями через код без плагинов
22.06.2026