WooCommerce: как автоматически удалять неактуальные товары по дате

Проблема: как убрать устаревшие товары из каталога 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Могут быть тяжелыми, не всегда подходят под конкретные задачи, зависят от поддержки автораИспользовать проверенные плагины и дополнительно настраивать уведомления
Как использовать WP-Cron для задач автоматизации в WordPress
14.04.2026
Как сделать автоматический редирект в WordPress по условиям
04.01.2026
Как сделать автоматический импорт данных из Google Sheets в WordPress
24.02.2026
WooCommerce: как автоматически удалять товары по истечении срока действия
16.05.2026
Как автоматически отвечать на часто задаваемые вопросы (FAQ) в WordPress
26.03.2026