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

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

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

Как понять, что товар неактивен?

  • Отсутствие продаж за заданный период (например, 90 дней).
  • Отсутствие обновлений товара (изменение цены, описания).
  • Отсутствие остатков товара (stock quantity равен нулю).

Для автоматизации процесса необходимо использовать один или несколько из этих критериев.

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

Реализуем функцию, которая проверяет товары и меняет их статус на "черновик", если они не продавались более 90 дней.

1. Подключение функции к планировщику WP-Cron

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

2. Основная функция проверки и отключения товаров

function disable_inactive_woocommerce_products() {
    global $wpdb;
    $days_threshold = 90;
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_threshold . ' days'));

    // Получаем ID товаров, у которых не было заказов после $date_threshold
    $product_ids = $wpdb->get_col($wpdb->prepare(
        "SELECT DISTINCT p.ID FROM {$wpdb->posts} p
         LEFT JOIN {$wpdb->prefix}woocommerce_order_items oi ON oi.order_item_id IN (
            SELECT order_item_id FROM {$wpdb->prefix}woocommerce_order_itemmeta WHERE meta_key = '_product_id' AND meta_value = p.ID
         )
         LEFT JOIN {$wpdb->prefix}posts o ON o.ID = oi.order_id
         WHERE p.post_type = 'product'
         AND (o.post_date IS NULL OR o.post_date < %s)
         AND p.post_status = 'publish'",
        $date_threshold
    ));

    if (!empty($product_ids)) {
        foreach ($product_ids as $product_id) {
            // Меняем статус товара на черновик
            wp_update_post(array(
                'ID' => $product_id,
                'post_status' => 'draft'
            ));
        }
    }
}
add_action('auto_disable_inactive_products', 'disable_inactive_woocommerce_products');

3. Добавление проверки остатка товара

Если вы хотите также отключать товары с нулевым остатком, добавьте дополнительную проверку:

foreach ($product_ids as $product_id) {
    $stock_quantity = get_post_meta($product_id, '_stock', true);
    if ($stock_quantity === '' || intval($stock_quantity) > 0) {
        continue; // Пропускаем товары с остатком
    }
    wp_update_post(array(
        'ID' => $product_id,
        'post_status' => 'draft'
    ));
}

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

Для проверки работы скрипта:

  • Выполните вручную запуск задачи:
    do_action('auto_disable_inactive_products');
  • Проверьте в админке WooCommerce, что товары, которые не продавались более 90 дней и имеют нулевой остаток, переведены в статус "Черновик".
  • Отследите логи ошибок PHP и убедитесь, что нет предупреждений.
  • Запустите wp cron event list через WP-CLI для проверки расписания задачи.

Частые ошибки и способы их исправления

  • Ошибка: Скрипт не отключает товары.
    Причина: Неправильно определены заказы или дата.
    Исправление: Проверьте правильность SQL-запроса, убедитесь, что заказы существуют и их даты корректны.
  • Ошибка: WP-Cron не запускается.
    Причина: Система не обрабатывает cron-задания.
    Исправление: Настройте системный cron или используйте плагин WP Crontrol для тестирования.
  • Ошибка: Отключаются товары с остатком.
    Причина: Проверьте корректность проверки остатка, возможно, метаполе '_stock' отсутствует или хранит некорректные данные.

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

  • Не запускайте тяжелые запросы в пользовательском запросе – используйте WP-Cron или системный cron.
  • Добавьте логирование отключений товаров для последующего аудита.
  • Оптимизируйте SQL-запросы, избегайте JOIN'ов без индексов.
  • Используйте transient API для кеширования результатов, если проверка занимает много времени.

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

МетодПлюсыМинусыПример
Плагин автоматизацииПростота настройки, поддержкаМожет замедлять сайт, лишний функционалWC Smart Manager, WooCommerce Scheduler
Код в functions.phpЛегковесность, полный контрольТребует навыков, ответственность за ошибкиПример из статьи
Внешний cron с WP-CLIТочная настройка, минимальная нагрузкаСложна для новичков, доступ к серверуwp cron event run --due-now
Как удалить неиспользуемые метаполя в WordPress
07.04.2026
Как добавить автоматическое сообщение о обновлении темы в WordPress
16.01.2026
Оптимизация базы данных WordPress для повышения скорости сайта
17.11.2025
Как автоматизировать удаление старых записей в WordPress через код
09.03.2026
Удаление неиспользуемых таблиц базы данных WordPress без рисков
26.12.2025