Диагностика задачи: зачем удалять товары по дате публикации
В интернет-магазинах на WooCommerce часто возникает потребность автоматически очищать каталог от устаревших или сезонных товаров. Например, товары с истекшим сроком годности, ограниченными коллекциями или временными акциями. Ручное удаление занимает время и подвержено ошибкам.
Ключевая проблема — как настроить автоматическое удаление товаров, которые были опубликованы более определённого периода назад (например, 90 дней), без потери других данных и с минимальной нагрузкой на сайт.
Пошаговое решение: реализация автоматического удаления товаров по дате публикации
Шаг 1. Создание WP-Cron задачи
Чтобы автоматизировать процесс, используем встроенный планировщик задач WordPress (WP-Cron). Он будет запускать функцию удаления регулярно, например, раз в сутки.
if ( ! wp_next_scheduled( 'wprus_delete_old_products_daily' ) ) {
wp_schedule_event( time(), 'daily', 'wprus_delete_old_products_daily' );
}
Шаг 2. Функция удаления старых товаров
Создадим функцию, которая найдёт все товары, опубликованные более 90 дней назад, и удалит их без возможности восстановления (force delete).
function wprus_delete_old_products() {
$args = [
'post_type' => 'product',
'post_status' => 'publish',
'date_query' => [
[
'column' => 'post_date',
'before' => '90 days ago',
],
],
'fields' => 'ids',
'posts_per_page' => -1,
];
$old_products = get_posts( $args );
if ( empty( $old_products ) ) {
return; // Нет товаров для удаления
}
foreach ( $old_products as $product_id ) {
wp_delete_post( $product_id, true ); // force delete
}
}
add_action( 'wprus_delete_old_products_daily', 'wprus_delete_old_products' );
Шаг 3. Подключение к functions.php или собственному плагину
Вставьте оба кода (запланирование и функцию) в файл functions.php активной темы или создайте небольшой плагин для изоляции кода.
Проверка результата после внедрения
- Запустите вручную задачу для теста, вызвав функцию напрямую, например, из консоли WP-CLI или временно добавив вызов
wprus_delete_old_products();вfunctions.php. - Проверьте, что товары с датой публикации старше 90 дней удалились.
- Убедитесь, что остальные товары остались без изменений.
- В админке WooCommerce и в базе данных (таблица
wp_posts) должны отсутствовать удалённые товары.
Частые ошибки и как их исправить
- Задача не запускается автоматически — проверьте, что WP-Cron активен и на сайте есть регулярный трафик, иначе WP-Cron не сработает. Для теста можно запустить вручную
do_action('wprus_delete_old_products_daily');. - Удаляются не те товары — проверьте параметры
date_queryиpost_type. Важно, чтобыpost_typeбыл именноproduct. - Товары не удаляются — убедитесь, что у пользователя достаточно прав, и что функция вызывается в правильном контексте. При форсированном удалении используется
wp_delete_postс параметромtrue. - Нагрузка на сайт при удалении большого количества товаров — разбейте удаление на части, используя параметр
posts_per_pageи пагинацию.
Практические советы по безопасности и производительности
- Не удаляйте товары сразу, если они могут понадобиться для аналитики — лучше перевести их в статус черновика или архивировать.
- Добавьте логирование, чтобы отслеживать какие товары и когда удаляются, например, записывая ID в отдельный лог-файл.
- Если у вас большой магазин, используйте WP-CLI для пакетного удаления — это уменьшит нагрузку и избавит от таймаутов.
- Регулярно делайте резервные копии базы, чтобы можно было восстановить данные в случае ошибки.
Сравнение подходов: Плагин vs Код vs Компромисс
| Подход | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Готовый плагин (например, WP Bulk Delete) | Удобный интерфейс, поддержка, дополнительные фильтры | Может быть избыточным, дополнительная нагрузка, возможны конфликты | Если нужно быстро и с минимальными знаниями |
| Код на functions.php (как в статье) | Лёгкий, быстрый, точечный контроль, нет лишних функций | Требует навыков, нужно тестировать, нет интерфейса | Если вы разработчик и хотите кастомное решение |
| Компромисс (код + простой плагин для Cron) | Управление Cron, логирование и кастомная логика | Нужно поддерживать оба компонента | Для средних проектов с нуждой в гибкости |
Чек-лист внедрения автоматического удаления товаров
- Определить критерий удаления (например, 90 дней с публикации)
- Добавить в functions.php код планировщика WP-Cron
- Реализовать функцию выборки и удаления товаров
- Проверить работу функции вручную
- Мониторить логи и производительность после запуска
- Обеспечить резервное копирование перед массовым удалением
- Оптимизировать код для больших каталогов (пагинация)