WooCommerce: автоматическое удаление старых товаров по расписанию

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

В крупных магазинах на WooCommerce нередко возникает необходимость автоматически удалять товары, которые устарели или больше не актуальны. Причины могут быть разные: сезонные коллекции, распродажи, временные предложения, товары с истекшим сроком годности или снятые с производства позиции. Ручное удаление каждого такого товара — трудоемко и неэффективно, особенно если товаров тысячи.

Автоматизация процесса позволяет поддерживать базу товаров в актуальном состоянии, уменьшить нагрузку на администратора и избежать путаницы для покупателей.

Как определить товары для удаления

Для автоматического удаления нужно четко понимать критерии отбора. Обычно используют одно из следующих условий:

  • Дата публикации товара старше определенного срока;
  • Значение пользовательского поля (custom field) с датой окончания;
  • Статус товара (например, «черновик», «отключен» и прочее);
  • Признак в категории или метке.

В этом примере возьмем условие — все товары, опубликованные более 180 дней назад, будут удалены раз в сутки.

Пошаговое решение: реализация через WP-Cron и WP_Query

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

function wpmart_delete_old_products() {
    $args = array(
        'post_type'      => 'product',
        'posts_per_page' => 50, // лимит на один запуск
        'date_query'     => array(
            array(
                'before' => '180 days ago',
                'inclusive' => true,
            ),
        ),
        'post_status'    => 'publish',
        'fields'         => 'ids',
    );

    $old_products = get_posts($args);

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

    foreach ($old_products as $product_id) {
        wp_delete_post($product_id, true); // принудительное удаление без корзины
    }
}

2. Регистрируем ежесуточное задание WP-Cron

function wpmart_schedule_old_products_deletion() {
    if (!wp_next_scheduled('wpmart_daily_old_products_deletion')) {
        wp_schedule_event(time(), 'daily', 'wpmart_daily_old_products_deletion');
    }
}
add_action('wp', 'wpmart_schedule_old_products_deletion');

add_action('wpmart_daily_old_products_deletion', 'wpmart_delete_old_products');

3. Опционально: добавляем проверку и логирование удаления

function wpmart_delete_old_products() {
    $args = array(
        'post_type'      => 'product',
        'posts_per_page' => 50,
        'date_query'     => array(
            array('before' => '180 days ago', 'inclusive' => true),
        ),
        'post_status'    => 'publish',
        'fields'         => 'ids',
    );

    $old_products = get_posts($args);

    if (empty($old_products)) {
        error_log('WPMart: Нет товаров для удаления');
        return;
    }

    foreach ($old_products as $product_id) {
        if (wp_delete_post($product_id, true)) {
            error_log('WPMart: Удален товар ID ' . $product_id);
        } else {
            error_log('WPMart: Ошибка при удалении товара ID ' . $product_id);
        }
    }
}

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

  • Подождите до следующего запуска cron (обычно в течение суток) или вызовите задачу вручную через do_action('wpmart_daily_old_products_deletion');.
  • Проверьте, что товары старше 180 дней действительно удалились из базы и не отображаются в админке WooCommerce.
  • Проверьте логи ошибок PHP или системный лог, если добавлено логирование, на предмет успешных удалений.
  • Для теста можно временно уменьшить порог с 180 дней до нескольких минут, чтобы проверить работу на реальных данных.

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

  • Задача WP-Cron не запускается: проверьте, что на сайте есть регулярный трафик или настройте системный cron для вызова wp-cron.php. Без этого автоматизация не сработает.
  • Удаление не происходит или удаляются не все товары: убедитесь, что параметры WP_Query корректны, и что нет конфликтов с другими плагинами, блокирующими удаление.
  • Потеря данных из-за удаления: используйте принудительное удаление с осторожностью. Лучше сначала тестировать на копии сайта или с функцией перемещения в корзину (wp_delete_post($id, false)).
  • Проблемы с производительностью при большом количестве товаров: ограничивайте количество товаров на один цикл (например, 50), чтобы не перегружать сервер.

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

  • Не используйте wp_delete_post с параметром $force_delete = true без необходимости — лучше сначала перемещать товары в корзину, чтобы можно было восстановить.
  • Добавьте проверку nonce и прав пользователя, если планируете запускать удаление из интерфейса.
  • Регулярно делайте резервное копирование базы данных перед внедрением автоматических удалений.
  • Используйте транзиенты или опции для контроля прогресса удаления, если товаров много.
  • Для больших магазинов рассмотрите деление удаления на несколько задач по категориям или меткам.

Сравнение вариантов автоматического удаления

МетодПлюсыМинусы
WP-Cron + PHP кодГибкость, нет зависимостей, легко кастомизироватьЗависит от посещаемости сайта, требует навыков программирования
Плагины для удаления товаровПростота установки, интерфейсМожет быть избыточным, нагрузка, не всегда подходит под специфичные условия
Ручное удалениеПолный контрольТрудоемко, риск ошибок и пропусков
Как удалить дублированные страницы в WordPress без плагинов
31.01.2026
Как изменить атрибуты alt и title для изображений в WordPress
10.03.2026
Как удалить или изменить атрибуты img в WordPress без плагинов
19.02.2026
Удаление неиспользуемых шорткодов в WordPress: пошаговое руководство
27.12.2025
Как создать собственный кustomный виджет в WordPress: пошаговое руководство
26.11.2025