Диагностика проблемы: зачем удалять неактивные товары в WooCommerce
Интернет-магазин на WooCommerce со временем может накапливать множество товаров, которые не продаются и не приносят доход. Это негативно влияет на производительность сайта, усложняет навигацию и мешает SEO. Ручное удаление таких товаров неудобно и занимает много времени. Автоматизация процесса удаления позволяет поддерживать каталог актуальным и ускоряет работу магазина.
Как определить товары для удаления
Первый шаг — понять, по каким критериям отбирать товары для удаления. Обычно используют следующие параметры:
- Отсутствие продаж за последние N дней (например, 180 дней);
- Статус товара — опубликован или черновик;
- Отсутствие заказов с товарами в нужный период;
- Не учитывать товары с определёнными метками или категориями (например, хиты продаж или новые поступления).
Пример SQL-запроса для поиска товаров без продаж за 180 дней
SELECT p.ID FROM wp_posts p
LEFT JOIN wp_woocommerce_order_items oi ON oi.order_item_name = p.post_title
LEFT JOIN wp_woocommerce_order_itemmeta oim ON oim.order_item_id = oi.order_item_id
LEFT JOIN wp_posts orders ON orders.ID = oi.order_id AND orders.post_status IN ('wc-completed', 'wc-processing')
WHERE p.post_type = 'product'
AND p.post_status = 'publish'
AND (orders.ID IS NULL OR orders.post_date < DATE_SUB(NOW(), INTERVAL 180 DAY))
GROUP BY p.ID;Однако для безопасности и удобства лучше использовать WP API и хуки.
Пошаговое решение: автоматическое удаление товаров без продаж
1. Создаем функцию для удаления товаров
function wpbit_delete_inactive_products() {
$days_inactive = 180; // период без продаж
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_inactive . ' days'));
// Получаем ID товаров, у которых не было заказов за этот период
global $wpdb;
$product_ids = $wpdb->get_col($wpdb->prepare(
"SELECT p.ID FROM {$wpdb->posts} p
LEFT JOIN {$wpdb->prefix}woocommerce_order_items oi ON oi.order_item_name = p.post_title
LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim ON oim.order_item_id = oi.order_item_id
LEFT JOIN {$wpdb->posts} orders ON orders.ID = oi.order_id AND orders.post_status IN ('wc-completed', 'wc-processing')
WHERE p.post_type = 'product'
AND p.post_status = 'publish'
AND (orders.ID IS NULL OR orders.post_date < %s)
GROUP BY p.ID",
$date_threshold
));
if (empty($product_ids)) {
return;
}
foreach ($product_ids as $product_id) {
wp_delete_post($product_id, true); // жесткое удаление
}
}2. Планируем запуск функции через WP-Cron
function wpbit_schedule_inactive_products_deletion() {
if (!wp_next_scheduled('wpbit_delete_inactive_products_hook')) {
wp_schedule_event(time(), 'daily', 'wpbit_delete_inactive_products_hook');
}
}
add_action('wp', 'wpbit_schedule_inactive_products_deletion');
add_action('wpbit_delete_inactive_products_hook', 'wpbit_delete_inactive_products');3. Отключение WP-Cron (опционально)
Если на сайте много трафика или WP-Cron нестабилен, рекомендуется отключить его и настроить системный cron на выполнение wp-cron.php.
Как проверить, что удаление товаров сработало
- Перед запуском сделайте бэкап базы данных.
- В админке WooCommerce проверьте количество товаров до и после запуска.
- Запустите функцию вручную, добавив вызов
wpbit_delete_inactive_products();в шаблон или через WP-CLI (wp eval 'wpbit_delete_inactive_products();'). - Проверьте логи ошибок и удаленные записи в базе (таблица
wp_postsс типомproduct).
Частые ошибки и их исправление
- Удаляются товары с продажами: проверяйте совпадение названий товаров и товаров в заказах, лучше использовать ID товаров и мета-данные заказов.
- Функция не запускается: убедитесь, что WP-Cron активен и событие запланировано.
- Ошибки SQL: проверяйте префиксы таблиц, особенно если они нестандартные.
- Повреждение данных: всегда делайте резервные копии перед массовыми операциями.
Практические советы по безопасности и производительности
- Используйте транзакции и проверки при работе с базой данных.
- Ограничьте удаление только товарами с определенными статусами.
- Добавьте логирование удаленных товаров в отдельный файл или таблицу.
- Проверяйте совместимость с кеширующими плагинами и очищайте кеш после удаления.
Сравнение способов автоматизации удаления товаров
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| WP-Cron с кастомной функцией | Гибкость, полное управление, без сторонних плагинов | Зависит от посещаемости сайта, требует знаний кода | Код из статьи |
| Плагины очистки WooCommerce | Простота установки, готовый интерфейс | Могут быть лишние функции, нагрузка на сайт | WooCommerce Bulk Delete |
| Системный cron + WP-CLI | Надежность, не зависит от WP-Cron | Требует доступа к серверу и навыков sysadmin | wp eval 'wpbit_delete_inactive_products();' |