WooCommerce: как автоматически удалять товары из каталога по атрибуту без плагинов

Диагностика проблемы: зачем нужно автоматическое удаление товаров по атрибуту

В интернет-магазине на 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Гибкость, интеграция в бизнес-логикуНагрузка при большом объеме, требует тестирования
Удаление старых ревизий записей в WordPress для оптимизации базы данных
10.02.2026
Как создать автоматический импорт продуктов в WooCommerce из внешнего источника
07.02.2026
Оптимизация кода WordPress: как найти и удалить неиспользуемые хуки
24.01.2026
Как установить и настроить защиту от bruteforce-атак в WordPress без плагинов
21.04.2026
Как создать автоматические сборки контента в WordPress
01.03.2026