Диагностика проблемы: зачем и когда нужно удалять старые товары без продаж
В интернет-магазинах на WooCommerce со временем накапливаются товары, которые не пользуются спросом и занимают место в базе данных. Это замедляет работу сайта, усложняет администрирование и негативно сказывается на SEO. Важно уметь автоматически удалять такие товары, основываясь на дате добавления и отсутствии заказов.
Типичные признаки необходимости удаления товара:
- Товар опубликован более 6 месяцев назад;
- За ним нет ни одного оплаченного заказа;
- Товар не находится в активных промоакциях или не должен храниться для отчетности.
Как проверить, что в магазине есть такие товары
Для диагностики можно выполнить SQL-запрос к базе данных:
SELECT p.ID, p.post_title, p.post_date FROM wp_posts p
LEFT JOIN wp_woocommerce_order_items oi ON oi.order_item_name = p.ID
LEFT JOIN wp_woocommerce_order_itemmeta oim ON oim.order_item_id = oi.order_item_id AND oim.meta_key = '_product_id'
LEFT JOIN wp_posts o ON o.ID = oi.order_id AND o.post_status IN ('wc-completed', 'wc-processing')
WHERE p.post_type = 'product'
AND o.ID IS NULL
AND p.post_date < DATE_SUB(NOW(), INTERVAL 6 MONTH);Этот запрос выводит товары старше 6 месяцев без оплаченных заказов.
Пошаговое решение: автоматизация удаления товаров с помощью кода
1. Создаем функцию для выборки и удаления товаров
Добавьте следующий код в файл functions.php вашей дочерней темы или в отдельный плагин:
function wpscan_delete_old_unsold_products() {
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'date_query' => [
[
'before' => '6 months ago',
],
],
'fields' => 'ids',
'meta_query' => [
[
'key' => '_stock_status',
'value' => 'instock',
'compare' => '=',
],
],
'tax_query' => [],
];
$products = get_posts($args);
foreach ($products as $product_id) {
// Проверяем, есть ли оплаченные заказы с этим товаром
global $wpdb;
$count = $wpdb->get_var($wpdb->prepare(
"SELECT COUNT(*) FROM {$wpdb->prefix}woocommerce_order_items oi
JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim ON oi.order_item_id = oim.order_item_id
JOIN {$wpdb->prefix}posts p ON oi.order_id = p.ID
WHERE oim.meta_key = '_product_id'
AND oim.meta_value = %d
AND p.post_status IN ('wc-completed', 'wc-processing')",
$product_id
));
if (intval($count) === 0) {
wp_delete_post($product_id, true); // Полное удаление без перемещения в корзину
}
}
}2. Запускаем функцию по расписанию через wp-cron
Добавьте в functions.php следующий код для регистрации планировщика:
if (! wp_next_scheduled('wpscan_daily_delete_old_products')) {
wp_schedule_event(time(), 'daily', 'wpscan_daily_delete_old_products');
}
add_action('wpscan_daily_delete_old_products', 'wpscan_delete_old_unsold_products');3. Как запустить вручную
Для тестирования вызовите функцию напрямую из админки или через WP-CLI:
wp eval 'wpscan_delete_old_unsold_products();'Проверка результата после внедрения
- Проверьте в админке WooCommerce, что товары старше 6 месяцев без заказов исчезли.
- Повторите SQL-запрос из раздела диагностики — он должен возвращать пустой результат для старых товаров без продаж.
- Проверьте логи сервера на предмет ошибок выполнения функции.
Частые ошибки и как их исправить
- Удаляются нужные товары: Проверьте условия выборки, убедитесь, что фильтр по заказам работает корректно.
- Товары не удаляются: Возможно, wp-cron не работает. Проверьте работоспособность запланированных событий с помощью плагина WP Crontrol.
- Отсутствие прав на удаление: Убедитесь, что код запускается с правами администратора, особенно при запуске через WP-CLI.
- Проблемы с производительностью при большом количестве товаров: Добавьте пагинацию выборки, чтобы обрабатывать товары партиями.
Практические советы по безопасности и производительности
- Запускайте удаление в ночное время для снижения нагрузки на сервер.
- Перед удалением создавайте резервную копию базы данных.
- Для больших магазинов используйте пакетную обработку: например, обрабатывать 50 товаров за один запуск.
- Используйте плагин Clearfy Pro (https://wpshop.ru/plugins/clearfy?source=wpscan.ru&medium=article&campaign=woocommerce-avtomaticheskoe-udalenie-staryh-tovarov-bez-prodazh) для оптимизации базы и очистки метаданных.
Сравнение способов удаления старых товаров
| Метод | Преимущества | Недостатки |
|---|---|---|
| Код с wp-cron | Автоматизация, гибкая настройка, бесплатное решение | Зависимость от корректной работы wp-cron, требует навыков |
| Плагины очистки базы | Простота использования, дополнительные функции оптимизации | Может перегружать сайт, лицензии, не всегда гибко |
| Ручное удаление через админку | Полный контроль, нет риска ошибок кода | Затратно по времени, риск пропуска товаров |