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

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

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

Проверить необходимость автоматизации можно, посмотрев на следующие признаки:

  • Большое количество товаров с ограниченным сроком актуальности.
  • Регулярные обновления каталога, требующие удаления устаревших товаров.
  • Проблемы с производительностью базы данных из-за большого количества неактуальных товаров.

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

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

Для начала необходимо иметь у товаров мета-поле с датой окончания актуальности. Можно использовать собственное поле _expiry_date в формате YYYY-MM-DD. Добавим это поле вручную или через кастомные поля.

2. Пишем функцию для удаления просроченных товаров

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

<?php
function wc_delete_expired_products() {
    $today = date('Y-m-d');
    $args = array(
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'meta_query'     => array(
            array(
                '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 - удаление без корзины
        }
    }
}
?>

3. Настраиваем автоматический запуск через WP-Cron

Чтобы функция запускалась регулярно, добавим задачу в расписание WP-Cron, например, раз в сутки.

<?php
// Регистрируем событие при активации темы или плагина
function wc_schedule_expired_products_deletion() {
    if (!wp_next_scheduled('wc_daily_expired_products_deletion')) {
        wp_schedule_event(strtotime('00:00:00'), 'daily', 'wc_daily_expired_products_deletion');
    }
}
add_action('wp', 'wc_schedule_expired_products_deletion');

// Обработчик события
add_action('wc_daily_expired_products_deletion', 'wc_delete_expired_products');

// Очистка расписания при деактивации
function wc_clear_expired_products_deletion_schedule() {
    $timestamp = wp_next_scheduled('wc_daily_expired_products_deletion');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wc_daily_expired_products_deletion');
    }
}
register_deactivation_hook(__FILE__, 'wc_clear_expired_products_deletion_schedule');
?>

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

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

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

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

  • Ошибка: Функция не удаляет товары.
    Причина: Неправильный ключ мета-поля или формат даты.
    Решение: Проверьте, что _expiry_date действительно есть у товаров и записан в формате YYYY-MM-DD.
  • Ошибка: WP-Cron не срабатывает.
    Причина: WP-Cron запускается только при посещениях сайта.
    Решение: Настройте системный cron на сервере или используйте плагин для имитации cron, например WP Crontrol.
  • Ошибка: Необходимо не удалять, а менять статус товара.
    Решение: Замените wp_delete_post($product_id, true); на wp_update_post(array('ID' => $product_id, 'post_status' => 'draft'));.

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

  • Используйте wp_delete_post с параметром true для полного удаления без корзины, чтобы не засорять базу.
  • Если товаров много, добавьте пагинацию в запрос get_posts, чтобы не превышать лимит памяти.
  • Ограничьте права пользователя, который может запускать удаление, чтобы избежать случайных удалений.
  • Регулярно делайте бэкапы базы данных, особенно перед автоматическими удалениями.

Сравнение вариантов реализации удаления товаров по срокам

МетодОписаниеПлюсыМинусы
Кастомный код с WP-Cron Автоматическое удаление через WP-Cron и функцию в functions.php Полный контроль, нет зависимости от плагинов, гибкость Необходимы навыки программирования, возможны проблемы с WP-Cron
Плагины для автоматизации Использование плагинов для управления сроками товаров Простота настройки, готовый функционал Нагрузка на сайт, зависимость от стороннего кода, ограниченная кастомизация
Ручное удаление Админка WooCommerce — фильтры и удаление вручную Простота без программирования Ручной труд, риск ошибок, неэффективно для большого каталога

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

⭐⭐⭐⭐⭐
Как удалить неиспользуемые мета данные в WordPress для оптимизации базы данных
24.01.2026
Автоматическое удаление проблемных изображений в WordPress: решение для оптимизации сайта
22.02.2026
Автоматическое удаление старого контента в WordPress: эффективные методы и примеры
18.02.2026
Как создать адаптивный блок с изображением в WordPress: практическое руководство
23.12.2025
Как отключить автоматическое обновление плагинов WordPress: практическое руководство
03.04.2026
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше