Автоматическое удаление товаров в 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: практические методы
21.12.2025
Как добавить автоматическое сжатие файлов при загрузке в WordPress
12.02.2026
Как автоматически удалять файлы из папки uploads в WordPress по сроку хранения
19.03.2026
Автоматическое удаление товаров в WooCommerce по сроку накопления на складе
26.04.2026
Как удалить загруженные файлы из WooCommerce после отмены заказа
14.05.2026

wp upload - это директория в WP для загрузки файлов. Подробнее про загрузку файлов в админку можно почитать на этой странице.