Диагностика задачи: зачем и когда нужна автоматизация удаления товаров
В WooCommerce часто возникает необходимость автоматически удалять товары, которые долго находятся на складе без движений — например, товары, не продающиеся более 90 дней. Это помогает не засорять каталог устаревшими позициями, снижать нагрузку на базу и повышать релевантность ассортимента. Проблема в том, что WooCommerce по умолчанию не предусматривает автоматическую очистку товаров по сроку хранения.
Как определить товары для удаления по дате добавления или последнего обновления
Первый шаг — правильно определить критерии удаления. Обычно это дата создания товара (post_date) или дата последнего обновления (post_modified).
Пример запроса для диагностики в базе данных, чтобы увидеть товары старше 90 дней:
SELECT ID, post_title, post_date FROM wp_posts WHERE post_type = 'product' AND post_status = 'publish' AND post_date < DATE_SUB(NOW(), INTERVAL 90 DAY);Если хотите ориентироваться на дату последнего обновления, замените post_date на post_modified.
Пошаговое решение: как автоматически удалять товары по сроку хранения через WP-Cron
Реализуем автоматическую очистку товаров с помощью планировщика задач WordPress (WP-Cron) и PHP.
1. Добавляем функцию удаления старых товаров
function wpupload_delete_old_products() {
global $wpdb;
$days = 90; // количество дней хранения
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
// Получаем ID товаров, которые старше пороговой даты
$old_products = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'product' AND post_status = 'publish' AND post_date < %s",
$date_threshold
));
if (!empty($old_products)) {
foreach ($old_products as $product_id) {
wp_trash_post($product_id); // перемещаем товар в корзину
}
}
}2. Регистрируем событие WP-Cron, если оно еще не зарегистрировано
function wpupload_schedule_delete_old_products() {
if (!wp_next_scheduled('wpupload_daily_delete_old_products')) {
wp_schedule_event(time(), 'daily', 'wpupload_daily_delete_old_products');
}
}
add_action('wp', 'wpupload_schedule_delete_old_products');
add_action('wpupload_daily_delete_old_products', 'wpupload_delete_old_products');3. Очистка корзины от удалённых товаров (по желанию)
Если хотите полностью удалять товары, а не помещать в корзину, добавьте задачу очистки корзины:
function wpupload_empty_trash() {
global $wpdb;
$trash_threshold = date('Y-m-d H:i:s', strtotime('-30 days')); // например, удалять товары из корзины старше 30 дней
$old_trashed = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'product' AND post_status = 'trash' AND post_modified < %s",
$trash_threshold
));
if (!empty($old_trashed)) {
foreach ($old_trashed as $product_id) {
wp_delete_post($product_id, true); // окончательное удаление
}
}
}
add_action('wpupload_daily_delete_old_products', 'wpupload_empty_trash');Как проверить, что автоматическое удаление работает
- Проверьте наличие запланированного события через WP-CLI:
wp cron event list --fields=hook,next_run, найдитеwpupload_daily_delete_old_products. - Добавьте в функцию
wpupload_delete_old_productsлогирование, например, запись в файл или error_log, чтобы отследить удаляемые ID. - Проверьте, что товары старше 90 дней после запуска крона перемещаются в корзину (статус
trashв базе данных). - Запустите вручную функцию через консоль или временно через admin-ajax для теста.
Частые ошибки и их исправление
- WP-Cron не срабатывает — часто на хостингах нет реального cron, WP-Cron запускается при посещении сайта. Для надежности настройте системный cron для вызова
wp cron event run --due-now. - Функция не удаляет товары — проверьте правильность условий даты и статус товара. Убедитесь, что товары действительно старше 90 дней и опубликованы.
- Удаляются не те товары — проверьте SQL-запрос в функции и уточните критерии (например, использовать
post_modifiedвместоpost_date). Можно дополнить условие метаполями. - Удаление приводит к потерям важных товаров — перед удалением добавьте уведомления или создайте резервные копии базы.
Практические советы по безопасности и производительности
- Запускайте удаление не чаще одного раза в сутки, чтобы не перегружать сервер.
- В логах фиксируйте ID удалённых товаров для аудита.
- Перед удалением делайте резервные копии базы и медиа.
- Если товаров много, реализуйте удаление партиями (например, по 50 товаров за один запуск), чтобы избежать таймаутов.
- Используйте транзакции базы для безопасного удаления при необходимости.
Сравнение вариантов реализации
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| WP-Cron + PHP код | Гибкость, контроль, без сторонних плагинов | Зависит от посещаемости сайта, требует отладки | Настроить системный cron для надежности |
| Плагины автоочистки (например, Clearfy Pro) | Простота настройки, готовые функции | Могут быть избыточными, нагрузка, платные | Использовать для крупных сайтов с поддержкой |
| Ручное удаление через админку | Безопасно, контроль пользователем | Неавтоматично, трудозатратно при большом каталоге | Рекомендуется как резервный вариант |