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

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

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

Проверить наличие устаревших товаров можно, если вы храните дату окончания срока в пользовательском поле (метаполе) товара, например, _expiration_date. Для диагностики выполните следующий запрос в базе данных или с помощью WP-CLI:

SELECT ID, post_title, meta_value FROM wp_posts
JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id
WHERE wp_postmeta.meta_key = '_expiration_date'
AND wp_postmeta.meta_value < CURDATE();

Если запрос вернул товары с датой меньше текущей, значит, есть просроченные позиции.

Настройка автоматического удаления просроченных товаров

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

Убедитесь, что у каждого товара есть метаполе _expiration_date с датой в формате YYYY-MM-DD. Можно использовать Advanced Custom Fields (ACF) или записывать дату вручную через админку.

2. Создание WP-Cron задачи для удаления

Добавьте следующий код в файл functions.php вашей темы или в отдельный плагин. Он проверяет товары с датой окончания меньше текущей и удаляет их.

function wpco_delete_expired_products() {
    // Получаем сегодняшнюю дату в формате Y-m-d
    $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);

    if (!empty($expired_products)) {
        foreach ($expired_products as $product_id) {
            wp_delete_post($product_id, true); // полный удаление
        }
    }
}

// Регистрируем событие, если его нет
if (!wp_next_scheduled('wpco_delete_expired_products_event')) {
    wp_schedule_event(time(), 'daily', 'wpco_delete_expired_products_event');
}

add_action('wpco_delete_expired_products_event', 'wpco_delete_expired_products');

3. Очистка cron при деактивации плагина или темы

function wpco_clear_expired_products_cron() {
    $timestamp = wp_next_scheduled('wpco_delete_expired_products_event');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpco_delete_expired_products_event');
    }
}

register_deactivation_hook(__FILE__, 'wpco_clear_expired_products_cron');

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

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

  • Создайте тестовый товар с датой _expiration_date на вчерашний день.
  • Запустите задачу вручную с помощью WP-CLI: wp cron event run wpco_delete_expired_products_event
  • Проверьте, удалился ли товар в админке WooCommerce.
  • Просмотрите логи ошибок и журнал cron-событий (если настроен).

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

  • Нет метаполя с датой или неправильный формат даты. Убедитесь, что дата хранится в формате YYYY-MM-DD и метаполе _expiration_date действительно существует.
  • WP-Cron не запускается. Проверьте, что WP-Cron включён и работают планировщики. Для теста вызовите wpco_delete_expired_products() напрямую.
  • Товары не удаляются, т.к. они в статусе черновика или запланированы. В запросе можно добавить параметр 'post_status' => array('publish', 'private'), если хотите удалять только опубликованные товары.
  • Удаление не полное из-за кэширования. Очистите кэш сайта и проверьте повторно.

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

  • Используйте wp_delete_post($id, true) для полного удаления (без перемещения в корзину). Если хотите сохранить возможность восстановления, замените true на false.
  • Для сайтов с большим каталогом товаров добавьте пагинацию в запрос с параметром posts_per_page и делайте удаление пачками.
  • Добавьте логирование удаляемых товаров, чтобы отслеживать процесс и ошибки.
  • Убедитесь, что ваш хостинг поддерживает WP-Cron или настройте системный cron для wp-cron.php.

Сравнение способов автоматического удаления просроченных товаров

МетодОписаниеПлюсыМинусы
WP-Cron + пользовательский кодАвтоматическое удаление через крон-задачу и метаполяГибкость, без сторонних плагинов, легко кастомизироватьЗависит от работы WP-Cron, требует знаний PHP
Плагины управления срокамиГотовые решения для управления сроками и удалениемПростота установки, поддержка интерфейсаМогут быть тяжелыми, не всегда подходят под кастомные задачи
Ручное удалениеУдаление через админку или SQL-запросыПростота, без кодаНе автоматизировано, требует ручного контроля
WooCommerce: как автоматически удалять товары по остаткам на складе
18.06.2026
Как создать автозагрузку изображений в WordPress
17.11.2025
Как автоматически отправлять отзывы пользователей в WordPress
07.03.2026
Автоматическое удаление старых комментариев в WordPress
09.02.2026
Как использовать REST API для создания кастомных эндпойнтов в WordPress
08.12.2025