Диагностика проблемы: зачем и когда нужно удалять неактивные товары
В магазинах на 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 | Средние и крупные магазины |
| Плагин очистки товаров | Удобный интерфейс | Может добавлять нагрузку, не всегда гибко | Быстрое решение без кода |