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

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

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

Чаще всего удаляют товары по двум параметрам:

  • Дата создания или последнего обновления товара — удалять товары старше определенного периода;
  • Статус товара — удалять черновики, неактивные или товары с определенным статусом.

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

1. Создаем WP-Cron задачу для периодического запуска

Для автоматизации используем встроенную систему планировщика заданий WordPress — WP-Cron. Добавим событие, которое будет запускаться ежедневно.

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

2. Функция удаления товаров по параметрам

Определим функцию, которая будет искать и удалять товары старше 90 дней с определенными статусами (например, 'draft' и 'private').

function wpr_delete_old_products() {
    $args = [
        'post_type' => 'product',
        'post_status' => ['draft', 'private'],
        'date_query' => [
            [
                'column' => 'post_date',
                'before' => '90 days 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); // true — полный удаление без перемещения в корзину
        }
    }
}
add_action('wpr_delete_old_products_cron', 'wpr_delete_old_products');

3. Очистка WP-Cron при деактивации плагина или темы

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

function wpr_remove_cron_event() {
    $timestamp = wp_next_scheduled('wpr_delete_old_products_cron');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpr_delete_old_products_cron');
    }
}
register_deactivation_hook(__FILE__, 'wpr_remove_cron_event');

Как проверить, что автоматическое удаление работает

  1. Добавьте несколько тестовых товаров с нужным статусом (draft или private) и датой создания более 90 дней назад (можно изменить дату вручную через базу или плагин для управления датами постов).
  2. Запустите WP-Cron вручную с помощью плагина WP Crontrol или вызовите функцию wpr_delete_old_products() напрямую через консоль WP-CLI или временный вызов в теме.
  3. Проверьте, что товары удалились из админки WooCommerce и отсутствуют в базе (таблица wp_posts).
  4. Убедитесь, что в логе ошибок нет предупреждений или ошибок.

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

  • Товары не удаляются: возможно, WP-Cron не запускается из-за низкого трафика. Решение — настроить системный cron на сервере или запускать вручную через WP-CLI.
  • Удаляются не те товары: проверьте параметры post_status и date_query, убедитесь, что даты и статусы соответствуют.
  • Проблемы с правами доступа: убедитесь, что пользователь, под которым выполняется скрипт, имеет права на удаление записей.
  • Удаление замедляет сайт: если товаров много, разбейте удаление на партии по 20-50 штук за один запуск.

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

  • Используйте wp_delete_post($post_id, true) с параметром true для полного удаления без перемещения в корзину, чтобы не засорять базу.
  • Регулярно создавайте резервные копии перед автоматическим удалением, чтобы избежать потери данных.
  • Для больших магазинов используйте отложенное удаление по частям, чтобы избежать таймаутов.
  • Проверяйте логи ошибок и активируйте WP_DEBUG на тестовом сервере перед внедрением.

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

Метод Плюсы Минусы Применимость
WP-Cron + кастомный код (как в статье) Гибко, бесплатно, без плагинов, можно подстроить под любые условия Зависит от WP-Cron, требует навыков разработки Подходит для разработчиков и опытных администраторов
Плагины очистки WooCommerce (например, WP Reset) Удобный интерфейс, быстрый запуск, готовые функции Может удалять больше, чем нужно, есть риск потери важных данных Для пользователей без навыков программирования, но с рисками
Ручное удаление через админку Простота, контроль Трудозатратно, не подходит для больших объемов Малые магазины с небольшим каталогом
Как использовать WPReset для быстрого восстановления базы данных WordPress
11.09.2026
Как удалить все записи WordPress одной кнопкой
11.09.2026
Оптимизация базы данных WordPress при больших объемах данных
28.09.2026
Как отключить дубли страниц в robots.txt и canonical в WordPress
23.08.2026
Как очистить базу данных WordPress от мусора и удалённых остатков
11.09.2026