Диагностика проблемы: почему в WooCommerce накапливаются неактивные товары
В интернет-магазинах на WooCommerce часто накапливаются товары, которые давно не обновлялись и не продаются. Это снижает производительность сайта и усложняет администрирование. Автоматизация удаления таких товаров по дате последнего обновления поможет поддерживать каталог в актуальном состоянии и улучшить скорость работы.
Как определить неактивные товары по дате обновления
Под неактивными товарами будем понимать записи типа product, у которых post_modified старше заданного срока — например, 180 дней.
Проверить дату обновления товаров можно SQL-запросом в базе данных:
SELECT ID, post_title, post_modified FROM wp_posts WHERE post_type = 'product' AND post_status = 'publish' ORDER BY post_modified ASC;Обратите внимание: wp_ — префикс таблиц, может отличаться в вашей установке.
Пошаговое решение: автоматическое удаление товаров с помощью WP-Cron
1. Создаём функцию для удаления товаров
function wpteam_delete_old_products() {
$days = 180; // Количество дней неактивности
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$args = [
'post_type' => 'product',
'post_status' => ['publish', 'private'],
'date_query' => [
[
'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_schedule_delete_old_products() {
if (!wp_next_scheduled('wpteam_cron_delete_old_products')) {
wp_schedule_event(time(), 'daily', 'wpteam_cron_delete_old_products');
}
}
add_action('wp', 'wpteam_schedule_delete_old_products');
add_action('wpteam_cron_delete_old_products', 'wpteam_delete_old_products');3. Добавляем код в файл functions.php вашей темы или в отдельный плагин
После добавления кода функция будет запускаться ежедневно, удаляя товары, не обновлявшиеся больше 180 дней.
Проверка результата после внедрения
- В админке WooCommerce проверьте список товаров: устаревшие должны исчезнуть.
- Для проверки можно временно установить
$days = 1;и создать товар с датой обновления более суток назад — он должен удалиться после срабатывания WP-Cron. - В журнале ошибок PHP или с помощью плагина для логов проверьте наличие ошибок при выполнении задания.
Частые ошибки и как исправить
- Ошибка: задания WP-Cron не выполняются.
Причина: WP-Cron зависит от посещений сайта. Если трафик низкий, задачи могут не запускаться.
Решение: настроить системный cron на сервере, вызывающийwp-cron.phpпо расписанию. - Ошибка: товары не удаляются.
Причина: неверные параметры в запросе, например, неправильный префикс таблиц или статус товаров.
Решение: убедитесь, что товары имеют статусpublishилиprivate, и используйте WP_Query с корректными аргументами. - Ошибка: удаляются нужные товары.
Причина: слишком большой период или некорректный фильтр.
Решение: протестируйте на тестовом сайте и подберите оптимальный период неактивности.
Практические советы по безопасности и производительности
- Удаляйте товары только после резервного копирования базы данных.
- Не используйте
wp_delete_postс параметром$force_delete = false, чтобы не оставлять мусор в корзине. - Оптимизируйте запросы, ограничивая количество обрабатываемых товаров за один запуск, если их очень много.
- Для больших магазинов лучше реализовать пакетную обработку с задержками для снижения нагрузки на сервер.
Сравнение вариантов реализации автоматического удаления товаров
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| WP-Cron + кастомный код | Без плагинов, гибкая настройка, полный контроль | Зависит от посещаемости, требует тестирования | Настроить системный cron для надёжности |
| Плагины автоматизации (например, WP All Import с удалением) | Простота установки, готовый функционал | Могут грузить сайт, ограниченная кастомизация | Использовать на небольших сайтах |
| Ручное удаление через админку | Простота, полная безопасность | Трудозатратно, непрактично для больших каталогов | Использовать для точечной очистки |