Диагностика задачи: зачем и когда нужно удалять товары автоматически
В интернет-магазинах на WooCommerce часто возникает потребность автоматически удалять товары, у которых истек срок годности, или удалить устаревшие товары, неактуальные по дате публикации. Это помогает поддерживать каталог в актуальном состоянии, избегать продаж просроченных или устаревших товаров и улучшать пользовательский опыт.
Типичные сценарии:
- Удаление товаров с пользовательским полем "срок годности" после даты истечения;
- Удаление товаров, опубликованных более X дней назад, если они не обновлялись;
- Автоматическое удаление товаров, помеченных специальным статусом или меткой.
Пошаговое решение: автоматизация удаления товаров по дате с помощью WP-Cron
1. Добавляем пользовательское поле для срока годности
Для начала необходимо в карточке товара добавить метаполе с датой окончания срока годности. Это можно сделать через метабоксы или с помощью Advanced Custom Fields (ACF). Предположим, метаполе называется expiry_date и содержит дату в формате YYYY-MM-DD.
2. Создаем функцию для удаления просроченных товаров
В файле functions.php темы или в собственном плагине добавляем следующий код:
function wpsource_delete_expired_products() {
$today = date('Y-m-d');
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => 'expiry_date',
'value' => $today,
'compare' => '<',
'type' => 'DATE',
],
],
'fields' => 'ids',
];
$expired_products = get_posts($args);
if (!empty($expired_products)) {
foreach ($expired_products as $product_id) {
wp_delete_post($product_id, true); // true — удаление без перемещения в корзину
}
}
}3. Планируем задачу с помощью WP-Cron
Добавим событие, которое будет запускать функцию ежедневно:
// Регистрируем событие при активации темы/плагина
function wpsource_schedule_expired_product_deletion() {
if (!wp_next_scheduled('wpsource_daily_expired_product_deletion')) {
wp_schedule_event(time(), 'daily', 'wpsource_daily_expired_product_deletion');
}
}
add_action('wp', 'wpsource_schedule_expired_product_deletion');
// Запускаем функцию по расписанию
add_action('wpsource_daily_expired_product_deletion', 'wpsource_delete_expired_products');
// Для отмены расписания (например, при деактивации плагина)
function wpsource_clear_scheduled_expired_product_deletion() {
$timestamp = wp_next_scheduled('wpsource_daily_expired_product_deletion');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpsource_daily_expired_product_deletion');
}
}Проверка результата после внедрения
Чтобы убедиться, что удаление работает корректно:
- Создайте тестовый товар с
expiry_dateв прошлом; - Запустите функцию вручную, вызвав
wpsource_delete_expired_products()из консоли WP-CLI или временно добавьте вызов в код; - Проверьте, удалился ли товар из каталога и базы данных;
- Проверьте журнал ошибок сервера и WP-лог, чтобы убедиться в отсутствии ошибок;
- Убедитесь, что WP-Cron запускается регулярно (например, с помощью плагина WP Crontrol).
Частые ошибки и как их исправить
- Неправильный формат даты в метаполе: убедитесь, что дата хранится в формате
YYYY-MM-DD, иначе сравнение не сработает. - Отсутствие запланированного события WP-Cron: проверьте, что событие действительно запланировано через
wp_next_scheduled. Если сайт малопосещаемый, WP-Cron может не срабатывать, рассмотрите настройку системного cron. - Удаление не того типа поста: в запросе обязательно указывайте
'post_type' => 'product', чтобы не удалить другие записи. - Отсутствие прав на удаление: код должен запускаться с правами администратора или от имени пользователя с нужными правами.
- Перемещение в корзину вместо полного удаления: используйте
wp_delete_post($id, true), чтобы удалить товар сразу без корзины.
Практические советы по безопасности и производительности
- Резервное копирование: перед автоматическим удалением товаров обязательно настройте регулярное резервное копирование базы данных.
- Ограничение количества удаляемых товаров за один запуск: если товаров много, можно ограничить количество удаляемых за один раз, чтобы избежать таймаутов.
- Проверка наличия метаполя: убедитесь, что поле
expiry_dateзаполнено, чтобы не удалять товары без даты. - Логирование: добавьте логирование в файл для отслеживания удалений.
- Отладка WP-Cron: используйте плагин WP Crontrol для контроля и запуска задач вручную.
Варианты реализации: код vs плагины
| Способ | Преимущества | Недостатки |
|---|---|---|
| Свой код (WP-Cron + пользовательское поле) | Полный контроль, минимальная нагрузка, нет зависимости от плагинов | Требует навыков разработки, поддержка на стороне разработчика |
| Плагины для управления сроком годности товаров | Быстрая настройка, интерфейс управления, дополнительные функции | Нагрузка на сайт, возможные конфликты, обновления |