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

Почему важно отключать неактивные товары в WooCommerce

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

Диагностика: как определить неактивные товары

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

  • Какой период безактивности считать критичным (например, 3 месяца без заказов).
  • Какие метрики использовать — дата последней покупки, дата обновления товара, количество просмотров.
  • Какой статус товара считать "отключённым": черновик, снят с публикации или пользовательский статус.

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

SELECT p.ID, p.post_title FROM wp_posts p
LEFT JOIN wp_woocommerce_order_items oi ON oi.order_item_name = p.ID
LEFT JOIN wp_posts o ON o.ID = oi.order_id AND o.post_status IN ('wc-completed', 'wc-processing')
WHERE p.post_type = 'product'
AND o.ID IS NULL
AND p.post_date < DATE_SUB(NOW(), INTERVAL 3 MONTH);

Этот запрос покажет товары, которые не связывались с завершёнными или обрабатываемыми заказами за последние 3 месяца.

Пошаговое решение: автоматическое отключение товаров с помощью WP Cron

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

function wc_disable_inactive_products() {
    $args = [
        'post_type' => 'product',
        'post_status' => 'publish',
        'date_query' => [
            [
                'column' => 'post_date',
                'before' => '3 months ago',
            ],
        ],
        'meta_query' => [
            [
                'key' => '_last_order_date',
                'compare' => 'NOT EXISTS',
            ],
        ],
        'posts_per_page' => -1,
        'fields' => 'ids',
    ];

    $products = get_posts($args);

    foreach ($products as $product_id) {
        wp_update_post([
            'ID' => $product_id,
            'post_status' => 'draft',
        ]);
    }
}

Здесь мы выбираем товары, у которых нет мета-поля с датой последнего заказа (которое нужно обновлять отдельно при покупке) и которые опубликованы более 3 месяцев назад.

2. Обновление мета-поля даты последнего заказа

Чтобы функция работала корректно, нужно при каждом успешном заказе обновлять мета-данные товаров:

add_action('woocommerce_order_status_completed', 'update_last_order_date_for_products');
function update_last_order_date_for_products($order_id) {
    $order = wc_get_order($order_id);
    foreach ($order->get_items() as $item) {
        $product_id = $item->get_product_id();
        update_post_meta($product_id, '_last_order_date', current_time('mysql'));
    }
}

3. Настройка WP Cron для периодического запуска

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

add_action('wc_disable_inactive_products_cron', 'wc_disable_inactive_products');

Эта настройка запускает проверку и отключение товаров раз в сутки.

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

  • Посмотрите в админке WooCommerce раздел "Товары" и отфильтруйте по статусу "Черновик" — должны появиться отключённые товары.
  • Проверьте логи Cron (можно использовать плагин WP Crontrol), что событие выполняется без ошибок.
  • Убедитесь, что мета-поле _last_order_date корректно обновляется при заказах, сделав тестовый заказ.
  • Проверьте, что отключённые товары не отображаются на витрине сайта.

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

  • Функция не отключает товары: Проверьте, что мета-поле _last_order_date действительно заполняется — без него условие не сработает.
  • Cron-задача не запускается: Убедитесь, что на хостинге разрешена работа WP Cron или настройте системный cron на вызов wp-cron.php.
  • Товары отключаются слишком рано: Проверьте правильность параметров date_query и период безактивности.
  • Сбои из-за большого количества товаров: Разбейте обработку на порции, используя пагинацию в запросе, чтобы избежать превышения лимитов памяти.

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

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

Сравнение вариантов реализации

СпособПлюсыМинусы
Код на WP Cron (как в статье)Контроль, кастомизация, бесплатноНужны навыки, возможно нагрузка при большом каталоге
Плагин управления товарами (например, "WooCommerce Smart Manager")Простой интерфейс, функции без кодаПлатно, ограничена гибкость
Ручное отключениеТочно контролируете каждый товарТрудозатратно, риск пропусков

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Как создать динамические отзывы в WordPress с помощью Expert Review
28.12.2025
Автоматическое управление файлом robots.txt в WordPress: настройка и примеры кода
04.03.2026
Исправление ошибки 429 в WordPress: практическое руководство
20.12.2025
WooCommerce: автоматическое изменение ставок доставки по регионам
29.06.2026
Автоматическое отключение нерабочих контейнеров в WordPress для повышения производительности
04.03.2026
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее