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

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

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

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

Первый шаг — определить критерий, по которому товар считается устаревшим. Обычно это дата публикации или кастомное метаполе с датой окончания продажи. Варианты:

  • post_date — дата создания товара;
  • кастомное поле, например _expiry_date с датой окончания;
  • статус товара — например, если товар находится в черновиках или на удалении.

Проверьте, что у товаров корректно заполнено выбранное поле. Для метаполей можно использовать SQL-запрос или WP_Query с мета-запросом.

Пошаговое решение: автоматическое удаление с WP-Cron

1. Создаем функцию удаления товаров

function delete_expired_products() {
    $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);

    if (!empty($expired_products)) {
        foreach ($expired_products as $product_id) {
            wp_delete_post($product_id, true); // true — безвозвратное удаление
        }
    }
}

2. Регистрируем задачу WP-Cron

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

add_action('daily_delete_expired_products', 'delete_expired_products');

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

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

update_post_meta($product_id, '_expiry_date', '2024-06-01');

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

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

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

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

  • Задача WP-Cron не запускается: убедитесь, что на сайте посещения есть (WP-Cron запускается при заходе на сайт). Для теста можно использовать плагин WP Crontrol и запускать событие вручную.
  • Неправильный формат даты в метаполе: дата должна быть в формате Y-m-d, иначе сравнение не сработает.
  • Удаление не происходит: проверьте, что используете правильный хук и что функция wp_delete_post() вызывается с параметром true для безвозвратного удаления.
  • Кэш мешает обновлению: очистите кэш сайта и браузера, особенно если используются кеширующие плагины.

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

  • Перед удалением товаров создавайте резервные копии базы данных.
  • Если товаров очень много, делайте удаление партиями, чтобы не перегружать сервер. Например, добавьте параметр posts_per_page с ограничением и в цикле удаляйте.
  • Используйте wp_delete_post() вместо прямого SQL для корректного удаления связанных данных (мета, термины, кэш).
  • Добавьте логирование удалений для аудита и отладки.

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

МетодПлюсыМинусыПример
WP-Cron + кастомное метаполеГибко, легко настроить, работает без сторонних плагиновЗависит от посещаемости сайта, требует правильной настройки датыКод из статьи
Плагин для управления сроками товаровГотовое решение, обычно с интерфейсомДополнительная нагрузка, может быть платнымWooCommerce Scheduler
Ручное удаление через админкуПросто, не требует кодаНе подходит для большого каталога, трудозатратноАдминка WooCommerce
Как установить и настроить WPCommunity для создания форума в WordPress
07.01.2026
Как удалить или скрыть страницы от индексации поисковыми системами в WordPress
28.03.2026
Не работает обновление статуса заказа в WooCommerce: диагностика и решение
21.04.2026
Как создать производительный кэш в WordPress с применением Transients API
19.12.2025
Как установить и настроить отложенный запуск задач в WordPress без WP-Cron
07.03.2026