Автоматическое удаление товаров в WooCommerce по сроку действия

Диагностика проблемы с устаревшими товарами в WooCommerce

В интернет-магазинах на WooCommerce часто возникает задача автоматически удалять товары, которые устарели или имеют ограниченный срок действия (например, промоакции, сезонные товары или цифровой контент с датой окончания). Без автоматизации администраторы вынуждены контролировать и удалять такие товары вручную, что приводит к ошибкам и замедляет работу.

Чтобы убедиться, что вы сталкиваетесь именно с этой проблемой, проверьте следующие моменты:

  • Есть ли у товаров метаполе с датой окончания (expiration date)?
  • Отсутствует ли автоматический механизм очистки товаров по этой дате?
  • Товары, срок действия которых прошёл, все ещё отображаются в каталоге и доступны для покупки?

Как автоматически удалять товары по истечении срока действия — пошаговое решение

1. Добавление поля с датой окончания товара

Для начала убедитесь, что у товаров есть метаполе с датой окончания. Можно использовать Advanced Custom Fields (ACF) или добавить поле вручную через add_meta_box. Ниже пример добавления кастомного метаполя даты окончания:

function add_expiration_date_metabox() {
    add_meta_box(
        'expiration_date',
        'Дата окончания товара',
        'render_expiration_date_metabox',
        'product',
        'side'
    );
}
add_action('add_meta_boxes', 'add_expiration_date_metabox');

function render_expiration_date_metabox($post) {
    $value = get_post_meta($post->ID, '_expiration_date', true);
    echo '<input type="date" name="_expiration_date" value="' . esc_attr($value) . '" />';
}

function save_expiration_date_meta($post_id) {
    if (isset($_POST['_expiration_date'])) {
        update_post_meta($post_id, '_expiration_date', sanitize_text_field($_POST['_expiration_date']));
    }
}
add_action('save_post_product', 'save_expiration_date_meta');

2. Создание WP-Cron задачи для проверки и удаления просроченных товаров

Добавим задачу в планировщик WordPress, которая будет ежедневно запускать проверку и удалять товары с прошедшей датой окончания.

function schedule_expired_products_cleanup() {
    if (!wp_next_scheduled('daily_expired_products_cleanup')) {
        wp_schedule_event(time(), 'daily', 'daily_expired_products_cleanup');
    }
}
add_action('wp', 'schedule_expired_products_cleanup');

function delete_expired_products() {
    $today = date('Y-m-d');
    $args = [
        'post_type' => 'product',
        'posts_per_page' => -1,
        'meta_query' => [
            [
                'key' => '_expiration_date',
                'value' => $today,
                'compare' => '<',
                'type' => 'DATE'
            ]
        ],
        'fields' => 'ids',
    ];
    $query = new WP_Query($args);

    if ($query->have_posts()) {
        foreach ($query->posts as $product_id) {
            wp_trash_post($product_id); // Можно заменить на wp_delete_post($product_id, true) для полного удаления
        }
    }
}
add_action('daily_expired_products_cleanup', 'delete_expired_products');

3. Проверка работы и отладка

Чтобы проверить, что автоматическое удаление работает:

  • Создайте тестовый товар с датой окончания, например, на вчерашний день.
  • Запустите вручную событие WP-Cron через плагин WP Crontrol или вызовите функцию delete_expired_products() напрямую из функций (например, через add_action('init', 'delete_expired_products') на время теста).
  • Проверьте, что товар переместился в корзину или удалился полностью.

Частые ошибки при автоматическом удалении товаров

  • Отсутствие даты окончания у товаров — без корректного метаполя фильтрация не сработает.
  • Неправильный формат даты — дата должна храниться в формате YYYY-MM-DD, иначе сравнение не сработает.
  • Проблемы с WP-Cron — если на сервере нет трафика, WP-Cron может не запускаться вовремя. В этом случае рекомендуется настроить системный cron и отключить WP-Cron (define('DISABLE_WP_CRON', true); в wp-config.php).
  • Удаление товаров вместо перемещения в корзину — используйте wp_trash_post() для безопасного удаления, чтобы не потерять данные безвозвратно.

Практические советы по безопасности и производительности

  • Перед удалением сделайте резервную копию базы данных, особенно если используете wp_delete_post с полным удалением.
  • Если товаров много, разбивайте запросы на части с 'posts_per_page' => 50 и используйте пагинацию WP_Query, чтобы не перегружать сервер.
  • Кэшируйте результаты запросов, если функция вызывается часто в других местах.
  • Для критичных магазинов лучше уведомлять администратора о предстоящем удалении товаров по email, чтобы можно было вручную проверить.

Сравнение способов реализации удаления товаров

МетодОписаниеПлюсыМинусы
WP-Cron + wp_trash_post()Автоматическое перемещение товаров в корзину по кронуБезопасно, легко восстановитьЗависит от работы WP-Cron, товары остаются в базе
WP-Cron + wp_delete_post(true)Полное удаление товаров по кронуПолностью очищает базуНельзя восстановить, риск удаления нужных товаров
Ручное удаление через админкуАдминистратор контролирует удалениеМинимум ошибокЗатратно по времени, риски забыть
WooCommerce: как автоматически удалять неактуальные товары по дате
05.06.2026
Как сделать автоматический редирект в WordPress по условиям
04.01.2026
Как устроить автоматический отчет о ошибках WordPress с уведомлениями на почту
22.01.2026
WooCommerce: решение проблемы с нерабочим автоприсвоением штрихкода (SKU) к товару
26.04.2026
Как отладить и исправить ошибки в плагинах WordPress
18.12.2025