WooCommerce: автоматическое отключение неактивных товаров по времени

Диагностика проблемы с неактивными товарами

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

  • Товары без продаж и просмотров долгое время (например, 3-6 месяцев);
  • Ручное отключение или удаление занимает много времени;
  • Отсутствие автоматизации приводит к устаревшему каталогу и снижению конверсии.

Для решения задачи нужно настроить автоматическое отключение (перевод в статус «черновик» или «скрытый») таких товаров.

Пошаговое решение: автоматическое отключение товаров по дате последнего обновления

1. Подключение к WP-Cron для регулярной проверки

Используем встроенный механизм WP-Cron для запуска функции проверки неактивных товаров. Добавляем в functions.php или в собственный плагин:

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

2. Функция для выборки и отключения товаров

Пишем функцию, которая выбирает товары, не обновлявшиеся более N дней, и переводит их в статус draft:

function disable_inactive_products() {
    $days_inactive = 90; // Порог неактивности в днях
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days_inactive} days"));

    $args = array(
        'post_type' => 'product',
        'post_status' => 'publish',
        'date_query' => array(
            array(
                'column' => 'post_modified',
                'before' => $date_threshold,
            ),
        ),
        'posts_per_page' => -1,
        'fields' => 'ids',
    );

    $query = new WP_Query($args);

    if ( ! empty($query->posts) ) {
        foreach ( $query->posts as $product_id ) {
            wp_update_post(array(
                'ID' => $product_id,
                'post_status' => 'draft',
            ));
        }
    }
}
add_action('auto_disable_inactive_products', 'disable_inactive_products');

3. Дополнительная проверка по продажам (опционально)

Для более точного определения неактивных товаров можно проверить наличие заказов с этим товаром за последние N дней. Пример запроса к базе:

function has_sales_last_days( $product_id, $days = 90 ) {
    global $wpdb;
    $date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );

    $query = $wpdb->prepare(
        "SELECT COUNT( DISTINCT p.ID )
        FROM {$wpdb->prefix}posts p
        INNER JOIN {$wpdb->prefix}woocommerce_order_items oi ON p.ID = oi.order_id
        INNER JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim ON oi.order_item_id = oim.order_item_id
        WHERE p.post_type = 'shop_order'
        AND p.post_status IN ( 'wc-completed', 'wc-processing' )
        AND p.post_date > %s
        AND oim.meta_key = '_product_id'
        AND oim.meta_value = %d",
        $date_threshold,
        $product_id
    );

    return $wpdb->get_var( $query ) > 0;
}

В функцию disable_inactive_products можно добавить проверку has_sales_last_days и исключать товары с продажами.

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

  • Запустить вручную функцию для теста (временно вызвать disable_inactive_products() в админке или через WP-CLI `wp eval 'disable_inactive_products();'`);
  • Проверить, что товары, которые не обновлялись и не продавались, стали статусом draft;
  • Убедиться, что товары с активными продажами остались опубликованными;
  • Проверить журнал ошибок PHP и логи сервера на отсутствие ошибок;
  • Через сутки убедиться, что автоматический запуск WP-Cron сработал (можно установить плагин WP Crontrol для мониторинга).

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

  • WP-Cron не срабатывает: по умолчанию WP-Cron запускается при посещении сайта. Если трафика мало, можно настроить системный cron на вызов wp-cron.php напрямую.
  • Некорректный выбор товаров: проверьте параметры date_query и статус товара. Например, если товары уже в draft, они не попадут в выборку.
  • Функция отключает слишком много товаров: добавьте проверку на продажи или просмотры, чтобы исключить активные позиции.
  • Проблемы с производительностью: если товаров много, разбивайте обработку на батчи, используйте пагинацию в WP_Query.

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

  • Используйте транзакции или проверяйте результаты wp_update_post для исключения ошибок обновления.
  • Добавьте логирование отключенных товаров в отдельный файл для аудита.
  • Для крупных магазинов рекомендуем запускать скрипт в фоне через WP-CLI или отдельный cron-задание, чтобы избежать таймаутов.
  • Ограничьте права пользователя, под которым выполняется скрипт, чтобы минимизировать риск безопасности.

Сравнение способов реализации автоматического отключения товаров

МетодОписаниеПлюсыМинусы
WP-Cron + PHP кодСтандартный планировщик WordPress с кастомной функцией отключенияБез плагинов, гибко, легко кастомизироватьЗависит от посещаемости сайта, возможны пропуски срабатывания
Внешний системный cron + WP-CLIВызов WP-CLI команды по расписанию на сервереНадежно, не зависит от трафика, высокая производительностьТребует доступа к серверу и навыков работы с консолью
Плагин автоматизации (например, Advanced Cron Manager)Использование готового плагина для управления задачамиУдобный интерфейс, мониторинг задачДополнительная нагрузка, зависимость от стороннего кода
Как установить и настроить Redis кэш в WordPress для ускорения сайта
30.03.2026
Как создать собственный виджет в WordPress с поддержкой AJAX
07.02.2026
Как настроить загрузку изображений Lazy Load в WordPress без плагинов
04.03.2026
Как удалить неиспользуемые шорткоды в WordPress
06.01.2026
WooCommerce: как автоматически отключать неактивные товары по времени
13.07.2026