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

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

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

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

  • Товары, у которых дата последнего обновления (post_modified) старше определённого периода, например, 6 месяцев.
  • Товары со статусом "черновик" (draft) или "ожидает" (pending) более 30 дней.
  • Товары с нулевым остатком и без продаж за последний год.

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

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

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

if (!wp_next_scheduled('wc_delete_inactive_products_weekly')) {
    wp_schedule_event(time(), 'weekly', 'wc_delete_inactive_products_weekly');
}

add_action('wc_delete_inactive_products_weekly', 'wc_delete_inactive_products');

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

Эта функция находит товары, которые не обновлялись более 180 дней, и удаляет их из базы без возможности восстановления (без корзины):

function wc_delete_inactive_products() {
    global $wpdb;
    $days_inactive = 180; // 180 дней
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days_inactive} days"));

    // Получаем ID товаров для удаления
    $product_ids = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} 
         WHERE post_type = 'product' 
           AND post_modified < %s 
           AND post_status = 'publish'",
        $date_threshold
    ));

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

3. Дополнительные условия для фильтрации товаров

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

// Пример дополнительной фильтрации
$product_ids = $wpdb->get_col($wpdb->prepare(
    "SELECT p.ID FROM {$wpdb->posts} p
     LEFT JOIN {$wpdb->postmeta} pm_stock ON (p.ID = pm_stock.post_id AND pm_stock.meta_key = '_stock')
     LEFT JOIN {$wpdb->prefix}woocommerce_order_items oi ON oi.order_item_name = p.post_title
     WHERE p.post_type = 'product'
       AND p.post_modified < %s
       AND p.post_status = 'publish'
       AND (pm_stock.meta_value IS NULL OR pm_stock.meta_value = '0')",
    $date_threshold
));

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

  • Запустите функцию вручную для теста:
    do_action('wc_delete_inactive_products_weekly');
  • Проверьте в админке WooCommerce наличие и количество товаров до и после выполнения.
  • Подключите логи (через error_log или плагин для логирования), чтобы фиксировать удалённые ID.
  • Сделайте резервную копию базы данных перед тестированием.

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

  • Ошибка: Товары не удаляются.
    Причина: Запрос не находит товаров из-за неправильного формата даты или статуса.
    Решение: Проверьте формат даты и статус публикации. Для теста увеличьте период неактивности.
  • Ошибка: WP-Cron не срабатывает.
    Причина: WP-Cron зависит от посещений сайта, низкая посещаемость может задерживать выполнение.
    Решение: Настройте системный cron на вызов wp-cron.php или запустите вручную.
  • Ошибка: Удаление происходит слишком часто или слишком редко.
    Причина: Неправильный интервал планировщика.
    Решение: Используйте 'weekly' или создайте свой интервал через фильтр cron_schedules.

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

  • Перед удалением всегда делайте резервную копию базы данных.
  • Логируйте ID удалённых товаров для аудита и отката ошибок.
  • Для больших баз лучше реализовать пакетное удаление по 50–100 товаров за раз, чтобы избежать таймаутов.
  • Реализуйте проверку прав пользователя, если запускаете удаление из интерфейса администратора.
  • Оптимизируйте запросы с помощью индексов по post_type и post_modified.

Таблица сравнения подходов к удалению неактивных товаров

МетодПлюсыМинусыПример
WP-Cron + код в functions.php Полный контроль, бесплатно, адаптивно Зависит от посещаемости, требует навыков Код из статьи
Плагин очистки (например, WP Sweep) Простота установки, интерфейс Может удалять лишнее, ограниченная настройка WP Sweep (https://wpshop.ru/plugins/clearfy?source=wpteam.ru&medium=article&campaign=woocommerce-avtomaticheskoe-udaleniye-tovarov-po-neaktivnosti)
Ручное удаление через админку Безопасно, контроль Трудозатратно на больших магазинах Вручную в WooCommerce
Как удалить старые ревизии постов WordPress для оптимизации базы данных
01.01.2026
Как отключить автозагрузку изображений в WordPress для ускорения сайта
17.04.2026
Как автоматизировать управление публикациями в WordPress с помощью WP-Cron и кода
11.04.2026
WooCommerce: как изменять стоимость товаров в корзине по условию
07.05.2026
Как изменить размер аватара пользователя в WordPress без плагинов
24.01.2026

Возникли задачи по WP? Вы можете задать свой вопрос на FAQwp.com Либо обратиться к специалистам поддержки.