Диагностика проблемы: зачем нужно автоматическое удаление товаров по атрибуту
В интернет-магазине на WooCommerce часто возникает необходимость скрыть или удалить из каталога товары, которые не соответствуют определенным критериям — например, устаревшие модели, товары с конкретным атрибутом (цвет, размер, статус) или сезонные позиции. Ручное удаление неэффективно при большом ассортименте. Плагинов для этого много, но они часто перегружают сайт и добавляют лишние зависимости. Решение через код позволяет контролировать процесс и интегрировать логику в существующие процессы обновления товаров.
Как проверить, что товар имеет нужный атрибут
Перед написанием кода важно понять, как WooCommerce хранит атрибуты товаров. Атрибуты — это таксономии с префиксом pa_. Например, атрибут "Цвет" с слагом color будет храниться как таксономия pa_color. Чтобы проверить, какие атрибуты есть у товара и какие термины назначены, используйте следующий код:
global $product;
$attributes = $product->get_attributes();
foreach ( $attributes as $attribute ) {
if ( $attribute->is_taxonomy() ) {
$terms = wp_get_post_terms( $product->get_id(), $attribute->get_name() );
foreach ( $terms as $term ) {
echo $term->name . '<br>';
}
}
}Этот код поможет убедиться, что нужный атрибут и значение есть у товара.
Пошаговое решение: автоматическое удаление товаров по атрибуту
1. Определяем условие удаления
Предположим, нужно удалить из каталога все товары, у которых атрибут pa_color равен красный (slug: red).
2. Создаем функцию для поиска и удаления товаров
Функция будет искать все товары с этим атрибутом и удалять их (или менять статус на "частное"/"черновик", если удаление нежелательно).
function wc_delete_products_by_attribute( $attribute_slug, $term_slug ) {
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
'tax_query' => array(
array(
'taxonomy' => $attribute_slug,
'field' => 'slug',
'terms' => $term_slug,
),
),
'fields' => 'ids',
);
$product_ids = get_posts( $args );
if ( empty( $product_ids ) ) {
return 'Товары не найдены';
}
foreach ( $product_ids as $product_id ) {
wp_delete_post( $product_id, true ); // true - удалить без восстановления
}
return count( $product_ids ) . ' товаров удалено.';
}3. Запускаем функцию вручную или через WP-CLI
Вы можете вызвать эту функцию из файла functions.php вашей темы или из консоли WP-CLI:
echo wc_delete_products_by_attribute( 'pa_color', 'red' );Проверка результата после внедрения
- Перейдите в раздел "Товары" в админке WooCommerce и выполните фильтрацию по атрибуту
Цвет = красный. Товары не должны отображаться. - Проверьте базу данных: в таблице
wp_postsзаписи с post_type = 'product' и удалённым атрибутом отсутствуют. - Если удаляли с помощью смены статуса, проверьте, что товары со статусом
trashилиdraftне видны на сайте.
Частые ошибки и как их исправить
- Ошибка: Не удаляются товары
Причина: неверный слаг таксономии или термина. Проверьте их через админку WooCommerce > Продукты > Атрибуты. - Ошибка: Удаление не происходит, потому что товары защищены
Причина: плагин безопасности или ограничение прав. Запустите функцию под пользователем с ролью администратора. - Ошибка: Продукты удаляются, но не полностью исчезают
Причина: используется мягкое удаление (trash). Для полного удаления укажите второй параметрtrueвwp_delete_post. - Ошибка: Код вызывает ошибку при вызове
Причина: запуск кода вне контекста WordPress. Убедитесь, что функция вызывается внутри WordPress, например, через action hook или WP-CLI.
Практические советы по безопасности и производительности
- Перед массовым удалением создайте резервную копию базы данных.
- Если товаров много, разбивайте удаление на партии с помощью
posts_per_pageи пагинации, чтобы избежать таймаута. - Для временного скрытия товаров используйте смену статуса на «черновик» или «приватный», а не удаление.
- Ограничьте запуск функции только администраторам или через WP-CLI, чтобы избежать случайного запуска.
- Регулярно очищайте корзину удаленных товаров, чтобы не загромождать базу.
Сравнение подходов к автоматическому удалению товаров по атрибуту
| Метод | Плюсы | Минусы |
|---|---|---|
| Плагин (например, Bulk Delete) | Простота использования, UI | Нагрузка на сайт, ограниченная кастомизация |
| Ручной SQL-запрос | Скорость, прямой доступ к данным | Риск повреждения БД, требует опыта SQL |
| PHP-код с wp_delete_post | Гибкость, интеграция в бизнес-логику | Нагрузка при большом объеме, требует тестирования |