Диагностика проблемы: зачем и когда удалять неактивные товары
В интернет-магазинах на WooCommerce со временем накапливается множество товаров, которые перестали быть актуальными: устаревшие модели, товары с истекшим сроком продажи, товары, которые не продаются долгое время. Это увеличивает размер базы данных, замедляет админ-панель и усложняет поиск для покупателей.
Классический сценарий — товары со статусом draft, pending или private, которые не обновлялись и не публиковались в течение нескольких месяцев, должны автоматически удаляться, чтобы оптимизировать работу магазина.
Как выявить неактивные товары
- Статус товара отличен от
publish(например,draft,private,pending) - Дата последнего обновления или создания товара старше заданного порога (например, 180 дней)
- Отсутствие продаж или просмотров (если есть мета-данные)
Реальная задача — автоматизировать удаление таких товаров без ручного контроля.
Пошаговое решение: реализация автоматического удаления через WP-Cron
1. Создаем функцию для выборки и удаления товаров
function wpteam_delete_inactive_products() {
$days_threshold = 180; // количество дней неактивности
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_threshold . ' days'));
// Параметры запроса для товаров с нужным статусом и датой
$args = array(
'post_type' => 'product',
'post_status' => array('draft', 'pending', 'private'),
'date_query' => array(
'column' => 'post_modified',
'before' => $date_threshold,
),
'fields' => 'ids',
'posts_per_page' => -1,
);
$query = new WP_Query($args);
if (!empty($query->posts)) {
foreach ($query->posts as $product_id) {
wp_delete_post($product_id, true); // полное удаление
}
}
}2. Регистрируем WP-Cron задачу для регулярного запуска
function wpteam_register_delete_inactive_products_cron() {
if (!wp_next_scheduled('wpteam_delete_inactive_products_event')) {
wp_schedule_event(time(), 'daily', 'wpteam_delete_inactive_products_event');
}
}
add_action('wp', 'wpteam_register_delete_inactive_products_cron');
add_action('wpteam_delete_inactive_products_event', 'wpteam_delete_inactive_products');3. Опционально: функция для отмены Cron задачи
function wpteam_clear_delete_inactive_products_cron() {
$timestamp = wp_next_scheduled('wpteam_delete_inactive_products_event');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpteam_delete_inactive_products_event');
}
}Проверка результата после внедрения
- Проверьте наличие Cron задачи через плагин
Cron Managerили WP-CLI командуwp cron event list. - Создайте тестовый товар с статусом
draftи датой обновления старше 180 дней (можно отредактировать напрямую в базе или с помощью плагинаWP phpMyAdmin). - Выполните вручную функцию через WP-CLI или временно добавьте вызов функции в шаблон (например, в
functions.php) для проверки удаления. - Убедитесь, что товар удалился без ошибок и не затронул опубликованные товары.
Частые ошибки и как их исправить
- WP-Cron не запускается автоматически: На некоторых хостингах WP-Cron зависит от посещений сайта. Для стабильности настройте системный cron на вызов
wp-cron.php. - Удаление не происходит: Проверьте, что функция вызывается и параметры
WP_Queryкорректны. Логи PHP и WordPress помогут найти ошибки. - Удаляются нужные товары: Будьте осторожны с датами и статусами. Лучше сначала использовать
wp_trash_post()вместо полного удаления для теста. - Большая нагрузка при выборке: Для магазинов с тысячами товаров разбивайте удаление на партии с помощью
posts_per_pageи циклов.
Практические советы по безопасности и производительности
- Используйте привилегированную роль администратора для выполнения удаления — функция вызывается из контекста WP-Cron, где есть все права.
- Всегда делайте резервные копии базы данных перед запуском автоматического удаления.
- Логируйте удаленные товары в отдельный файл или таблицу для аудита.
- Для крупных магазинов запускайте очистку в ночное время, чтобы не нагружать сервер.
- Если хотите расширить функционал, добавьте параметр для исключения товаров с определенными метками или категориями.
Сравнение способов удаления неактивных товаров
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| Удаление вручную через админку | Простота, контроль | Трудоемко, риск пропуска | Подходит для малого каталога |
| Плагины очистки (например, WP Sweep) | Автоматизация, готовые настройки | Могут не учитывать кастомные статусы | Использовать с осторожностью и тестировать |
| Код на WP-Cron (описанный в статье) | Гибкость, точечное управление, без лишних плагинов | Требует навыков, настройка cron | Оптимальный для средних и крупных магазинов |