Автоматическое удаление товаров в WooCommerce по сроку годности или дате публикации

Диагностика задачи: зачем и когда нужно удалять товары автоматически

В интернет-магазинах на 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 + пользовательское поле)Полный контроль, минимальная нагрузка, нет зависимости от плагиновТребует навыков разработки, поддержка на стороне разработчика
Плагины для управления сроком годности товаровБыстрая настройка, интерфейс управления, дополнительные функцииНагрузка на сайт, возможные конфликты, обновления
Как запретить отображение отзывов по категории в WordPress
16.03.2026
WooCommerce: как автоматически удалять заказы после отмены платежа
17.06.2026
Оптимизация базы данных WordPress: ускоряем сайт и снижаем нагрузку
21.11.2025
WooCommerce: как отправлять уведомления о заказах по email без плагинов
29.04.2026
WooCommerce: как автоматически очищать корзину и сессии после оформления заказа
14.05.2026