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

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

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

Признаки необходимости автоматизации удаления:

  • Большой каталог с регулярно устаревающими товарами
  • Наличие метаполей с датами истечения (срок годности)
  • Падение конверсии или рост числа неактуальных товаров

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

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

Для начала нужно убедиться, что у товаров есть пользовательское поле с датой истечения. Например, метаполе _expiration_date, хранящее дату в формате Y-m-d.

Добавление метаполя можно реализовать через ACF или вручную, например, в админке:

add_action('woocommerce_product_options_general_product_data', function() {
    woocommerce_wp_text_input([
        'id' => '_expiration_date',
        'label' => __('Дата истечения', 'woocommerce'),
        'placeholder' => 'YYYY-MM-DD',
        'desc_tip' => 'true',
        'description' => __('Дата, после которой товар считается устаревшим и будет автоматически удалён.', 'woocommerce'),
        'type' => 'date'
    ]);
});

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

Реализация функции очистки товаров по сроку годности

Создадим функцию, которая будет находить и удалять все товары, у которых текущая дата больше даты в метаполе _expiration_date. Для запуска используем WP-Cron или системный cron, если есть доступ.

function wptemp_delete_expired_products() {
    $today = date('Y-m-d');
    $args = [
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'meta_query'     => [
            [
                'key'     => '_expiration_date',
                'value'   => $today,
                'compare' => '<',
                'type'    => 'DATE'
            ]
        ],
        'fields' => 'ids',
        'post_status' => 'publish'
    ];

    $expired_products = get_posts($args);

    if (empty($expired_products)) {
        return;
    }

    foreach ($expired_products as $product_id) {
        wp_delete_post($product_id, true); // true - удалить без корзины
    }
}

// Регистрация ежедневного задания
add_action('wptemp_daily_expired_products_cleanup', 'wptemp_delete_expired_products');

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

Пошаговое руководство по внедрению

  1. Добавьте метаполе _expiration_date к товарам через функцию или плагин ACF.
  2. Заполните даты истечения для товаров, которые планируете удалять автоматом.
  3. Скопируйте и вставьте код функции очистки в файл functions.php вашей дочерней темы или создайте мини-плагин.
  4. Убедитесь, что WP-Cron работает, или настройте системный cron для вызова wp cron event run --due-now.
  5. Проверьте логи и базу после первого запуска, чтобы убедиться, что товары удаляются корректно.

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

Для проверки работы системы:

  • Создайте тестовый товар с датой истечения, например, вчерашней.
  • Запустите вручную функцию wptemp_delete_expired_products(); через WP-CLI (wp eval 'wptemp_delete_expired_products();') или временно вызовите в админке.
  • Проверьте, что товар удалился из каталога и базы (таблица wp_posts).
  • Проверьте отсутствие ошибок в логах сервера и WP.

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

  • Нет удаления товаров: Проверьте, что метаполе _expiration_date заполнено корректно и в формате YYYY-MM-DD.
  • Функция не запускается: Убедитесь, что WP-Cron активен (проверьте wp-cron.php), либо настройте системный cron.
  • Удаление не происходит, потому что товары в черновиках или другом статусе: В запросе указано post_status => 'publish', если хотите удалять и другие статусы, добавьте их в массив.
  • Потеря данных: Используйте wp_delete_post($id, true) с осторожностью — это безвозвратно удаляет товар.

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

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

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

МетодПлюсыМинусы
Удаление через WP-Cron и кодПолный контроль, без сторонних плагинов, легко кастомизируетсяТребуется навыки, возможно нагрузка на БД при больших каталогах
Плагины автоматического удаленияПростота использования, готовые интерфейсыЗависимость от плагина, ограниченная гибкость, возможные конфликты
Ручное удаление через админкуПростота, нет технических требованийТрудозатратно, невозможно масштабировать
Как использовать WPRemark для автоматического отзыва на сайте WordPress
22.03.2026
WooCommerce: как реализовать авторизацию через социальные сети своими силами
09.06.2026
Как создать и использовать шорткоды в WordPress
05.11.2025
Как использовать WooCommerce хуки для автоматического изменения стоимости доставки
30.05.2026
Как настроить ограничение на количество покупок товара в WooCommerce
09.05.2026