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

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

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

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

Чаще всего старый контент в WooCommerce удаляют по одним из следующих критериев:

  • Товары, которые не обновлялись более X месяцев (например, 6–12 месяцев).
  • Товары со статусом "черновик" или "в ожидании", которые не публиковались длительное время.
  • Товары без заказов за определённый период.

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

Пошаговое решение: автоматическое удаление товаров по дате последнего обновления

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

function wpreset_delete_old_products() {
    $args = array(
        'post_type'      => 'product',
        'post_status'    => 'publish',
        'date_query'     => array(
            array(
                'column'    => 'post_modified',
                'before'    => '6 months ago',
            ),
        ),
        'fields'         => 'ids',
        'posts_per_page' => -1,
    );

    $old_products = get_posts($args);

    if (!empty($old_products)) {
        foreach ($old_products as $product_id) {
            wp_delete_post($product_id, true); // Полное удаление
        }
    }
}

2. Запускаем функцию через WP-Cron раз в неделю

if (!wp_next_scheduled('wpreset_weekly_delete_old_products')) {
    wp_schedule_event(time(), 'weekly', 'wpreset_weekly_delete_old_products');
}

add_action('wpreset_weekly_delete_old_products', 'wpreset_delete_old_products');

3. Добавляем уведомление в лог (по желанию)

function wpreset_delete_old_products() {
    $args = array(
        'post_type'      => 'product',
        'post_status'    => 'publish',
        'date_query'     => array(
            array(
                'column'    => 'post_modified',
                'before'    => '6 months ago',
            ),
        ),
        'fields'         => 'ids',
        'posts_per_page' => -1,
    );

    $old_products = get_posts($args);

    if (!empty($old_products)) {
        foreach ($old_products as $product_id) {
            wp_delete_post($product_id, true);
        }
        error_log('WPReset: удалено ' . count($old_products) . ' старых товаров WooCommerce');
    }
}

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

  • В админке WooCommerce проверьте раздел «Товары» — товары старше 6 месяцев должны отсутствовать.
  • Просмотрите системный лог PHP (error_log) на предмет сообщений от вашей функции.
  • Можно временно заменить wp_delete_post на error_log('Удаляем товар ID: ' . $product_id); для отладки без удаления.

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

  • Функция не запускается: Проверьте, что WP-Cron включён. Для теста вызовите функцию вручную.
  • Удаляются не все товары: Проверьте правильность date_query — дата берётся из поля post_modified. Если нужно по дате создания, используйте post_date.
  • Удаление не полное: Аргумент wp_delete_post($id, true) отвечает за полное удаление. Если он не true, пост перемещается в корзину.
  • Нагрузка на сервер: При большом количестве товаров делайте удаление пакетами (например, по 50 товаров за запуск).

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

  • Используйте current_user_can('delete_posts'), если вызываете функцию из интерфейса.
  • Для крупных магазинов делайте удаление пакетами, чтобы не перегружать сервер.
  • Резервное копирование базы перед запуском автоматического удаления — обязательно.
  • Добавьте проверку на необходимость удаления только товаров без заказов, если хотите сохранить исторические данные.

Альтернативные методы: сравнение

МетодПреимуществаНедостатки
Самописный WP-Cron скриптГибкость, контроль, нет лишних плагиновТребует навыков программирования, возможно нагрузка
Плагин автоматизации (например, WP Reset с задачами)Простота установки, поддержка, логиМожет быть избыточным, зависит от сторонних обновлений
Ручное удаление через админкуПростота для небольших магазиновНеэффективно при большом объёме, риск ошибок
Как избежать конфликтов между плагинами WordPress: практические советы и примеры
16.02.2026
Как автоматизировать удаление старого контента в WordPress по дате
27.03.2026
Как использовать AJAX в WordPress: практическое руководство с примерами кода
30.11.2025
Как использовать WP-Cron для автоматического удаления старого контента в WordPress
11.05.2026
Как изменить структуру ссылок в WordPress без потери SEO
17.12.2025