Автоматическое удаление товаров в WooCommerce по сроку накопления на складе

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

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

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

Первый шаг — правильно определить критерии удаления. Обычно это дата создания товара (post_date) или дата последнего обновления (post_modified).

Пример запроса для диагностики в базе данных, чтобы увидеть товары старше 90 дней:

SELECT ID, post_title, post_date FROM wp_posts WHERE post_type = 'product' AND post_status = 'publish' AND post_date < DATE_SUB(NOW(), INTERVAL 90 DAY);

Если хотите ориентироваться на дату последнего обновления, замените post_date на post_modified.

Пошаговое решение: как автоматически удалять товары по сроку хранения через WP-Cron

Реализуем автоматическую очистку товаров с помощью планировщика задач WordPress (WP-Cron) и PHP.

1. Добавляем функцию удаления старых товаров

function wpupload_delete_old_products() {
    global $wpdb;
    $days = 90; // количество дней хранения
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    // Получаем ID товаров, которые старше пороговой даты
    $old_products = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'product' AND post_status = 'publish' AND post_date < %s",
        $date_threshold
    ));

    if (!empty($old_products)) {
        foreach ($old_products as $product_id) {
            wp_trash_post($product_id); // перемещаем товар в корзину
        }
    }
}

2. Регистрируем событие WP-Cron, если оно еще не зарегистрировано

function wpupload_schedule_delete_old_products() {
    if (!wp_next_scheduled('wpupload_daily_delete_old_products')) {
        wp_schedule_event(time(), 'daily', 'wpupload_daily_delete_old_products');
    }
}
add_action('wp', 'wpupload_schedule_delete_old_products');
add_action('wpupload_daily_delete_old_products', 'wpupload_delete_old_products');

3. Очистка корзины от удалённых товаров (по желанию)

Если хотите полностью удалять товары, а не помещать в корзину, добавьте задачу очистки корзины:

function wpupload_empty_trash() {
    global $wpdb;
    $trash_threshold = date('Y-m-d H:i:s', strtotime('-30 days')); // например, удалять товары из корзины старше 30 дней

    $old_trashed = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'product' AND post_status = 'trash' AND post_modified < %s",
        $trash_threshold
    ));

    if (!empty($old_trashed)) {
        foreach ($old_trashed as $product_id) {
            wp_delete_post($product_id, true); // окончательное удаление
        }
    }
}
add_action('wpupload_daily_delete_old_products', 'wpupload_empty_trash');

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

  • Проверьте наличие запланированного события через WP-CLI: wp cron event list --fields=hook,next_run, найдите wpupload_daily_delete_old_products.
  • Добавьте в функцию wpupload_delete_old_products логирование, например, запись в файл или error_log, чтобы отследить удаляемые ID.
  • Проверьте, что товары старше 90 дней после запуска крона перемещаются в корзину (статус trash в базе данных).
  • Запустите вручную функцию через консоль или временно через admin-ajax для теста.

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

  • WP-Cron не срабатывает — часто на хостингах нет реального cron, WP-Cron запускается при посещении сайта. Для надежности настройте системный cron для вызова wp cron event run --due-now.
  • Функция не удаляет товары — проверьте правильность условий даты и статус товара. Убедитесь, что товары действительно старше 90 дней и опубликованы.
  • Удаляются не те товары — проверьте SQL-запрос в функции и уточните критерии (например, использовать post_modified вместо post_date). Можно дополнить условие метаполями.
  • Удаление приводит к потерям важных товаров — перед удалением добавьте уведомления или создайте резервные копии базы.

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

  • Запускайте удаление не чаще одного раза в сутки, чтобы не перегружать сервер.
  • В логах фиксируйте ID удалённых товаров для аудита.
  • Перед удалением делайте резервные копии базы и медиа.
  • Если товаров много, реализуйте удаление партиями (например, по 50 товаров за один запуск), чтобы избежать таймаутов.
  • Используйте транзакции базы для безопасного удаления при необходимости.

Сравнение вариантов реализации

МетодПлюсыМинусыКомпромисс
WP-Cron + PHP кодГибкость, контроль, без сторонних плагиновЗависит от посещаемости сайта, требует отладкиНастроить системный cron для надежности
Плагины автоочистки (например, Clearfy Pro)Простота настройки, готовые функцииМогут быть избыточными, нагрузка, платныеИспользовать для крупных сайтов с поддержкой
Ручное удаление через админкуБезопасно, контроль пользователемНеавтоматично, трудозатратно при большом каталогеРекомендуется как резервный вариант

Вам также может быть интересно:

Как защитить загружаемые файлы WordPress от неавторизованного доступа
03.10.2026
Как автоматически удалять файлы WooCommerce после отмены заказа без плагинов
28.09.2026
Автоматическое удаление файлов WooCommerce после отмены заказа по типу
10.09.2026
Как автоматически удалять файлы WooCommerce после отмены заказа без плагинов
03.10.2026
Как автоматически удалять файлы WooCommerce после отмены заказа без плагинов
14.09.2026
×
-15%
на премиум-тему
Bono

Создай магазин мечты
на WordPress!

↓ ↓ ↓ ↓ ↓
Купить со скидкой »