Диагностика проблемы: зачем и когда нужно удалять неактивные товары
В крупных интернет-магазинах на WooCommerce со временем накапливаются товары, которые больше не продаются, устарели или временно неактивны. Их хранение ведет к разрастанию базы данных, снижению производительности, усложнению управления каталогом. Автоматизация удаления таких товаров по определённым правилам помогает поддерживать чистоту каталога и ускорять работу сайта.
Как определить неактивные товары для удаления
Под неактивными товарами чаще всего подразумеваются:
- Товары с выключенным статусом публикации ('draft', 'pending', 'private').
- Товары, которые не обновлялись или не продавались более определённого времени (например, 6 месяцев).
- Товары с нулевым остатком на складе, которые не планируется пополнять.
Для автоматизации важна чёткая бизнес-логика и критерии, чтобы избежать удаления нужных товаров.
Пошаговое решение: автоматическое удаление неактивных товаров через WP-Cron
1. Создаем функцию для удаления товаров
function wpsell_delete_inactive_products() {
$args = array(
'post_type' => 'product',
'post_status' => array('draft', 'pending', 'private'),
'date_query' => array(
array(
'column' => 'post_modified_gmt',
'before' => '6 months ago',
),
),
'posts_per_page' => -1,
'fields' => 'ids',
);
$query = new WP_Query($args);
if ($query->have_posts()) {
foreach ($query->posts as $product_id) {
wp_delete_post($product_id, true); // Полное удаление
}
}
}2. Регистрируем WP-Cron задачу для периодического запуска
function wpsell_schedule_product_cleanup() {
if (! wp_next_scheduled('wpsell_daily_product_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpsell_daily_product_cleanup');
}
}
add_action('wp', 'wpsell_schedule_product_cleanup');
add_action('wpsell_daily_product_cleanup', 'wpsell_delete_inactive_products');3. Очистка WP-Cron при отключении темы или плагина
function wpsell_clear_product_cleanup_schedule() {
$timestamp = wp_next_scheduled('wpsell_daily_product_cleanup');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpsell_daily_product_cleanup');
}
}
register_deactivation_hook(__FILE__, 'wpsell_clear_product_cleanup_schedule');Проверка результата после внедрения
Чтобы убедиться, что автоматическое удаление работает:
- Создайте тестовый товар со статусом 'draft' и датой последнего изменения старше 6 месяцев.
- Запустите вручную cron задачу через WP-CLI:
wp cron event run wpsell_daily_product_cleanupили подождите следующий запуск по расписанию. - Проверьте, что товар удалён из админки WooCommerce и базы данных (таблица
wp_posts).
Частые ошибки и как исправить
- WP-Cron не запускается автоматически: на некоторых хостингах cron зависит от посещаемости сайта. Проверьте cron через плагин WP Crontrol или настройте системный cron.
- Удаление не происходит из-за неправильных статусов: убедитесь, что в запросе указаны корректные статусы. Для проверки можно временно вывести ID товаров перед удалением.
- Непреднамеренное удаление активных товаров: добавьте дополнительную проверку, например, по метаданным или наличию заказов, чтобы не удалить товары с историей продаж.
Практические советы по безопасности и производительности
- Всегда делайте резервные копии базы данных перед запуском автоматического удаления.
- Для больших магазинов разбивайте удаление на порции, чтобы избежать таймаутов и блокировок БД.
- Логируйте удалённые товары в отдельный файл, чтобы можно было отследить процесс и при необходимости восстановить удалённые позиции.
- Используйте
wp_delete_post($product_id, true)с параметромtrue, чтобы полностью удалить товар без перемещения в корзину. - Для более сложной логики удаления можно расширить функцию, учитывая остатки на складе через метаполя
_stockи историю заказов WooCommerce.
Сравнение вариантов реализации удаления товаров
| Метод | Плюсы | Минусы |
|---|---|---|
| WP-Cron + PHP код | Гибкость, полная кастомизация, отсутствие сторонних плагинов | Зависимость от правильной настройки WP-Cron, требует навыков разработки |
| Плагины очистки каталога (например, "Bulk Delete") | Простота настройки, UI, фильтры | Могут быть избыточны, влияют на производительность, не всегда подходят под точные задачи |
| Ручное удаление через админку | Полный контроль, минимальный риск ошибок | Времязатратно, не подходит для больших каталогов |