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

Проблема: как автоматически удалять устаревшие товары в WooCommerce

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

Диагностика: что проверить перед реализацией

  • Убедитесь, что у товаров есть метаполе с датой окончания срока (например, _expiration_date), в формате YYYY-MM-DD.
  • Проверьте, что WP-Cron работает корректно на вашем хостинге (не отключён и запускается регулярно).
  • Определите, как должен обрабатываться товар — удаление из базы, перевод в черновики или изменение статуса.

Пошаговое решение: создание механизма удаления

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

Если у товаров нет поля с датой окончания, добавьте его в админке через код или ACF. Пример добавления метаполя вручную при создании товара:

update_post_meta( $product_id, '_expiration_date', '2024-06-30' );

2. Создание WP-Cron задачи для регулярной проверки

Добавьте в functions.php или в плагин следующий код для регистрации крон задачи:

if ( ! wp_next_scheduled( 'wc_delete_expired_products_daily' ) ) {
    wp_schedule_event( time(), 'daily', 'wc_delete_expired_products_daily' );
}

3. Функция удаления устаревших товаров

Реализуем функцию, которая будет запускаться ежедневно, искать товары с прошедшей датой и удалять их:

add_action( 'wc_delete_expired_products_daily', 'wc_delete_expired_products' );

function wc_delete_expired_products() {
    $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',
            ),
        ),
        'post_status'    => 'publish',
        'fields'         => 'ids',
    );

    $expired_products = get_posts( $args );

    foreach ( $expired_products as $product_id ) {
        wp_trash_post( $product_id ); // Можно заменить на wp_delete_post для полного удаления
    }
}

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

  • Добавьте несколько тестовых товаров с датой окончания, например, вчерашним числом.
  • Запустите функцию вручную, вызвав wc_delete_expired_products() через админку или сниппет.
  • Проверьте, что товары переместились в корзину или удалены.
  • Проверьте журнал ошибок и логи сервера на наличие сбоев при выполнении WP-Cron.

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

  • WP-Cron не запускается: Проверьте, что на сервере разрешён запуск cron, или настройте системный cron-задание, вызывающее wp-cron.php.
  • Неверный формат даты: Метаполе даты должно быть в формате YYYY-MM-DD, иначе сравнение не сработает.
  • Удаление не происходит: Проверьте, что статус товара publish, и что в запросе нет ограничений по правам доступа.
  • Удаление слишком частое или пропуски: Убедитесь, что крон запускается ровно один раз в день, без дублирования задач.

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

  • Для безопасности используйте wp_trash_post() вместо wp_delete_post() — это позволит восстанавливать товары в случае ошибки.
  • Ограничьте количество товаров, обрабатываемых за один запуск, чтобы избежать тайм-аутов. Например, добавьте параметр posts_per_page = 50 и в следующий запуск обрабатывайте следующую партию.
  • Логируйте удалённые товары в отдельный файл для последующего аудита.
  • Если на сайте много товаров, реализуйте пагинацию обработки, чтобы не перегружать базу.

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

МетодПлюсыМинусы
Автоматическое удаление с WP-CronПолностью автоматизировано, не требует ручного контроляЗависит от работы WP-Cron, возможны тайм-ауты при большом объёме
Ручное удаление через админкуПростота, полный контрольТрудозатратно при большом количестве товаров
Использование сторонних плагиновГотовые решения, удобный интерфейсДополнительные нагрузки, возможные конфликты, плата за функционал
WooCommerce: как избежать проблем с ответственным сохранением данных в корзине
04.06.2026
Как использовать хук woocommerce_cart_calculate_fees для добавления дополнительных платежей в WooCommerce
10.05.2026
Создать динамические формы в WordPress без плагинов
29.11.2025
Как создать автозаполняемое поле для установки даты в WordPress
21.03.2026
Как удалить загруженные файлы в WordPress после удаления плагинов
21.01.2026