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

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

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

Чтобы убедиться, что в вашем магазине есть такие товары, выполните SQL-запрос к базе данных, который покажет количество продаж по каждому товару за последний год:

SELECT p.ID, p.post_title, IFNULL(SUM(oi.qty), 0) AS total_sales
FROM wp_posts p
LEFT JOIN wp_woocommerce_order_items oi ON p.ID = oi.order_item_id
WHERE p.post_type = 'product'
AND p.post_status = 'publish'
GROUP BY p.ID
ORDER BY total_sales ASC;

Если среди товаров много с нулевыми или минимальными продажами, стоит рассмотреть автоматизацию их удаления.

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

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

Используем WP_Query для выборки товаров с продажами ниже заданного порога за последний год.

function get_low_sales_products( $sales_threshold = 5 ) {
    global $wpdb;
    $date_from = date( 'Y-m-d', strtotime( '-1 year' ) );

    $query = $wpdb->prepare(
        "SELECT p.ID, p.post_title, COALESCE(SUM(oi_meta.meta_value), 0) AS total_sales
        FROM {$wpdb->posts} p
        LEFT JOIN {$wpdb->prefix}woocommerce_order_items oi ON p.ID = oi.order_item_id
        LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta oi_meta ON oi.order_item_id = oi_meta.order_item_id AND oi_meta.meta_key = '_qty'
        INNER JOIN {$wpdb->posts} o ON o.ID = oi.order_id AND o.post_type = 'shop_order' AND o.post_status IN ('wc-completed', 'wc-processing')
        WHERE p.post_type = 'product' AND p.post_status = 'publish' AND o.post_date >= %s
        GROUP BY p.ID
        HAVING total_sales < %d",
        $date_from,
        $sales_threshold
    );

    return $wpdb->get_results( $query );
}

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

Удаляем товары программно через wp_delete_post(), чтобы корректно очистить все данные.

function delete_products_by_ids( $product_ids ) {
    foreach ( $product_ids as $product ) {
        wp_delete_post( $product->ID, true ); // true - принудительное удаление без перемещения в корзину
    }
}

3. Запуск удаления по расписанию с использованием WP-Cron

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

add_action( 'wp_low_sales_products_cleanup', 'low_sales_products_cleanup_callback' );

function low_sales_products_cleanup_callback() {
    $low_sales_products = get_low_sales_products( 5 ); // товары с менее 5 продаж
    if ( ! empty( $low_sales_products ) ) {
        delete_products_by_ids( $low_sales_products );
    }
}

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

// Отключение при деактивации
register_deactivation_hook( __FILE__, function() {
    wp_clear_scheduled_hook( 'wp_low_sales_products_cleanup' );
});

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

  • В админке WooCommerce проверьте количество товаров до и после запуска запланированной задачи.
  • Используйте SQL-запрос из раздела диагностики, чтобы убедиться, что товары с низкими продажами удалены.
  • Проверьте логи WP-Cron, если установлен плагин для мониторинга заданий (например, WP Crontrol), чтобы убедиться, что задача выполняется.

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

  • Неверный статус заказов: В выборке важно учитывать только оплаченные или завершённые заказы (wc-completed, wc-processing). Если включить отменённые или черновики, статистика будет некорректной.
  • Отсутствие прав на удаление: wp_delete_post() требует прав администратора. Запускайте код либо из плагина, либо из темы с правильными правами.
  • Проблемы с WP-Cron: WP-Cron может не запускаться на низкозагруженных сайтах. Для надежности настроьте системный cron или запускайте вручную через WP CLI.
  • Удаление нужных товаров: Проверьте порог продаж и период выборки, чтобы не удалить потенциально полезные товары с редкими, но важными продажами.

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

  • Перед автоматическим удалением создавайте резервные копии базы данных — например, с помощью плагина Clearfy Pro (https://wpshop.ru/plugins/clearfy).
  • Если каталог очень большой, разбивайте удаление на партии, чтобы избежать таймаутов.
  • Добавьте логирование удалённых товаров для аудита и возможного восстановления.
  • Для улучшения производительности используйте transient-кэширование результатов выборки, обновляя кэш раз в сутки.
  • Проверяйте совместимость с другими плагинами WooCommerce, которые могут влиять на статусы заказов и отчёты.

Сравнение подходов к удалению товаров с низкими продажами

МетодПлюсыМинусы
Ручное удаление через админкуПростой, не требует кодаТрудоёмко, риск пропуска товаров
SQL-запросы + ручное удалениеУскоряет поиск товаровРиск ошибок при удалении, требует навыков SQL
Автоматическое удаление через WP-Cron и кодПолная автоматизация, контроль, масштабируемостьТребует программирования, настройка cron
WooCommerce: автоматическое отключение способов оплаты при проблемах с интернет-соединением
24.06.2026
Как автоматически удалить старые пункты в меню WordPress по дате создания
20.02.2026
Как добавить автоматическое удаление неактивных пользователей в WordPress
14.02.2026
Как настроить удалённый запуск задач в WordPress с помощью WP-Cron
20.01.2026
Как создать настройки плагинов WordPress с использованием Settings API
09.01.2026