Автоматическое удаление старых товаров 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Простота настройки, интерфейсНагрузка, возможные конфликты, платные функции
Как создать и использовать кастомные роли и права в WordPress
05.01.2026
Как автоматизировать удаление спама в комментариях WordPress
29.03.2026
Автоматическое удаление старых мультимедиа в WordPress: практические решения
12.04.2026
Как автоматически отключать изображения в WordPress при отказах от загрузки
24.01.2026
Как создать собственный виджет в WordPress с примерами кода
06.03.2026