WooCommerce: автоматическое удаление товаров по срокам с помощью WP-Cron

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

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

Пошаговое решение: настройка автоматического удаления товаров с помощью WP-Cron

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

Для начала необходимо добавить метаполе с датой окончания товара. Это позволит задать индивидуальный срок действия для каждого товара.

function add_expiration_date_field() {
    woocommerce_wp_text_input( array(
        'id'          => '_expiration_date',
        'label'       => __('Дата истечения срока (YYYY-MM-DD)', 'woocommerce'),
        'description' => __('Введите дату, после которой товар будет автоматически удалён.', 'woocommerce'),
        'type'        => 'date',
        'desc_tip'    => true,
    ) );
}
add_action('woocommerce_product_options_general_product_data', 'add_expiration_date_field');

function save_expiration_date_field( $post_id ) {
    $expiration_date = isset($_POST['_expiration_date']) ? sanitize_text_field($_POST['_expiration_date']) : '';
    update_post_meta( $post_id, '_expiration_date', $expiration_date );
}
add_action('woocommerce_process_product_meta', 'save_expiration_date_field');

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

WP-Cron позволяет запускать функции по расписанию. Мы настроим задачу, которая будет запускаться раз в сутки и удалять просроченные товары.

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

function daily_product_cleanup_function() {
    $today = date('Y-m-d');
    $args = array(
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'meta_query'     => array(
            array(
                'key'     => '_expiration_date',
                'value'   => $today,
                'compare' => '<=',
                'type'    => 'DATE',
            ),
        ),
        'fields' => 'ids',
    );
    $expired_products = get_posts( $args );

    foreach ( $expired_products as $product_id ) {
        wp_trash_post( $product_id ); // Можно использовать wp_delete_post для полного удаления
    }
}
add_action( 'daily_product_cleanup_hook', 'daily_product_cleanup_function' );

Проверка результата после внедрения

  • Добавьте тестовый товар с датой истечения срока, например, вчерашним числом.
  • Запустите задачу Cron вручную (например, с помощью плагина WP Crontrol или вызовом do_action('daily_product_cleanup_hook') в functions.php).
  • Проверьте, что товар переместился в корзину или удалён (в зависимости от используемой функции удаления).
  • Убедитесь, что товары с датой истечения в будущем остаются на месте.

Частые ошибки и как их исправить

  • WP-Cron не срабатывает: по умолчанию WP-Cron запускается при заходе пользователей на сайт. Если трафика мало, задача может не запускаться. Решение — настроить системный Cron на сервере или использовать плагин WP Crontrol для тестирования.
  • Неправильный формат даты в метаполе: всегда используйте формат YYYY-MM-DD, иначе сравнение не сработает. Используйте тип поля date в woocommerce_wp_text_input.
  • Удаление товаров не происходит: проверьте права пользователя, под которым запускается WP-Cron, и убедитесь, что функция удаления вызывается без ошибок. Включите отладку ошибок WordPress для диагностики.
  • Товары удаляются раньше времени: проверьте часовой пояс сайта и сравнение дат. Функция date('Y-m-d') берёт дату сервера, убедитесь, что она совпадает с настройками WordPress.

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

  • Используйте wp_trash_post() вместо wp_delete_post() для безопасного удаления, чтобы можно было восстановить товары при ошибке.
  • Если количество товаров большое, разбивайте выборку на порции с помощью параметров posts_per_page и пагинации, чтобы избежать превышения лимита памяти.
  • Регулярно очищайте корзину с удалёнными товарами, чтобы не засорять базу данных.
  • Для критичных магазинов настройте системный Cron (например, через crontab на сервере), чтобы задачи выполнялись точно по расписанию.

Сравнение подходов к автоматическому удалению товаров

МетодПлюсыМинусы
WP-Cron (как в статье)Не требует доступа к серверу, легко настраивается в кодеЗависит от посещаемости сайта, возможны задержки
Системный Cron (crontab)Точный запуск, высокая надёжностьТребует доступа к серверу, знания администрирования
Плагины автоматизации (например, WP Crontrol)Удобный интерфейс, управление расписаниемДополнительная нагрузка, возможны конфликты с другими плагинами
Как удалить обязательное поле из формы регистрации WordPress
22.02.2026
Как использовать хук WooCommerce woocommerce_before_calculate_totals для изменения цен в корзине
13.05.2026
Как добавить поддержку мультипостинговых записей в WordPress
14.04.2026
Как сделать защитные метаполя в WordPress для хранения персональных данных
24.12.2025
Как автоматически устанавливать приватность записей в WordPress
18.02.2026