Автоматическое удаление старых товаров WooCommerce с помощью WP-Cron

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

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

Автоматизация процесса через WP-Cron позволяет регулярно очищать каталог от старых товаров без вмешательства администратора.

Пошаговое решение: настройка WP-Cron для удаления товаров по дате

1. Выбор критерия удаления

Для примера возьмём удаление товаров, которые не обновлялись более 180 дней. Это можно сделать по дате изменения записи (post_modified).

2. Создание функции удаления старых товаров

Добавим в файл functions.php вашей темы или в отдельный плагин следующий код:

function wpunit_delete_old_woocommerce_products() {
    global $wpdb;
    // Определяем дату 180 дней назад
    $date_threshold = date('Y-m-d H:i:s', strtotime('-180 days'));

    // Получаем ID товаров, не обновлявшихся более 180 дней
    $product_ids = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} 
         WHERE post_type = 'product' 
         AND post_modified < %s
         AND post_status != 'trash'",
        $date_threshold
    ));

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

3. Регистрация WP-Cron задачи

Далее регистрируем событие, которое будет запускать эту функцию раз в сутки:

if (!wp_next_scheduled('wpunit_daily_delete_old_products')) {
    wp_schedule_event(time(), 'daily', 'wpunit_daily_delete_old_products');
}

add_action('wpunit_daily_delete_old_products', 'wpunit_delete_old_woocommerce_products');

4. Очистка при деактивации

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

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

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

  • Для теста можно временно изменить период в функции на 1 день, чтобы увидеть, что товары старше суток попадут в корзину.
  • Проверяйте в админке раздел «Товары» — старые товары должны перемещаться в корзину.
  • Можно использовать WP-CLI команду wp cron event run wpunit_daily_delete_old_products для немедленного запуска задачи.
  • Логи ошибок включайте через define('WP_DEBUG_LOG', true); в wp-config.php для отслеживания сбоев.

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

  • WP-Cron не срабатывает: В средах с низким трафиком cron-задачи могут не запускаться вовремя. Решение — настроить системный cron на сервере для вызова wp-cron.php каждые 15 минут.
  • Удаляются не те товары: Проверьте правильность условия выборки в SQL, возможно, нужно изменить дату или статус поста.
  • Проблемы с правами доступа: Убедитесь, что пользователь, запускающий WP-Cron, имеет права на удаление товаров.
  • Медленная работа при большом количестве товаров: Разбейте удаление на части, например, удалять по 50 товаров за один запуск.

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

  • Используйте wp_trash_post() вместо wp_delete_post() для возможности восстановления товаров из корзины.
  • Для больших сайтов распараллельте удаление с помощью transients и AJAX, чтобы не создавать нагрузку на сервер.
  • Регулярно очищайте корзину товаров, чтобы база данных не разрасталась.
  • Логируйте действия удаления в отдельный файл для аудита и отладки.

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

МетодПреимуществаНедостатки
Ручное удаление через админкуПростота, контрольДолго, неудобно на больших каталогах
WP-Cron с кастомным кодомАвтоматизация, гибкость, без плагиновЗависимость от посещаемости сайта, требует навыков разработки
Плагины очистки WooCommerceПростота настройки, интерфейсНагрузка, возможные конфликты, платные функции
Очистка базы данных WooCommerce от старых заказов через пользовательское поле meta
23.04.2026
Как автоматизировать удаление спама в комментариях WordPress
29.03.2026
Как избежать конфликтов между плагинами в WordPress
18.01.2026
Как использовать REST API для автоматического создания и обновления товаров WooCommerce
20.04.2026
Успешная авторизация WordPress с использованием REST API
18.12.2025