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

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

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

Ручное удаление занимает много времени и опасно — можно случайно удалить нужный товар. Автоматизация процесса с помощью CRON-задачи решит проблему, если задать чёткие критерии отбора товаров для удаления.

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

Чаще всего под неактивными понимают товары с одним или несколькими из следующих признаков:

  • статус товара draft или private;
  • отсутствие запасов (stock = 0) более 30 дней;
  • отсутствие продаж за последние несколько месяцев;
  • отсутствие активности в метаданных, например, дата последнего обновления.

Выбор критериев зависит от бизнес-логики магазина.

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

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

function wpmanual_remove_inactive_products() {
    $args = [
        'post_type'      => 'product',
        'post_status'    => ['draft', 'private'],
        'meta_query'     => [
            [
                'key'     => '_stock',
                'value'   => '0',
                'compare' => '=',
                'type'    => 'NUMERIC'
            ],
            [
                'key'     => '_stock_date', // кастомное поле с датой последнего обновления запаса
                'value'   => date('Y-m-d', strtotime('-30 days')),
                'compare' => '<=',
                'type'    => 'DATE'
            ]
        ],
        'fields'        => 'ids',
        'posts_per_page'=> -1
    ];

    $products = get_posts($args);

    foreach ($products as $product_id) {
        wp_delete_post($product_id, true); // жесткое удаление
    }
}

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

2. Сохраняем дату обновления запаса

add_action('woocommerce_update_product_stock', function($product) {
    update_post_meta($product->get_id(), '_stock_date', current_time('Y-m-d'));
});

3. Регистрируем CRON задачу для автоматического запуска

add_action('wpmanual_delete_inactive_products_cron', 'wpmanual_remove_inactive_products');

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

4. Очистка CRON при деактивации плагина или темы

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

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

  • Убедитесь, что товары с нулевым остатком и статусом draft или private старше 30 дней удаляются автоматически после запуска CRON.
  • Для ручного запуска можно вызвать функцию wpmanual_remove_inactive_products() из консоли WP-CLI: wp eval 'wpmanual_remove_inactive_products();'.
  • Проверьте, что мета поле _stock_date обновляется при изменении запаса товара.

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

  • CRON-задача не выполняется автоматически: Проверьте, что на сайте включен WP-Cron (нет константы DISABLE_WP_CRON в wp-config.php или настроен системный cron для вызова wp-cron.php).
  • Товары не удаляются: Убедитесь, что критерии post_status и мета-запросы совпадают с реальным состоянием товаров. Для отладки выведите ID товаров, найденных запросом:
error_log(print_r($products, true));
  • Удаление происходит не корректно: Используйте wp_delete_post($id, true) для полного удаления, иначе товар попадет в корзину.

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

  • Не запускайте удаление слишком часто — достаточно раз в день, чтобы не перегружать сервер.
  • Перед удалением сделайте резервное копирование базы данных.
  • Добавьте логирование удалённых товаров для аудита.
  • Если товаров много, разбивайте удаление по партиям — например, по 50 штук за запуск, чтобы избежать таймаутов.

Сравнение вариантов автоматического удаления товаров

МетодПлюсыМинусы
Удаление через WP-Cron и кодГибко, бесплатно, можно точно настроить критерииНужен опыт программирования, возможны ошибки без тестирования
Плагины для очистки товаровПросто, быстро, часто с UIМожет не поддерживать кастомные критерии, нагрузка
Ручное удаление через админкуПолный контрольДолго, риск ошибок, не автоматизировано
Как удалить неиспользуемые шорткоды в WordPress
17.12.2025
WooCommerce: как добавить собственные поля в форму оформления заказа
28.05.2026
WooCommerce: правильная настройка AJAX callback для обновления корзины без перезагрузки
04.05.2026
WooCommerce: как использовать хуки для изменения шаблонов писем
16.05.2026
Как сделать автоматическое резервное копирование WordPress: лучшие методы и примеры кода
25.11.2025