Диагностика проблемы: почему нужны автоматические удаления товаров
В интернет-магазинах на WooCommerce часто накапливается множество товаров, которые не продаются, не обновлялись и не привлекают покупателей. Это приводит к увеличению размера базы данных, ухудшению производительности и затруднённому управлению каталогом. Ручное удаление — трудоёмкий процесс, особенно при большом количестве товаров.
Автоматизация удаления неактивных товаров поможет поддерживать каталог в актуальном состоянии, улучшить производительность сайта и повысить удобство управления.
Определение критериев для удаления товаров
Прежде чем запускать автоматическое удаление, нужно чётко определить, что считать «неактивным товаром». Чаще всего используют следующие параметры:
- Отсутствие продаж за последний период (например, 6 месяцев).
- Отсутствие обновлений или изменений описания и цены.
- Отсутствие просмотров или интереса (если аналитика есть).
В этом руководстве мы возьмём за основу первый критерий — отсутствие продаж за 180 дней, поскольку это объективный показатель неактивности.
Реализация автоматического удаления товаров с помощью WP-Cron
1. Создание функции удаления неактивных товаров
Ниже пример функции, которая находит товары без продаж за последние 180 дней и удаляет их из базы:
function wc_delete_inactive_products() {
if ( ! class_exists( 'WooCommerce' ) ) {
return; // WooCommerce не активен
}
global $wpdb;
$days_inactive = 180;
$date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days_inactive} days" ) );
// Получаем ID товаров без заказов за последние 180 дней
$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.ID
LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim ON oim.order_item_id = oi.order_item_id
LEFT JOIN {$wpdb->posts} o ON o.ID = oi.order_id
WHERE p.post_type = 'product'
AND (o.post_date IS NULL OR o.post_date < %s)
AND p.post_status = 'publish'",
$date_threshold
) );
if ( empty( $product_ids ) ) {
return; // Нет товаров для удаления
}
foreach ( $product_ids as $product_id ) {
wp_delete_post( $product_id, true ); // Жёсткое удаление товара
}
}2. Регистрация WP-Cron задачи
Добавим ежедневное выполнение функции:
function wc_schedule_delete_inactive_products() {
if ( ! wp_next_scheduled( 'wc_daily_delete_inactive_products' ) ) {
wp_schedule_event( time(), 'daily', 'wc_daily_delete_inactive_products' );
}
}
add_action( 'wp', 'wc_schedule_delete_inactive_products' );
add_action( 'wc_daily_delete_inactive_products', 'wc_delete_inactive_products' );Проверка результата после внедрения
Чтобы проверить, что автоматическое удаление работает:
- Выполните функцию вручную, вызвав
wc_delete_inactive_products()из консоли WP-CLI или временно через хукinit. - Проверьте, что товары без заказов старше 180 дней удалились.
- Проверьте логи сервера на предмет ошибок.
- Убедитесь, что WP-Cron запускается — можно использовать плагин WP Crontrol для мониторинга и ручного запуска событий.
Частые ошибки и как их исправить
- Неправильный SQL-запрос: из-за сложности связей WooCommerce запрос может не корректно находить товары. Используйте отладку через $wpdb->last_error и проверяйте вывод
$product_ids. - Функция не запускается по расписанию: проверьте, активен ли WP-Cron и нет ли конфликтов с плагинами кэширования.
- Удаление товаров, которые не должны удаляться: всегда тестируйте на копии сайта, добавляйте логирование действий и возможность отката.
- Отсутствие резервных копий: перед автоматическим удалением настройте регулярное создание бэкапов.
Практические советы по безопасности и производительности
- Логирование операций: добавьте запись в лог ID удалённых товаров, чтобы иметь возможность отследить действия.
- Ограничение нагрузки: если товаров много, удаляйте партиями — например, по 50 товаров за раз, чтобы не перегружать сервер.
- Бэкапы: используйте автоматические бэкапы перед запуском удаления. Можно интегрировать с плагинами резервного копирования или WP-CLI командами.
- Уведомления: настройте отправку email-уведомлений администратору после каждого удаления, чтобы контролировать процесс.
Таблица сравнения подходов к удалению неактивных товаров
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Ручное удаление | Полный контроль, минимальный риск ошибок | Трудоёмко, неэффективно при большом каталоге | Использовать для единичных случаев |
| Плагины для очистки WooCommerce | Удобство, часто есть интерфейс | Может не учитывать уникальные критерии, нагрузка | Подходит для типовых задач |
| Код + WP-Cron | Гибкость, автоматизация, масштабируемость | Требует навыков, риск ошибок без тестирования | Лучше для опытных разработчиков, с резервным копированием |