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

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

В интернет-магазинах на WooCommerce часто возникает необходимость автоматически скрывать или удалять из каталога товары с определёнными атрибутами. Например, товары с атрибутом "Сезон" = "Зима" после окончания сезона или товары с атрибутом "Статус" = "Снят с продажи". Ручное управление большим количеством товаров неудобно и приводит к ошибкам.

Автоматизация удаления по атрибуту позволяет:

  • Поддерживать актуальность каталога без лишних усилий;
  • Сократить нагрузку на базу данных и ускорить загрузку страниц;
  • Снизить риски ошибок ручного удаления.

Пошаговое решение: удаление товаров с определённым атрибутом через wp-cron

1. Определяем нужный атрибут

Для примера возьмём атрибут pa_status (где pa_ — префикс таксономии для атрибутов WooCommerce) со значением removed.

2. Создаём функцию удаления товаров

function wc_delete_products_by_attribute() {
    $taxonomy = 'pa_status';
    $term_slug = 'removed';

    // Получаем ID термина по слагу
    $term = get_term_by('slug', $term_slug, $taxonomy);
    if (!$term || is_wp_error($term)) {
        return; // Термин не найден
    }

    // Запрос товаров с этим атрибутом
    $args = [
        'post_type' => 'product',
        'posts_per_page' => -1,
        'tax_query' => [
            [
                'taxonomy' => $taxonomy,
                'field' => 'term_id',
                'terms' => $term->term_id,
                'operator' => 'IN'
            ]
        ],
        'fields' => 'ids',
        'post_status' => 'publish',
    ];

    $products = get_posts($args);
    if (empty($products)) {
        return; // Нет товаров для удаления
    }

    // Удаляем товары
    foreach ($products as $product_id) {
        wp_delete_post($product_id, true); // true — безвозвратно
    }
}

3. Добавляем задачу в wp-cron для регулярного запуска

if (!wp_next_scheduled('wc_delete_products_cron_hook')) {
    wp_schedule_event(time(), 'daily', 'wc_delete_products_cron_hook');
}

add_action('wc_delete_products_cron_hook', 'wc_delete_products_by_attribute');

4. Добавляем код в functions.php темы или в отдельный плагин

Рекомендуется создать кастомный плагин, чтобы не потерять код при смене темы.

Проверка результата после внедрения

  • Вручную назначьте атрибут pa_status = removed каким-либо товарам.
  • Запустите функцию вручную через админ-панель, например, через WP CLI:
    wp eval 'wc_delete_products_by_attribute();'
  • Проверьте, что товары удалились без остатков в базе.
  • Через сутки проверьте, что cron сработал и удалил новые товары с этим атрибутом, если они появились.

Частые ошибки и как исправить

  • Термин не найден: убедитесь, что атрибут и значение существуют, проверьте префикс pa_ и слаг термина.
  • Защита от удаления: если товары не удаляются, проверьте права пользователя и наличие плагинов безопасности, которые могут блокировать wp_delete_post.
  • Не срабатывает wp-cron: убедитесь, что на сайте посещаемость достаточная для запуска wp-cron или настройте системный cron.
  • Удаление не навсегда: параметр true во wp_delete_post заставляет удалять без корзины. Для теста можно поставить false и проверить корзину.

Практические советы по безопасности и производительности

  • Всегда делайте резервную копию базы перед массовым удалением товаров.
  • Добавьте логирование удалённых продуктов, чтобы отслеживать действия:
function wc_delete_products_by_attribute() {
    // ... существующий код
    foreach ($products as $product_id) {
        wp_delete_post($product_id, true);
        error_log('Удалён товар ID: ' . $product_id);
    }
}
  • При большом количестве товаров разбивайте удаление на части, чтобы не превышать лимиты памяти и времени выполнения.
  • Не используйте удаление, если хотите просто скрыть товары — лучше изменить статус на private или использовать фильтры для исключения из каталога.

Сравнение вариантов удаления товаров по атрибуту

МетодОписаниеПлюсыМинусы
Ручное удаление через админкуВыбор и удаление товаров вручнуюПросто, без кодаТрудозатратно, ошибки, не подходит для массовых изменений
Плагины автоматизацииАвтоматическое удаление/скрытие по правиламУдобно, готовые UIЗависимость от сторонних плагинов, нагрузка
Код на wp-cron (описанный метод)Автоматическое удаление по атрибуту через собственный кодКонтроль, легковесность, без сторонних плагиновТребует технических навыков, нужно мониторить корректность работы
Как удалить по умолчанию скрипты и стили в WooCommerce для ускорения сайта
13.05.2026
Оптимизация базы данных WordPress: как ускорить сайт и снизить нагрузку
14.11.2025
Как создать собственный шорткод в WordPress
14.11.2025
Как добавить настройки для плагинов в WordPress с примерами кода
22.02.2026
WooCommerce: как автоматически отключать отложенные оплаты при превышении срока
29.05.2026