Диагностика задачи: зачем удалять варианты товаров по условию
В WooCommerce часто возникает необходимость массово удалять вариации товаров по разным причинам — устаревшие комбинации, некорректные опции, освобождение места, очистка каталога. Делать это вручную через админку неудобно и долго, особенно если вариантов сотни или тысячи. Автоматизация через код — оптимальный вариант при условии правильной настройки.
Как определить варианты для удаления
Перед удалением нужно четко определить критерии — по атрибутам, цене, наличию на складе, статусу и т.п. Пример условий:
- Варианты с ценой ниже минимальной границы.
- Варианты с определенным атрибутом (например, цвет «красный»).
- Варианты без остатка на складе.
Пример запроса для выборки вариантов по атрибуту
$args = [
'post_type' => 'product_variation',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => 'attribute_pa_color',
'value' => 'red',
'compare' => '=',
],
],
];
$variations = get_posts($args);Здесь attribute_pa_color — так хранится атрибут "цвет".
Пошаговое решение: удаление вариантов через код
1. Создайте дочернюю тему или используйте плагин для пользовательских функций.
2. Добавьте код для выборки вариантов по условию и удаления через функцию wp_delete_post(). Пример:
function delete_variations_by_condition() {
$args = [
'post_type' => 'product_variation',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => 'attribute_pa_color',
'value' => 'red',
'compare' => '=',
],
],
];
$variations = get_posts($args);
if (empty($variations)) {
error_log('No variations found for deletion.');
return;
}
foreach ($variations as $variation) {
wp_delete_post($variation->ID, true); // true — принудительное удаление без корзины
}
error_log(count($variations) . ' variations deleted successfully.');
}
// Запускаем функцию вручную или через WP-CLI
// delete_variations_by_condition();3. Запустите функцию один раз, например, подключив её к временному хуку или через WP-CLI, чтобы избежать повторных удалений.
Проверка результата
- Перейдите в админку WooCommerce — раздел "Вариации" товара и убедитесь, что нужные вариации отсутствуют.
- Проверьте логи (если включено) на сообщения об удалении.
- Используйте
get_postsс тем же условием — должен вернуть пустой массив.
Частые ошибки и как их исправить
- Неправильный ключ мета-данных атрибута. В WooCommerce атрибуты вариаций сохраняются с префиксом
attribute_pa_+ slug атрибута. Проверьте точное имя через базу или отладку. - Удаление не всех вариантов. Проверьте параметры запроса
get_posts, особенно'posts_per_page' => -1. По умолчанию возвращается 5. - Удаление без прав администратора. Запускайте код под пользователем с правами на удаление постов.
- Функция запускается несколько раз. Лучше запускать из WP-CLI или временно, иначе дублируется удаление.
Практические советы по безопасности и производительности
- Всегда делайте резервную копию базы данных перед массовым удалением.
- Отключайте функцию после использования, чтобы не запускалась повторно.
- Используйте WP-CLI для запуска скриптов с большими объемами данных — это быстрее и безопаснее.
- Для сложных условий используйте
WP_Queryс правильными мета-запросами и индексами базы.
Сравнение удаления вариантов: код vs плагины
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Ручное удаление | Просто, без кода | Медленно, риск ошибок при большом объеме | Подходит для малых каталогов |
| Плагины массового редактирования | Удобный интерфейс, фильтры | Могут нагружать сайт, не все бесплатны | Хорошо для частых операций |
| Код (wp_delete_post) | Гибкость, автоматизация, интеграция с WP-CLI | Требует навыков, риски при ошибках | Лучший вариант для разработчиков и больших сайтов |