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

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

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

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

1. Использование WP-Cron для запуска задачи

WordPress содержит встроенный механизм WP-Cron, который позволяет запускать периодические задачи. Для удаления товаров нужно создать кастомную функцию и зарегистрировать её на выполнение по расписанию.

2. Пример кода для удаления товаров старше 180 дней

function wpmart_delete_old_products() {
    // Параметры запроса: товары типа 'product', опубликованные более 180 дней назад
    $args = [
        'post_type'      => 'product',
        'post_status'    => 'publish',
        'date_query'     => [
            [
                'column' => 'post_date',
                'before' => '180 days ago',
            ],
        ],
        'fields'         => 'ids',
        'posts_per_page' => -1,
    ];

    $old_products = get_posts($args);

    if (!empty($old_products)) {
        foreach ($old_products as $product_id) {
            wp_trash_post($product_id); // Перемещение в корзину
            // Для полного удаления используйте wp_delete_post($product_id, true);
        }
    }
}

// Функция для регистрации расписания раз в сутки
function wpmart_register_daily_schedule($schedules) {
    if (!isset($schedules['daily'])) {
        $schedules['daily'] = [
            'interval' => 86400, // 24 часа
            'display'  => __('Once Daily'),
        ];
    }
    return $schedules;
}
add_filter('cron_schedules', 'wpmart_register_daily_schedule');

// Запланировать событие при активации темы/плагина
function wpmart_schedule_delete_old_products() {
    if (!wp_next_scheduled('wpmart_daily_delete_old_products')) {
        wp_schedule_event(time(), 'daily', 'wpmart_daily_delete_old_products');
    }
}
add_action('wp', 'wpmart_schedule_delete_old_products');

// Привязать функцию к событию
add_action('wpmart_daily_delete_old_products', 'wpmart_delete_old_products');

Пошаговое внедрение решения

  1. Добавьте приведённый код в файл functions.php вашей дочерней темы или в кастомный плагин.
  2. Обновите сайт для инициализации расписания WP-Cron.
  3. Проверьте наличие запланированного события с помощью плагина WP Crontrol или через консоль WP-CLI командой wp cron event list.
  4. Убедитесь, что товары старше 180 дней перемещаются в корзину раз в сутки.

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

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

  • Создайте тестовый товар с датой публикации более 180 дней назад (можно вручную изменить дату через редактирование товара).
  • Запустите вручную крон-задачу с помощью WP Crontrol или WP-CLI:
    wp cron event run wpmart_daily_delete_old_products
  • Проверьте, что товар переместился в корзину (Админ-панель > Товары > Корзина).
  • Если нужно полностью удалить, замените wp_trash_post на wp_delete_post($product_id, true) в коде.

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

  • Задача не запускается: WP-Cron зависит от посещений сайта. На слабом трафике крон может не сработать вовремя. Используйте системный cron на сервере для запуска wp-cron.php или WP-CLI для регулярного запуска.
  • Удаляются не те товары: Проверьте параметры date_query и тип поста. Убедитесь, что дата публикации корректна.
  • Права доступа: Функция удаления требует прав администратора. Запускайте код от имени администратора.
  • Потеря товаров: По умолчанию товары попадают в корзину. Если корзина не очищается, товары сохраняются. Для полного удаления используйте wp_delete_post с параметром true.

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

  • Перед массовым удалением делайте резервную копию базы данных.
  • При большом объёме товаров делайте удаление порциями, чтобы избежать превышения времени выполнения скрипта. Например, добавьте ограничение 'posts_per_page' => 50 и используйте пагинацию.
  • Добавьте логирование удалённых товаров для аудита:
function wpmart_delete_old_products() {
    $args = [
        'post_type' => 'product',
        'post_status' => 'publish',
        'date_query' => [
            [
                'column' => 'post_date',
                'before' => '180 days ago',
            ],
        ],
        'fields' => 'ids',
        'posts_per_page' => 50,
    ];

    $old_products = get_posts($args);

    if (!empty($old_products)) {
        foreach ($old_products as $product_id) {
            if (wp_trash_post($product_id)) {
                error_log('Deleted old product ID: ' . $product_id);
            }
        }
    }
}
  • Для повышения надёжности используйте серверный cron вместо WP-Cron.
  • Проверяйте нагрузку на сервер при выполнении задачи и корректируйте размер порций.

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

МетодПлюсыМинусыРекомендации
WP-Cron с пользовательским кодомПолный контроль, без плагинов, гибкостьЗависит от трафика, возможны задержкиДля сайтов с хорошим трафиком или запускать системный cron
Серверный cron + WP-CLIНадёжность, точное время запускаТребуется доступ к серверу, настройка сложнееОптимально для больших магазинов
Плагины для удаления товаровПростота использования, готовые настройкиМогут быть избыточны, нагрузка, безопасностьЕсли нет возможности писать код
Как создать динамический виджет в WordPress с использованием REST API
28.02.2026
WooCommerce: автоматическое изменение стоимости товаров по расписанию с поддержкой вариаций
07.06.2026
WooCommerce: автоматическое изменение названий и описаний товаров по расписанию
13.07.2026
WooCommerce: автоматическое изменение статуса заказа после успешной оплаты через хук
28.07.2026
WooCommerce: установка минимальной суммы заказа для отдельных товаров с проверкой
20.04.2026