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

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

В интернет-магазинах на WooCommerce часто накапливаются товары, которые долгое время не продаются, не обновляются или имеют статус «черновик»/«откл.» без перспективы возвращения. Это приводит к увеличению объема базы данных и замедлению работы сайта. Автоматическое удаление таких товаров помогает поддерживать базу в актуальном состоянии, снижая нагрузку и упрощая администрирование.

Настройка автоматического удаления неактивных товаров через WP-Cron

1. Критерии отбора товаров для удаления

Определим, что считать «неактивным» товаром. Обычно это:

  • статус draft или pending более 30 дней;
  • статус private или trash;
  • отсутствие продаж за последние 3 месяца;
  • отсутствие обновления описания и цены за 90 дней.

Выбранные критерии можно адаптировать под конкретный магазин.

2. Создаем пользовательскую функцию удаления

Добавим код в файл functions.php вашей темы (рекомендуется использовать дочернюю) или в отдельный плагин:

function wpmanual_delete_inactive_products() {
    $args = array(
        'post_type'      => 'product',
        'post_status'    => array('draft', 'pending', 'private', 'trash'),
        'date_query'     => array(
            array(
                'column' => 'post_modified_gmt',
                'before' => '90 days ago',
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
        'meta_query'     => array(
            'relation' => 'OR',
            array(
                'key'     => 'total_sales',
                'value'   => 0,
                'compare' => '=',
                'type'    => 'NUMERIC',
            ),
            array(
                'key'     => 'total_sales',
                'compare' => 'NOT EXISTS',
            ),
        ),
    );

    $query = new WP_Query($args);

    if (!empty($query->posts)) {
        foreach ($query->posts as $product_id) {
            wp_delete_post($product_id, true); // true - удаляет безвозвратно
        }
    }
}

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

Добавим планировщик в functions.php:

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

add_action('wpmanual_delete_inactive_products_event', 'wpmanual_delete_inactive_products');

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

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

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

  • Проверьте логи сервера или включите WP_DEBUG_LOG, чтобы отследить ошибки.
  • Выполните вручную функцию wpmanual_delete_inactive_products() через WP-CLI или временно вызовите ее в шаблоне (например, вызов в functions.php), чтобы убедиться, что товары удаляются.
  • Проверяйте список товаров в админке WooCommerce — неактивные должны удаляться автоматически.
  • Используйте плагин WP Crontrol для просмотра и управления запланированными задачами.

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

  • CRON не запускается: На многих хостингах WP-Cron работает только при посещении сайта. Для надежной работы настройте системный CRON на сервере или используйте плагин WP Crontrol.
  • Удаляются не те товары: Проверьте параметры WP_Query, особенно статусы и даты. Добавьте вывод ID товаров для отладки.
  • Отсутствует поле total_sales: Это мета поле WooCommerce. Если оно не создается, убедитесь, что хотя бы один раз был оформлен заказ с этим товаром.
  • Удаление происходит слишком часто или редко: Проверьте расписание CRON, оптимально — 1 раз в день.

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

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

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

МетодПреимуществаНедостаткиРекомендуемые случаи
Плагин автоклинераПростота настройки, готовый интерфейсМожет быть избыточным, нагрузкаМаленькие магазины без разработчика
WP-Cron + кастомный кодГибкость, точное соответствие требованиямТребует знаний PHP и WordPressСредние и крупные магазины, кастомизация
Ручное удаление через WP-CLIМаксимальный контрольНе автоматизировано, требует доступа к серверуОпытные администраторы, внеплановые чистки
WooCommerce: как добавить и использовать собственные статусы заказов
28.06.2026
WooCommerce: как исправить неработающее AJAX обновление корзины
08.05.2026
WooCommerce не работают письма после обновления: диагностика и решение
08.06.2026
Как создать поле выпадающий список в админке WordPress с сохранением значений
28.01.2026
WordPress: как сделать уникальные отзывы с помощью плагинов и кода
18.11.2025