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

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

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

Как определить неактивный товар?

Критерии могут быть разными, но распространённые варианты:

  • Отсутствие продаж в течение N месяцев.
  • Отсутствие обновлений товара в течение N месяцев.
  • Статус товара — опубликован, но без активности.

Для реализации автоматического удаления нужно использовать первую метрику — отсутствие продаж. Это более объективный критерий.

Пошаговое решение: автоматическое удаление товаров без продаж дольше 6 месяцев

1. Подготовка и резервное копирование

Перед внесением изменений обязательно сделайте резервную копию базы данных и файлов сайта. Удаление товаров — необратимая операция.

2. Создание функции для удаления товаров

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

function wpcoder_delete_inactive_products() {
    global $wpdb;
    $months_inactive = 6; // Период без продаж
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$months_inactive} months"));

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

    if (!empty($product_ids)) {
        foreach ($product_ids as $product_id) {
            wp_trash_post($product_id); // Перемещаем в корзину, можно заменить на wp_delete_post для удаления безвозвратно
        }
    }
}

// Запускаем функцию по расписанию раз в неделю
if (!wp_next_scheduled('wpcoder_weekly_inactive_product_cleanup')) {
    wp_schedule_event(time(), 'weekly', 'wpcoder_weekly_inactive_product_cleanup');
}
add_action('wpcoder_weekly_inactive_product_cleanup', 'wpcoder_delete_inactive_products');

3. Разбор кода и настройка

  • $months_inactive — количество месяцев без продаж, после которого товар считается неактивным.
  • Запрос выбирает опубликованные товары, которые не связаны с заказами со статусом wc-completed или wc-processing за указанный период.
  • wp_trash_post помещает товар в корзину, что безопаснее, чем удаление.
  • Запланированное задание в WP-Cron запускает функцию еженедельно.

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

Чтобы убедиться, что всё работает корректно:

  1. Запустите функцию вручную через do_action('wpcoder_weekly_inactive_product_cleanup'); в консоли WP-CLI или временно вызовите её из кода.
  2. Проверьте, что в корзине появились товары, которые действительно не продавались более 6 месяцев.
  3. Убедитесь, что активные товары остались без изменений.
  4. Мониторьте журнал ошибок и логи сервера на предмет сбоев.

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

  • Неправильные статусы заказов в запросе: Если используете другие статусы оплаты, добавьте их в массив post_status в SQL.
  • Отсутствие cron-задачи: Проверьте через wp cron event list, что задание wpcoder_weekly_inactive_product_cleanup запланировано.
  • Функция не запускается автоматически: Убедитесь, что на хостинге включён WP-Cron или настройте системный cron для вызова wp-cron.php.
  • Удаляются нужные товары: Проверьте правильность даты и логику выборки, при необходимости увеличьте период без продаж.

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

  • Используйте wp_trash_post вместо wp_delete_post для возможности восстановления товара из корзины.
  • Проводите очистку корзины вручную или настройте автоматическую очистку через плагин, чтобы не накапливать мусор.
  • Оптимизируйте SQL-запрос, индексируя таблицы WooCommerce, если база большая.
  • Проверяйте влияние на производительность при запуске задачи, лучше запускать её в ночное время.

Сравнение методов удаления неактивных товаров

МетодОписаниеПлюсыМинусы
WP-Cron с SQL-запросомАвтоматический запуск функции удаления по расписаниюАвтоматизация, гибкость настройки, не требует сторонних плагиновЗависит от правильной работы WP-Cron, нагрузка на БД при большом каталоге
Плагины очисткиГотовые решения для удаления товаровПростота использования, интерфейс, дополнительные функцииМогут быть платными, избыточны, нагрузка на сайт
Ручное удалениеУдаление через админку или SQL-запросыПолный контрольРиск ошибок, трудоёмко на больших магазинах
WooCommerce: отладка проблем с обновлением стоимости в корзине
07.05.2026
WooCommerce: автоматическое удаление неактивных пользователей с заказами
14.07.2026
Как создать эффективный кеш в WordPress с помощью перегрузки функций
22.11.2025
WooCommerce: как автоматически удалять неоплаченные заказы по срокам
13.06.2026
Пользовательские статусы записей в WordPress: создание и применение
15.12.2025