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

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

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

Диагностика проблемы

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

Проверьте, есть ли у товаров пользовательское поле с датой окончания, или используете ли вы стандартные поля WooCommerce для управления сроками.

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

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

Для хранения даты окончания срока действия товара используйте кастомное поле. Например, добавим мета поле _expiration_date с датой в формате YYYY-MM-DD.

2. Создание WP-Cron задачи для удаления устаревших товаров

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

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

add_action('wc_delete_expired_products_cron', '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'
            )
        ),
        'fields' => 'ids'
    );

    $expired_products = get_posts($args);

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

3. Как добавить дату окончания при создании/редактировании товара

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

add_action('add_meta_boxes', function() {
    add_meta_box('wc_expiration_date', 'Дата окончания товара', function($post) {
        $value = get_post_meta($post->ID, '_expiration_date', true);
        echo '<input type="date" name="_expiration_date" value="' . esc_attr($value) . '" />';
    }, 'product', 'side');
});

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

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

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

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

  • Отсутствие даты в поле _expiration_date — товары не попадут в выборку, добавьте проверку или убедитесь, что поле заполнено.
  • Крон не запускается — проверьте, активен ли WP-Cron на сайте. Для теста используйте плагин WP Crontrol.
  • Копии товаров или вариаций не удаляются — если у вас вариативные товары, дополнительно нужно удалять вариации. Добавьте фильтр для удаления потомков.
  • Товары не удаляются, а только переводятся в черновики — в функции wp_delete_post параметр true отвечает за безвозвратное удаление. Проверьте его значение.

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

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

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

МетодПлагинКодКомпромиссы
Использование плагина Expire WooCommerce ProductsДаНетУдобно, но добавляет нагрузку и зависит от обновлений
Самописный WP-Cron с мета-полемНетДаГибко, требует поддержки и знаний PHP
Ручное удаление по расписанию через WP-CLIНетДаТребует доступ к консоли, не автоматично для всех
Как сделать автоматический откат обновлений WordPress при ошибках
28.02.2026
WooCommerce: как автоматически удалять неактуальные товары по дате
05.06.2026
Как установить ограничения на размер файлов в WordPress
30.01.2026
Оптимизация базы данных WordPress: практические советы и примеры
06.11.2025
Как создать автоматическую публикацию постов из внешнего источника в WordPress
08.04.2026