Диагностика задачи: зачем и когда нужно массово удалять товары по атрибуту
В WooCommerce часто возникает необходимость удалить сразу группу товаров, обладающих определённым атрибутом. Например, товары с атрибутом цвета "Красный" или размером "XL". Это важно при обновлении ассортимента, очистке каталога или исправлении ошибок импорта. Ручное удаление в админке неудобно и рискованно, особенно если товаров много.
Как определить товары с нужным атрибутом
Атрибуты в WooCommerce хранятся как таксономии с префиксом pa_. Например, атрибут "color" представлен таксономией pa_color. Значения атрибута — термины этой таксономии.
Чтобы получить ID товаров с атрибутом, используйте WP_Query с параметром таксономии:
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'tax_query' => [
[
'taxonomy' => 'pa_color',
'field' => 'slug',
'terms' => 'red', // слаг значения атрибута
],
],
'fields' => 'ids',
];
$query = new WP_Query($args);
$product_ids = $query->posts;Пошаговое решение: скрипт удаления товаров с указанным атрибутом
Пример функции для удаления всех товаров с атрибутом "color" = "red". Код можно добавить в файл functions.php темы или в отдельный плагин. Запускать один раз, затем удалять или комментировать.
function delete_products_by_attribute($taxonomy, $term_slug) {
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'tax_query' => [
[
'taxonomy' => $taxonomy,
'field' => 'slug',
'terms' => $term_slug,
],
],
'fields' => 'ids',
'post_status' => 'publish',
];
$query = new WP_Query($args);
if (empty($query->posts)) {
error_log('Товары с атрибутом не найдены.');
return;
}
foreach ($query->posts as $product_id) {
wp_delete_post($product_id, true); // true — безвозвратно
}
error_log('Удалено товаров: ' . count($query->posts));
}
// Использование:
delete_products_by_attribute('pa_color', 'red');Проверка результата удаления
- В админке WooCommerce проверьте каталог товаров — товары с указанным атрибутом должны исчезнуть.
- В базе данных таблице
wp_postsзаписи с типомproductи удалённые ID должны отсутствовать. - В логах сервера или debug.log должна появиться запись об удалении товаров.
- Можно повторно запустить WP_Query с теми же параметрами — он должен вернуть пустой массив.
Частые ошибки и их исправление
- Пустой результат WP_Query: проверьте правильность таксономии и слага значения атрибута. Атрибуты всегда с префиксом
pa_, а значения — в нижнем регистре и без пробелов. - Товары не удаляются: убедитесь, что функция
wp_delete_postвызывается с параметром$force_delete = trueдля безвозвратного удаления. - Удаление не происходит из-за кеширования: очистите кеш плагина (если есть) и кеш объектного кеширования WordPress.
- Удаление запускается несколько раз: ограничьте вызов функции, например, запускать только по определённому условию или через админский крон.
Практические советы по безопасности и производительности
- Перед удалением обязательно сделайте резервную копию базы данных.
- Для большого количества товаров делайте удаление пакетами (например, по 50 товаров), чтобы избежать превышения лимита времени выполнения скрипта.
- Запуск кода лучше делать в консоли WP-CLI или через REST API с авторизацией администратора.
- Не оставляйте такой код в продакшен-среде без контроля.
Альтернативы: плагин, код и компромиссы
| Вариант | Плюсы | Минусы |
|---|---|---|
| Плагин массового удаления товаров по атрибутам (например, "Bulk Delete") | Удобный UI, не требует кода | Зависимость от сторонних решений, может не покрывать все сценарии |
| Код (как описано в статье) | Максимальный контроль, автоматизация, отсутствие лишних плагинов | Требует навыков, может вызвать баги при ошибках |
| Удаление вручную через фильтрацию товаров в админке | Просто для малого количества товаров | Неэффективно и долго при большом каталоге |