Почему возникает необходимость автоматического удаления товаров по сроку
В интернет-магазинах на WooCommerce часто появляется задача удалить товары, которые устарели, сняты с производства или больше не актуальны. Ручное удаление таких позиций неудобно и занимает много времени, особенно при большом каталоге. Автоматизация процесса с помощью кода позволяет поддерживать базу товаров в актуальном состоянии без лишних усилий.
Диагностика: как определить товары для удаления
Первый шаг — определить критерий, по которому товар считается устаревшим. Обычно это дата публикации или кастомное метаполе с датой окончания продажи. Варианты:
post_date— дата создания товара;- кастомное поле, например
_expiry_dateс датой окончания; - статус товара — например, если товар находится в черновиках или на удалении.
Проверьте, что у товаров корректно заполнено выбранное поле. Для метаполей можно использовать SQL-запрос или WP_Query с мета-запросом.
Пошаговое решение: автоматическое удаление с WP-Cron
1. Создаем функцию удаления товаров
function 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 — безвозвратное удаление
}
}
}2. Регистрируем задачу WP-Cron
add_action('wp', 'register_daily_product_deletion_event');
function register_daily_product_deletion_event() {
if (!wp_next_scheduled('daily_delete_expired_products')) {
wp_schedule_event(time(), 'daily', 'daily_delete_expired_products');
}
}
add_action('daily_delete_expired_products', 'delete_expired_products');3. Добавляем метаполе с датой окончания товару
Чтобы тестировать удаление, добавьте метаполе _expiry_date к товарам через админку или программно:
update_post_meta($product_id, '_expiry_date', '2024-06-01');Проверка результата после внедрения
Чтобы проверить, что автоматическое удаление работает:
- Добавьте тестовый товар с датой
_expiry_date, которая уже прошла; - Запустите вручную событие WP-Cron через плагин WP Crontrol или вызовите функцию
delete_expired_products()напрямую; - Проверьте в админке, удалился ли товар;
- Проверьте логи сервера и WP для ошибок.
Частые ошибки и как их исправить
- Задача WP-Cron не запускается: убедитесь, что на сайте посещения есть (WP-Cron запускается при заходе на сайт). Для теста можно использовать плагин WP Crontrol и запускать событие вручную.
- Неправильный формат даты в метаполе: дата должна быть в формате
Y-m-d, иначе сравнение не сработает. - Удаление не происходит: проверьте, что используете правильный хук и что функция
wp_delete_post()вызывается с параметромtrueдля безвозвратного удаления. - Кэш мешает обновлению: очистите кэш сайта и браузера, особенно если используются кеширующие плагины.
Практические советы по безопасности и производительности
- Перед удалением товаров создавайте резервные копии базы данных.
- Если товаров очень много, делайте удаление партиями, чтобы не перегружать сервер. Например, добавьте параметр
posts_per_pageс ограничением и в цикле удаляйте. - Используйте
wp_delete_post()вместо прямого SQL для корректного удаления связанных данных (мета, термины, кэш). - Добавьте логирование удалений для аудита и отладки.
Сравнение способов автоматического удаления товаров
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| WP-Cron + кастомное метаполе | Гибко, легко настроить, работает без сторонних плагинов | Зависит от посещаемости сайта, требует правильной настройки даты | Код из статьи |
| Плагин для управления сроками товаров | Готовое решение, обычно с интерфейсом | Дополнительная нагрузка, может быть платным | WooCommerce Scheduler |
| Ручное удаление через админку | Просто, не требует кода | Не подходит для большого каталога, трудозатратно | Админка WooCommerce |