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

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

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

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

Определение критериев для удаления товаров

Прежде чем запускать автоматическое удаление, нужно чётко определить, что считать «неактивным товаром». Чаще всего используют следующие параметры:

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

В этом руководстве мы возьмём за основу первый критерий — отсутствие продаж за 180 дней, поскольку это объективный показатель неактивности.

Реализация автоматического удаления товаров с помощью WP-Cron

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

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

function wc_delete_inactive_products() {
    if ( ! class_exists( 'WooCommerce' ) ) {
        return; // WooCommerce не активен
    }

    global $wpdb;
    $days_inactive = 180;
    $date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days_inactive} days" ) );

    // Получаем ID товаров без заказов за последние 180 дней
    $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.ID
         LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim ON oim.order_item_id = oi.order_item_id
         LEFT JOIN {$wpdb->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 ) ) {
        return; // Нет товаров для удаления
    }

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

2. Регистрация WP-Cron задачи

Добавим ежедневное выполнение функции:

function wc_schedule_delete_inactive_products() {
    if ( ! wp_next_scheduled( 'wc_daily_delete_inactive_products' ) ) {
        wp_schedule_event( time(), 'daily', 'wc_daily_delete_inactive_products' );
    }
}
add_action( 'wp', 'wc_schedule_delete_inactive_products' );

add_action( 'wc_daily_delete_inactive_products', 'wc_delete_inactive_products' );

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

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

  • Выполните функцию вручную, вызвав wc_delete_inactive_products() из консоли WP-CLI или временно через хук init.
  • Проверьте, что товары без заказов старше 180 дней удалились.
  • Проверьте логи сервера на предмет ошибок.
  • Убедитесь, что WP-Cron запускается — можно использовать плагин WP Crontrol для мониторинга и ручного запуска событий.

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

  • Неправильный SQL-запрос: из-за сложности связей WooCommerce запрос может не корректно находить товары. Используйте отладку через $wpdb->last_error и проверяйте вывод $product_ids.
  • Функция не запускается по расписанию: проверьте, активен ли WP-Cron и нет ли конфликтов с плагинами кэширования.
  • Удаление товаров, которые не должны удаляться: всегда тестируйте на копии сайта, добавляйте логирование действий и возможность отката.
  • Отсутствие резервных копий: перед автоматическим удалением настройте регулярное создание бэкапов.

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

  • Логирование операций: добавьте запись в лог ID удалённых товаров, чтобы иметь возможность отследить действия.
  • Ограничение нагрузки: если товаров много, удаляйте партиями — например, по 50 товаров за раз, чтобы не перегружать сервер.
  • Бэкапы: используйте автоматические бэкапы перед запуском удаления. Можно интегрировать с плагинами резервного копирования или WP-CLI командами.
  • Уведомления: настройте отправку email-уведомлений администратору после каждого удаления, чтобы контролировать процесс.

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

МетодПлюсыМинусыКомпромисс
Ручное удалениеПолный контроль, минимальный риск ошибокТрудоёмко, неэффективно при большом каталогеИспользовать для единичных случаев
Плагины для очистки WooCommerceУдобство, часто есть интерфейсМожет не учитывать уникальные критерии, нагрузкаПодходит для типовых задач
Код + WP-CronГибкость, автоматизация, масштабируемостьТребует навыков, риск ошибок без тестированияЛучше для опытных разработчиков, с резервным копированием
Оптимизация базы данных WordPress: удаление старых ревизий и автоматизация процесса
22.12.2025
Как создать свой плагин в WordPress с примером кода
05.11.2025
Как отключить автоматические обновления WordPress
03.01.2026
Оптимизация загрузки картинок в WordPress с помощью Lazy Load
15.01.2026
Как сделать адаптивные изображения в WordPress
20.02.2026