Диагностика задачи: зачем и когда нужно удалять товары по дате
В интернет-магазинах на WooCommerce часто возникает необходимость автоматически убирать из каталога устаревшие товары — например, сезонные коллекции, акции или товары с истекшим сроком годности. Ручное удаление в админке неудобно и рискованно при большом ассортименте. Автоматизация удаления по дате публикации позволит поддерживать актуальность каталога и освобождать место на сервере.
Как проверить, что товар можно удалять по дате
Для начала убедитесь, что в вашем магазине у товаров корректно проставлена дата публикации (post_date) и она отражает момент появления товара в каталоге. Также проверьте, что товары, которые нужно удалять, не используются в заказах или других важных данных (например, для отчетности).
Для проверки списка товаров по дате используйте WP-CLI или SQL запрос:
SELECT ID, post_title, post_date FROM wp_posts WHERE post_type = 'product' AND post_status = 'publish' ORDER BY post_date ASC LIMIT 10;Пошаговое решение: как автоматизировать удаление товаров по дате
1. Добавление WP-Cron задачи для регулярной проверки
Добавим в functions.php вашей темы или в кастомный плагин следующий код для регистрации события, которое будет запускаться ежедневно и удалять устаревшие товары.
if ( ! wp_next_scheduled( 'wc_delete_old_products_daily' ) ) {
wp_schedule_event( time(), 'daily', 'wc_delete_old_products_daily' );
}
add_action( 'wc_delete_old_products_daily', 'wc_delete_old_products_older_than_90_days' );
function wc_delete_old_products_older_than_90_days() {
global $wpdb;
$threshold_date = date( 'Y-m-d H:i:s', strtotime( '-90 days' ) );
// Получаем ID товаров старше 90 дней
$old_products = $wpdb->get_col( $wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'product' AND post_status = 'publish' AND post_date < %s",
$threshold_date
) );
if ( ! empty( $old_products ) ) {
foreach ( $old_products as $product_id ) {
// Безопасное удаление с проверкой
wp_delete_post( $product_id, true );
}
}
}2. Настройка периода удаления и безопасности
В данном примере товары старше 90 дней удаляются безвозвратно (wp_delete_post с параметром true). Если хотите сначала переносить в корзину, замените true на false.
Если нужно другой период, измените значение -90 days на нужное (например, -180 days).
3. Запуск задачи вручную для тестирования
Для проверки работы функции без ожидания cron-запуска, вызовите функцию напрямую в файле или через консоль WP-CLI:
wp eval 'wc_delete_old_products_older_than_90_days();'Проверка результата после внедрения
- Проверьте, что в админке WooCommerce исчезли товары, дата публикации которых старше установленного порога.
- Выполните SQL-запрос по аналогии с предыдущим для подтверждения удаления.
- Просмотрите логи cron (если настроены) или используйте плагин WP Crontrol для контроля выполнения задачи.
Частые ошибки и как их исправить
- Товары не удаляются: проверьте, активна ли WP-Cron, нет ли конфликтов с другими плагинами, и не отключен ли wp_schedule_event.
- Удаление происходит слишком рано или поздно: проверьте корректность даты в базе и параметр
strtotimeв функции. - Удаляются нужные товары: убедитесь, что условие выборки не слишком общее. Добавьте дополнительные фильтры, например, по категории или метаданным.
- Потеря данных о заказах: товары с историей заказов лучше не удалять. Можно добавить проверку наличия связанных заказов перед удалением.
Практические советы по безопасности и производительности
- Перед массовым удалением создавайте резервную копию базы.
- Для больших магазинов используйте постраничную обработку, чтобы избежать таймаутов.
- Добавьте логирование удалённых товаров для аудита и отката.
- Если WP-Cron ненадежен, настройте системный cron на сервере для запуска wp-cron.php.
Сравнение способов автоматического удаления товаров
| Метод | Плюсы | Минусы |
|---|---|---|
| WP-Cron с кастомным кодом | Гибкость, полная кастомизация, бесплатный | Зависит от посещаемости сайта, требует навыков программирования |
| Плагины автоматизации (например, WP All Import с триггерами) | Удобный интерфейс, поддержка импорта/удаления | Платные решения, возможны ограничения по функционалу |
| Ручное удаление через админку | Простота, не требует кода | Небольшая автоматизация, риск ошибок при больших объемах |