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

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

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

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

Чаще всего под неактивными продуктами понимают те, у которых:

  • отсутствуют продажи за последний год (или выбранный период);
  • продукт не обновлялся или не просматривался;
  • статус "черновик" или "ожидает" в течение длительного времени.

Выявить такие товары можно с помощью SQL-запроса к базе данных или через код PHP с использованием WP_Query.

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

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

function wpweb_get_inactive_products( $days = 365 ) {
    $date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );
    $args = [
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'date_query'     => [
            [
                'column' => 'post_modified',
                'before' => $date_threshold,
            ],
        ],
        'post_status'    => 'publish',
        'meta_query'     => [
            [
                'key'     => 'total_sales',
                'value'   => '0',
                'compare' => '=',
                'type'    => 'NUMERIC',
            ],
        ],
        'fields'         => 'ids',
    ];
    return get_posts( $args );
}

Эта функция вернет ID продуктов, которые не обновлялись более 365 дней и у которых нет продаж.

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

function wpweb_delete_products( $product_ids ) {
    foreach ( $product_ids as $id ) {
        wp_delete_post( $id, true ); // true — удаление без возможности восстановления
    }
}

3. Автоматизация через WP-Cron

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

if ( ! wp_next_scheduled( 'wpweb_delete_inactive_products_cron' ) ) {
    wp_schedule_event( time(), 'monthly', 'wpweb_delete_inactive_products_cron' );
}

add_action( 'wpweb_delete_inactive_products_cron', function() {
    $inactive_products = wpweb_get_inactive_products( 365 );
    if ( ! empty( $inactive_products ) ) {
        wpweb_delete_products( $inactive_products );
    }
});

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

  • В админ-панели WooCommerce зайдите в раздел "Товары" и проверьте, что продукты, соответствующие критериям (без продаж и не обновлявшиеся более года), удалены.
  • Выполните вручную функцию wpweb_get_inactive_products(365) через отладчик или временный вызов, чтобы проверить список до удаления.
  • Проверьте логи сервера, чтобы убедиться, что задача WP-Cron срабатывает без ошибок.

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

  • Продукты не удаляются: проверьте, что функция wp_delete_post вызывается с параметром true для полного удаления. Убедитесь в наличии прав на удаление у пользователя.
  • Удаляются нужные продукты: уточните критерии фильтрации, возможно, стоит увеличить период или добавить дополнительные проверки, например, по статусу продукта.
  • Задача WP-Cron не запускается: проверьте, включен ли WP-Cron в настройках сайта (константа DISABLE_WP_CRON не установлена в true). Для теста вызовите вручную do_action('wpweb_delete_inactive_products_cron').

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

  • Перед удалением сделайте резервную копию базы данных, особенно если у вас много товаров.
  • Для больших магазинов с тысячами товаров используйте пакетную обработку (например, удалять по 50-100 товаров за раз), чтобы избежать превышения лимита времени выполнения скрипта.
  • Добавьте логирование удаленных продуктов в файл, чтобы при необходимости можно было отследить удаление.
  • Используйте пользовательские роли и права доступа, чтобы ограничить возможность удаления только администраторам.

Чек-лист для внедрения автоматического удаления неактивных продуктов

  1. Определить критерии "неактивности" продукта (продажи, дата обновления).
  2. Написать функцию выборки неактивных товаров.
  3. Реализовать функцию удаления товаров по ID.
  4. Настроить WP-Cron для регулярного запуска удаления.
  5. Проверить корректность работы на тестовом сайте.
  6. Сделать резервную копию перед первой массовой очисткой.
  7. Добавить логирование и уведомления (по желанию).

Сравнение подходов: плагин vs собственный код

МетодПлюсыМинусы
Плагин (например, WP Bulk Delete)Удобный интерфейс, готовые фильтры, поддержка расписанийДополнитель нагрузка, возможны конфликты, ограниченная гибкость
Собственный код (как описано выше)Точная настройка, минимальная нагрузка, полный контрольТребует навыков программирования, нужно тестировать и поддерживать
Как создать свой плагин для WordPress с нуля: пошаговое руководство
04.11.2025
Как добавить автоматическое удаление старых комментариев в WordPress
09.04.2026
Как удалить или изменить метаданные продуктов WooCommerce без плагинов
21.05.2026
Как удалить неиспользуемые виджеты в WordPress для оптимизации сайта
11.02.2026
Как удалить записи из WooCommerce без удаления товаров
07.05.2026