Диагностика проблемы: зачем и когда нужно удалять неактивные товары
В интернет-магазинах на WooCommerce со временем накапливаются товары, которые перестали продаваться или давно не обновлялись. Это влияет на производительность сайта, усложняет навигацию и снижает релевантность каталога для покупателей. Автоматическое удаление таких товаров позволяет поддерживать базу данных в актуальном состоянии и освобождать ресурсы сервера.
Как определить товары для удаления
- Товары, у которых дата последнего обновления (post_modified) старше определённого периода, например, 6 месяцев.
- Товары со статусом "черновик" (draft) или "ожидает" (pending) более 30 дней.
- Товары с нулевым остатком и без продаж за последний год.
Пошаговое решение: автоматизация удаления товаров по неактивности
1. Создание WP-Cron задачи для регулярной проверки
Добавим в файл functions.php вашей темы следующий код, который будет запускать функцию очистки товаров раз в неделю:
if (!wp_next_scheduled('wc_delete_inactive_products_weekly')) {
wp_schedule_event(time(), 'weekly', 'wc_delete_inactive_products_weekly');
}
add_action('wc_delete_inactive_products_weekly', 'wc_delete_inactive_products');2. Функция удаления неактивных товаров
Эта функция находит товары, которые не обновлялись более 180 дней, и удаляет их из базы без возможности восстановления (без корзины):
function wc_delete_inactive_products() {
global $wpdb;
$days_inactive = 180; // 180 дней
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days_inactive} days"));
// Получаем ID товаров для удаления
$product_ids = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts}
WHERE post_type = 'product'
AND post_modified < %s
AND post_status = 'publish'",
$date_threshold
));
if (!empty($product_ids)) {
foreach ($product_ids as $product_id) {
// Удаляем товар без перемещения в корзину
wp_delete_post($product_id, true);
}
}
}3. Дополнительные условия для фильтрации товаров
Если необходимо, можно добавить проверку на наличие остатков и продаж:
// Пример дополнительной фильтрации
$product_ids = $wpdb->get_col($wpdb->prepare(
"SELECT p.ID FROM {$wpdb->posts} p
LEFT JOIN {$wpdb->postmeta} pm_stock ON (p.ID = pm_stock.post_id AND pm_stock.meta_key = '_stock')
LEFT JOIN {$wpdb->prefix}woocommerce_order_items oi ON oi.order_item_name = p.post_title
WHERE p.post_type = 'product'
AND p.post_modified < %s
AND p.post_status = 'publish'
AND (pm_stock.meta_value IS NULL OR pm_stock.meta_value = '0')",
$date_threshold
));Проверка результата после внедрения
- Запустите функцию вручную для теста:
do_action('wc_delete_inactive_products_weekly'); - Проверьте в админке WooCommerce наличие и количество товаров до и после выполнения.
- Подключите логи (через error_log или плагин для логирования), чтобы фиксировать удалённые ID.
- Сделайте резервную копию базы данных перед тестированием.
Частые ошибки и как их исправить
- Ошибка: Товары не удаляются.
Причина: Запрос не находит товаров из-за неправильного формата даты или статуса.
Решение: Проверьте формат даты и статус публикации. Для теста увеличьте период неактивности. - Ошибка: WP-Cron не срабатывает.
Причина: WP-Cron зависит от посещений сайта, низкая посещаемость может задерживать выполнение.
Решение: Настройте системный cron на вызовwp-cron.phpили запустите вручную. - Ошибка: Удаление происходит слишком часто или слишком редко.
Причина: Неправильный интервал планировщика.
Решение: Используйте 'weekly' или создайте свой интервал через фильтрcron_schedules.
Практические советы по безопасности и производительности
- Перед удалением всегда делайте резервную копию базы данных.
- Логируйте ID удалённых товаров для аудита и отката ошибок.
- Для больших баз лучше реализовать пакетное удаление по 50–100 товаров за раз, чтобы избежать таймаутов.
- Реализуйте проверку прав пользователя, если запускаете удаление из интерфейса администратора.
- Оптимизируйте запросы с помощью индексов по
post_typeиpost_modified.
Таблица сравнения подходов к удалению неактивных товаров
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| WP-Cron + код в functions.php | Полный контроль, бесплатно, адаптивно | Зависит от посещаемости, требует навыков | Код из статьи |
| Плагин очистки (например, WP Sweep) | Простота установки, интерфейс | Может удалять лишнее, ограниченная настройка | WP Sweep (https://wpshop.ru/plugins/clearfy?source=wpteam.ru&medium=article&campaign=woocommerce-avtomaticheskoe-udaleniye-tovarov-po-neaktivnosti) |
| Ручное удаление через админку | Безопасно, контроль | Трудозатратно на больших магазинах | Вручную в WooCommerce |