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

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

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

Как определить товары для удаления

Первый шаг — понять, по каким критериям отбирать товары для удаления. Обычно используют следующие параметры:

  • Отсутствие продаж за последние N дней (например, 180 дней);
  • Статус товара — опубликован или черновик;
  • Отсутствие заказов с товарами в нужный период;
  • Не учитывать товары с определёнными метками или категориями (например, хиты продаж или новые поступления).

Пример SQL-запроса для поиска товаров без продаж за 180 дней

SELECT p.ID FROM wp_posts p
LEFT JOIN wp_woocommerce_order_items oi ON oi.order_item_name = p.post_title
LEFT JOIN wp_woocommerce_order_itemmeta oim ON oim.order_item_id = oi.order_item_id
LEFT JOIN wp_posts orders ON orders.ID = oi.order_id AND orders.post_status IN ('wc-completed', 'wc-processing')
WHERE p.post_type = 'product'
AND p.post_status = 'publish'
AND (orders.ID IS NULL OR orders.post_date < DATE_SUB(NOW(), INTERVAL 180 DAY))
GROUP BY p.ID;

Однако для безопасности и удобства лучше использовать WP API и хуки.

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

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

function wpbit_delete_inactive_products() {
    $days_inactive = 180; // период без продаж
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_inactive . ' days'));

    // Получаем ID товаров, у которых не было заказов за этот период
    global $wpdb;
    $product_ids = $wpdb->get_col($wpdb->prepare(
        "SELECT p.ID FROM {$wpdb->posts} p
        LEFT JOIN {$wpdb->prefix}woocommerce_order_items oi ON oi.order_item_name = p.post_title
        LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim ON oim.order_item_id = oi.order_item_id
        LEFT JOIN {$wpdb->posts} orders ON orders.ID = oi.order_id AND orders.post_status IN ('wc-completed', 'wc-processing')
        WHERE p.post_type = 'product'
        AND p.post_status = 'publish'
        AND (orders.ID IS NULL OR orders.post_date < %s)
        GROUP BY p.ID",
        $date_threshold
    ));

    if (empty($product_ids)) {
        return;
    }

    foreach ($product_ids as $product_id) {
        wp_delete_post($product_id, true); // жесткое удаление
    }
}

2. Планируем запуск функции через WP-Cron

function wpbit_schedule_inactive_products_deletion() {
    if (!wp_next_scheduled('wpbit_delete_inactive_products_hook')) {
        wp_schedule_event(time(), 'daily', 'wpbit_delete_inactive_products_hook');
    }
}
add_action('wp', 'wpbit_schedule_inactive_products_deletion');
add_action('wpbit_delete_inactive_products_hook', 'wpbit_delete_inactive_products');

3. Отключение WP-Cron (опционально)

Если на сайте много трафика или WP-Cron нестабилен, рекомендуется отключить его и настроить системный cron на выполнение wp-cron.php.

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

  • Перед запуском сделайте бэкап базы данных.
  • В админке WooCommerce проверьте количество товаров до и после запуска.
  • Запустите функцию вручную, добавив вызов wpbit_delete_inactive_products(); в шаблон или через WP-CLI (wp eval 'wpbit_delete_inactive_products();').
  • Проверьте логи ошибок и удаленные записи в базе (таблица wp_posts с типом product).

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

  • Удаляются товары с продажами: проверяйте совпадение названий товаров и товаров в заказах, лучше использовать ID товаров и мета-данные заказов.
  • Функция не запускается: убедитесь, что WP-Cron активен и событие запланировано.
  • Ошибки SQL: проверяйте префиксы таблиц, особенно если они нестандартные.
  • Повреждение данных: всегда делайте резервные копии перед массовыми операциями.

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

  • Используйте транзакции и проверки при работе с базой данных.
  • Ограничьте удаление только товарами с определенными статусами.
  • Добавьте логирование удаленных товаров в отдельный файл или таблицу.
  • Проверяйте совместимость с кеширующими плагинами и очищайте кеш после удаления.

Сравнение способов автоматизации удаления товаров

МетодПлюсыМинусыПример
WP-Cron с кастомной функциейГибкость, полное управление, без сторонних плагиновЗависит от посещаемости сайта, требует знаний кодаКод из статьи
Плагины очистки WooCommerceПростота установки, готовый интерфейсМогут быть лишние функции, нагрузка на сайтWooCommerce Bulk Delete
Системный cron + WP-CLIНадежность, не зависит от WP-CronТребует доступа к серверу и навыков sysadminwp eval 'wpbit_delete_inactive_products();'
Как удалить категории без записей в WordPress автоматически
19.02.2026
Как автоматизировать удаление спама в комментариях WordPress
18.12.2025
Как автоматизировать удаление старых неиспользуемых медиафайлов в WordPress
07.03.2026
WooCommerce: как автоматически удалять товары из магазина по статусу заказов
10.05.2026
Как автоматически удалять неактивных пользователей WordPress
07.02.2026