Диагностика задачи: зачем массово удалять вариативные товары по атрибуту
В интернет-магазинах на WooCommerce часто возникает ситуация, когда нужно быстро удалить множество вариативных товаров, например, из-за устаревших коллекций, смены поставщика или ошибок в атрибутах. Ручное удаление через админку неудобно, особенно если таких товаров сотни. Однако стандартных инструментов для массового удаления вариативных товаров по конкретному атрибуту нет, а плагины часто оказываются тяжёлыми или ненадёжными.
Реалистичное решение — написать PHP-скрипт, который по заданному атрибуту найдёт все вариативные товары и удалит их вместе с вариациями и метаданными, сохранив целостность базы.
Как найти вариативные товары по атрибуту в WooCommerce
В WooCommerce атрибуты товаров хранятся в таксономиях с префиксом pa_, например, pa_color или pa_size. Чтобы получить ID вариативных товаров, у которых установлен определённый атрибут, нужно:
- Выполнить запрос WP_Query с аргументом
tax_queryдля выбранного термина атрибута. - Отфильтровать товары по типу
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 | Очень быстро и безопасно для больших сайтов | Требует доступа к серверу и знаний консоли |