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

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

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

Основной критерий — отсутствие продаж товара за последние 6 месяцев. Важный момент — не путать с товарами, которые временно не продаются (например, сезонные или с временно отсутствующим складом). Автоматизация с правильными фильтрами поможет экономить время и ресурсы.

Поиск товаров без продаж за последние 6 месяцев

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

Ниже пример SQL-запроса для выбора ID товаров, не имеющих продаж с указанной даты:

SELECT p.ID FROM wp_posts p
LEFT JOIN (
  SELECT DISTINCT im.meta_value AS product_id
  FROM wp_woocommerce_order_items oi
  JOIN wp_woocommerce_order_itemmeta im ON oi.order_item_id = im.order_item_id
  JOIN wp_posts o ON o.ID = oi.order_id
  WHERE im.meta_key = '_product_id'
    AND o.post_type = 'shop_order'
    AND o.post_status IN ('wc-completed', 'wc-processing')
    AND o.post_date >= DATE_SUB(NOW(), INTERVAL 6 MONTH)
) sold_products ON p.ID = sold_products.product_id
WHERE p.post_type = 'product'
  AND sold_products.product_id IS NULL;

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

Автоматическое удаление товаров с помощью WP-CLI и PHP-скрипта

Для безопасного удаления товаров без продаж удобнее использовать WP-CLI. Ниже пример PHP-скрипта, который можно запускать через wp eval-file:

<?php
// Получаем ID товаров без продаж за 6 месяцев
$products = $wpdb->get_col("SELECT p.ID FROM {$wpdb->posts} p
LEFT JOIN (
  SELECT DISTINCT im.meta_value AS product_id
  FROM {$wpdb->prefix}woocommerce_order_items oi
  JOIN {$wpdb->prefix}woocommerce_order_itemmeta im ON oi.order_item_id = im.order_item_id
  JOIN {$wpdb->posts} o ON o.ID = oi.order_id
  WHERE im.meta_key = '_product_id'
    AND o.post_type = 'shop_order'
    AND o.post_status IN ('wc-completed', 'wc-processing')
    AND o.post_date >= DATE_SUB(NOW(), INTERVAL 6 MONTH)
) sold_products ON p.ID = sold_products.product_id
WHERE p.post_type = 'product'
  AND sold_products.product_id IS NULL;");

if (!empty($products)) {
    foreach ($products as $product_id) {
        wp_delete_post($product_id, true); // true — удаление без возможности восстановления
        echo "Удалён товар ID: {$product_id}\n";
    }
} else {
    echo "Товары без продаж не найдены.\n";
}

Запустите скрипт из корня сайта командой:

wp eval-file path/to/script.php

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

Чтобы убедиться, что удаление прошло успешно:

  • Перезапустите SQL-запрос для выявления товаров без продаж — он должен вернуть пустой результат.
  • Проверьте в админке WooCommerce, что список товаров уменьшился.
  • Проверьте, что удалённые товары не появляются в поиске или через REST API.

Частые ошибки и их устранение

  • Удаление нужных товаров: если товары сезонные, добавьте дополнительный фильтр по мета-данным или таксономиям, чтобы исключить их.
  • Неверные статусы заказов: учитывайте только wc-completed и wc-processing, иначе товары могут быть ошибочно посчитаны как не продаваемые.
  • Проблемы с правами доступа: WP-CLI должен запускаться от пользователя с полными правами на WordPress.
  • Кэширование: после удаления очистите кэш сайта и объектов, чтобы изменения были видны.

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

  • Перед запуском массового удаления сделайте резервную копию базы данных.
  • Не удаляйте товары сразу, можно вместо удаления менять статус на draft или private для проверки.
  • Запускайте удаление в период минимальной нагрузки сайта, чтобы не замедлять работу.
  • Используйте WP-CLI для автоматизации и интеграции с CRON, чтобы запускать процесс регулярно.

Сравнение подходов для удаления товаров без продаж

МетодПлюсыМинусыРекомендуется для
Ручное удаление через админкуПростота, нет кодаДолгое, риск пропустить товарыНебольшие магазины
SQL-запрос + WP-CLI скриптАвтоматизация, точность, масштабируемостьТребует навыков SQL и WP-CLIСредние и крупные магазины
Плагин очистки товаровУдобный интерфейсМожет добавлять нагрузку, не всегда гибкоБыстрое решение без кода
WordPress отладка проблем с кэшем и кэш-плагинами: практические решения
08.12.2025
Автоматический импорт постов в WordPress: практическое руководство
17.01.2026
Оптимизация загрузки шаблонов в WordPress
09.03.2026
Автоматическое удаление неиспользуемых метаполей в WordPress
22.03.2026
Как создать автоматический импорт постов по RSS в WordPress
05.02.2026