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

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

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

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

Настройка хранения срока жизни товара в WooCommerce

Для начала убедитесь, что у каждого товара есть поле с датой истечения срока. Обычно это делается через пользовательское метаполе, например _expiration_date. Если такого поля нет, создайте его вручную или с помощью плагина Advanced Custom Fields.

Добавление метаполя вручную при сохранении товара:

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

В админке WooCommerce добавьте поле для ввода даты (например, через хук woocommerce_product_options_general_product_data).

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

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

1. Добавляем функцию проверки и удаления

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',
            ),
        ),
        'fields' => 'ids',
    );
    $expired_products = get_posts($args);
    foreach ($expired_products as $product_id) {
        wp_trash_post($product_id); // поместить в корзину
        // или wp_delete_post($product_id, true); // удалить безвозвратно
    }
}

2. Регистрируем ежедневное событие WP-Cron

if (!wp_next_scheduled('wc_daily_expired_products_cleanup')) {
    wp_schedule_event(strtotime('00:00:00'), 'daily', 'wc_daily_expired_products_cleanup');
}
add_action('wc_daily_expired_products_cleanup', 'wc_delete_expired_products');

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

Для отладки можно вызвать функцию вручную:

add_action('admin_init', function() {
    if (current_user_can('manage_options') && isset($_GET['run_expired_cleanup'])) {
        wc_delete_expired_products();
        echo 'Expired products cleanup done.';
        exit;
    }
});

В админке перейти по адресу https://your-site.com/wp-admin/?run_expired_cleanup=1. После выполнения проверьте корзину или удалённые записи.

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

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

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

  • Неправильный формат даты в поле _expiration_date
    Решение: убедитесь, что дата хранится в формате YYYY-MM-DD. Переопределите сохранение даты с помощью sanitize_text_field и проверяйте формат перед сохранением.
  • WP-Cron не срабатывает из-за отсутствия трафика
    Решение: для надежной работы WP-Cron используйте системный cron на сервере, вызывающий wp-cron.php каждые 5-15 минут.
  • Удаление товаров вызывает ошибки из-за связанных данных (заказы, отзывы)
    Решение: используйте wp_trash_post() вместо непосредственного удаления, чтобы сохранить данные и иметь возможность восстановить товар.
  • Задача слишком ресурсоёмкая при большом каталоге
    Решение: разбейте запрос на части с пагинацией или используйте WP CLI для пакетного удаления.

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

  • Всегда используйте wp_trash_post() вместо жесткого удаления, чтобы избежать потери данных и ошибок.
  • Добавьте проверку прав пользователя при ручном запуске очистки (как в примере с admin_init).
  • Для больших магазинов лучше запускать очистку в ночное время с низкой нагрузкой на сервер.
  • Регулярно делайте резервные копии базы данных перед автоматическим удалением товаров.
  • В таблице ниже сравнение вариантов удаления:
Метод удаленияПреимуществаНедостатки
wp_trash_post()Безопасно, можно восстановить товарЗанимает место в базе, требует очистки корзины вручную или дополнительно
wp_delete_post($id, true)Удаляет полностью, экономит местоРиск потери данных, связанных с товаром (заказы, отзывы)
WP-CLI скриптБыстро для больших каталогов, можно запускать вручнуюТребует доступа к серверу и навыков работы с консолью

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Как удалить неиспользуемые метаданные в WordPress для оптимизации базы данных
20.01.2026
Как создать автоматическое отмечивание новых статей в WordPress
21.03.2026
Как автоматически отключить комментарии в WordPress на старых постах
30.03.2026
Как использовать WooCommerce REST API для управления заказами: практическое руководство
07.05.2026
Как автоматически отмечать новые статьи в WordPress
18.03.2026
×
-15%
на премиум плагин
My Popup

Повысьте конверсию!

Получить скидку »