Проблема: как убрать устаревшие товары из каталога WooCommerce автоматически
В интернет-магазинах на WooCommerce часто возникает задача автоматически удалять товары, срок актуальности которых истек, например, акции, сезонные товары или товары с ограниченным сроком годности. Ручное удаление — неэффективно, особенно при большом ассортименте. В этой статье расскажу, как настроить автоматическое удаление товаров по заданной дате с помощью WP-Cron и кастомного поля.
Диагностика задачи: как определить товары для удаления
Для автоматизации нужно:
- Добавить к товарам метаполе с датой окончания актуальности;
- Регулярно запускать задачу, которая проверит дату и удалит просроченные товары;
- Обеспечить безопасное удаление (например, переместить в корзину или удалить полностью);
- Вести логи для контроля процесса.
Без правильной метки даты и регулярного запуска автоочистки задача не решится.
Шаг 1. Добавляем метаполе с датой окончания актуальности товара
Используем хук woocommerce_product_options_general_product_data для добавления поля в карточку товара в админке и сохраняем его через woocommerce_process_product_meta.
add_action('woocommerce_product_options_general_product_data', function() {
woocommerce_wp_text_input([
'id' => '_expiry_date',
'label' => 'Дата окончания актуальности (ГГГГ-ММ-ДД)',
'placeholder' => 'YYYY-MM-DD',
'desc_tip' => true,
'description' => 'Товар будет удалён автоматически после этой даты.'
]);
});
add_action('woocommerce_process_product_meta', function($post_id) {
if (isset($_POST['_expiry_date'])) {
update_post_meta($post_id, '_expiry_date', sanitize_text_field($_POST['_expiry_date']));
}
});После этого в админке товара появится поле для указания даты.
Шаг 2. Создаем WP-Cron задачу для периодической проверки и удаления
Регистрируем событие, которое будет запускаться, например, ежедневно. В этом событии проверяем товары с датой окончания, сравниваем с текущей и удаляем просроченные.
function wpco_schedule_expired_products_cleanup() {
if (!wp_next_scheduled('wpco_daily_expired_products_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpco_daily_expired_products_cleanup');
}
}
add_action('wp', 'wpco_schedule_expired_products_cleanup');
add_action('wpco_daily_expired_products_cleanup', function() {
$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);
foreach ($expired_products as $product_id) {
// Удаляем товар полностью (без возможности восстановления):
wp_delete_post($product_id, true);
// Для мягкого удаления используйте false вместо true
// wp_trash_post($product_id);
}
});Как проверить, что задача работает
- В админке создайте товар с датой окончания вчерашним числом;
- Запустите вручную WP-Cron событие через плагин WP Crontrol или выполните функцию напрямую;
- Проверьте, что товар удалился из списка продуктов;
- Посмотрите логи ошибок PHP, если товар не удаляется.
Частые ошибки и их исправление
- WP-Cron не запускается автоматически: на некоторых хостингах WP-Cron требует внешнего вызова. Проверьте, работает ли
wp-cron.phpили настройте системный cron. - Неправильный формат даты в метаполе: вводите дату строго в формате
ГГГГ-ММ-ДД, иначе сравнение не сработает. - Товар не удаляется, а остается в корзине: используйте
wp_delete_post($id, true)для полного удаления, иначе пост будет в корзине. - Потеря данных после удаления: создайте резервную копию перед внедрением автоматического удаления.
Практические советы по безопасности и производительности
- Перед удалением товаров лучше отправлять уведомление администратору или логировать ID удаленных товаров.
- Для больших магазинов ставьте ограничение на число удаляемых товаров за один запуск, чтобы не перегружать базу.
- Если требуется сохранить историю, используйте мягкое удаление (
wp_trash_post) вместо полного удаления. - Не храните дату окончания в пользовательских опциях, только в метаполях товаров — так поиск будет быстрее.
- Для контроля можно добавить отдельную страницу с отчетом по удаленным товарам, используя пользовательские таблицы или записи логов.
Альтернативы: код vs плагины
| Метод | Преимущества | Недостатки | Компромисс |
|---|---|---|---|
| Код (WP-Cron + метаполя) | Гибкость, контроль, без сторонних зависимостей, можно адаптировать под любые условия | Требует навыков, нужно тестировать, возможны ошибки в cron | Использовать код с логированием и резервным копированием |
| Плагины авточистки товара | Простота установки, готовые решения, настройки через UI | Могут быть тяжелыми, не всегда подходят под конкретные задачи, зависят от поддержки автора | Использовать проверенные плагины и дополнительно настраивать уведомления |