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

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

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

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

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

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

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

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

В functions.php активной темы или в собственном плагине добавьте следующий код:

function wpcoder_delete_inactive_products() {
    global $wpdb;
    $months_no_sales = 6;
    $min_reviews = 3;

    // Дата, начиная с которой считаем продажи
    $date_limit = date('Y-m-d H:i:s', strtotime('-' . $months_no_sales . ' months'));

    // Получаем ID товаров, у которых нет заказов за последние $months_no_sales месяцев
    $product_ids = $wpdb->get_col($wpdb->prepare(
        "SELECT p.ID FROM {$wpdb->posts} p
        LEFT JOIN (
            SELECT order_item_meta.meta_value AS product_id, MAX(p2.post_date) AS last_order_date
            FROM {$wpdb->prefix}woocommerce_order_items order_items
            JOIN {$wpdb->prefix}woocommerce_order_itemmeta order_item_meta ON order_items.order_item_id = order_item_meta.order_item_id
            JOIN {$wpdb->posts} p2 ON p2.ID = order_items.order_id
            WHERE order_item_meta.meta_key = '_product_id'
            AND p2.post_type = 'shop_order'
            AND p2.post_status IN ('wc-completed', 'wc-processing')
            GROUP BY product_id
        ) sales ON sales.product_id = p.ID
        WHERE p.post_type = 'product'
        AND p.post_status = 'publish'
        AND (sales.last_order_date IS NULL OR sales.last_order_date < %s)",
        $date_limit
    ));

    if (empty($product_ids)) {
        return 'Нет товаров для удаления';
    }

    // Фильтруем товары по количеству отзывов
    $products_to_delete = [];
    foreach ($product_ids as $product_id) {
        $comments_count = get_approved_comments_number($product_id);
        if ($comments_count < $min_reviews) {
            $products_to_delete[] = $product_id;
        }
    }

    // Удаляем выбранные товары
    foreach ($products_to_delete as $prod_id) {
        wp_delete_post($prod_id, true); // true - без перемещения в корзину
    }

    return count($products_to_delete) . ' товаров успешно удалено';
}

2. Запуск скрипта через WP-Cron

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

add_action('wpcoder_daily_product_cleanup', 'wpcoder_delete_inactive_products');

// Регистрируем ежедневное событие при активации темы или плагина
if (!wp_next_scheduled('wpcoder_daily_product_cleanup')) {
    wp_schedule_event(time(), 'daily', 'wpcoder_daily_product_cleanup');
}

3. Запуск проверки вручную (для теста)

Вы можете вызвать функцию вручную, например, добавив временный код:

add_action('admin_init', function() {
    if (current_user_can('manage_options') && isset($_GET['run_cleanup'])) {
        $result = wpcoder_delete_inactive_products();
        wp_die($result);
    }
});

После этого зайдите в админку WordPress с параметром ?run_cleanup=1 в URL, например https://example.com/wp-admin/?run_cleanup=1.

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

  1. Перед запуском сделайте резервную копию базы и файлов.
  2. В админке WooCommerce проверьте количество опубликованных товаров.
  3. Запустите ручной запуск по инструкции выше и проверьте сообщение с количеством удаленных товаров.
  4. Проверьте базу данных или список товаров — удаленные должны исчезнуть.
  5. В логах сервера/WordPress ошибок не должно быть ошибок.

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

  • Нет удаления товаров: возможно, неправильный подсчет продаж или комментариев. Проверьте, что заказы действительно имеют статусы wc-completed или wc-processing.
  • Удаляются лишние товары: проверьте параметры $months_no_sales и $min_reviews, возможно, они слишком жесткие.
  • Функция wp_delete_post не срабатывает: убедитесь, что код вызывается с правами администратора и что нет конфликтов с плагинами безопасности.
  • Проблемы с WP-Cron: проверьте, что на сайте включен WP-Cron и что нет ограничений на запуск задач.

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

  • Перед массовым удалением делайте резервное копирование базы и файлов.
  • Используйте транзакции и проверки при работе с базой (при необходимости дорабатывать код).
  • Ограничьте запуск удаления до разовых или редких задач — не чаще 1 раза в сутки.
  • Если товаров очень много, разбейте удаление на партии по 50-100 штук за один запуск, чтобы не перегружать сервер.
  • Используйте плагины Clearfy Pro для оптимизации и удаления дублей, чтобы дополнительно ускорить сайт и очистить базу.

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

МетодПлюсыМинусы
Ручное удаление в админкеПолный контроль, нет кодаТрудоемко, неэффективно на больших каталогах
Код с автоматическим удалением (описанный)Автоматизация, гибкие критерииТребует навыков, возможны ошибки без теста
Плагины оптимизации (например, Clearfy Pro)Удобство, дополнительные функции очисткиПлатные, могут конфликтовать с кастомным кодом
Как отладить проблемы с AJAX в WordPress
07.04.2026
WooCommerce: автоматическое удаление неоплаченных заказов по сроку
25.06.2026
Как использовать WP-CLI для автоматизации WordPress
04.12.2025
WooCommerce: автоматическое удаление неоплаченных заказов по срокам
01.06.2026
Автоматический импорт товаров из CSV в WooCommerce: пошаговое руководство
31.03.2026