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

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

В интернет-магазинах на WooCommerce накопление большого количества заказов со статусом "завершён" или "обработан" может замедлить работу базы данных и усложнить администрирование. Особенно это актуально при высоком трафике и большом объёме заказов. Автоматическое удаление таких заказов по расписанию позволяет поддерживать базу в оптимальном состоянии без ручного вмешательства.

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

Основные шаги решения

  1. Создать функцию, которая будет удалять заказы с нужным статусом и старше определённого времени.
  2. Добавить хук для запуска этой функции по расписанию с помощью WP-Cron.
  3. Настроить расписание через фильтр cron_schedules, если нужны нестандартные интервалы.
  4. Активировать событие при инициализации WordPress.

Пример кода для functions.php или собственного плагина

function wps_remove_old_completed_orders() {
    // Получаем дату 30 дней назад
    $date = date('Y-m-d H:i:s', strtotime('-30 days'));

    // Получаем ID заказов со статусом completed старше 30 дней
    $args = array(
        'status' => 'completed',
        'date_created' => '<' . $date,
        'limit' => -1,
        'return' => 'ids',
    );

    $orders = wc_get_orders($args);

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_trash_post($order_id); // Отправляем заказ в корзину (можно заменить на wp_delete_post для полного удаления)
        }
    }
}

// Добавляем расписание - раз в день
add_filter('cron_schedules', function($schedules) {
    if(!isset($schedules['daily'])) {
        $schedules['daily'] = array(
            'interval' => 86400, // 24 часа
            'display' => __('Once Daily')
        );
    }
    return $schedules;
});

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

// Привязываем функцию к событию
add_action('wps_daily_order_cleanup', 'wps_remove_old_completed_orders');

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

  • Проверьте список заказов в WooCommerce — заказы старше 30 дней со статусом "завершён" должны быть удалены или перемещены в корзину.
  • Для ручного теста вызовите функцию wps_remove_old_completed_orders() напрямую, например, временно Добавьте add_action('init', 'wps_remove_old_completed_orders'); и обновите сайт.
  • Проверьте журнал задач WP-Cron через плагин "WP Crontrol" — должно быть событие wps_daily_order_cleanup с последним запуском.

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

  • Заказы не удаляются: убедитесь, что статус заказа указан правильно в wc_get_orders, например, 'completed', а не 'processing' или другой.
  • Задача WP-Cron не запускается: на некоторых хостингах WP-Cron зависит от посещений сайта. Для стабильной работы настройте системный cron или используйте плагин "WP Crontrol" для ручного запуска.
  • Удаление слишком быстрое или не полное: функция использует wp_trash_post, заказы попадают в корзину. Для полного удаления используйте wp_delete_post($order_id, true);, но будьте осторожны — данные будут безвозвратно удалены.

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

  • Перед удалением сделайте резервную копию базы данных.
  • Для больших магазинов разбивайте удаление на партии, например, по 50 заказов за один запуск, чтобы избежать таймаута.
  • Используйте wp_trash_post вместо полного удаления, чтобы иметь возможность восстановить ошибочно удалённые заказы.
  • Регулярно проверяйте состояние WP-Cron и логи ошибок для своевременного выявления проблем.

Чек-лист настройки автоматического удаления заказов в WooCommerce

  • Определить статус заказов для удаления (например, completed)
  • Выбрать возраст заказов для удаления (например, старше 30 дней)
  • Реализовать функцию удаления с использованием wc_get_orders и wp_trash_post
  • Добавить событие wp_cron для запуска задачи по расписанию
  • Проверить наличие и выполнение события в WP-Cron
  • Тестировать на тестовом сайте перед применением на боевом
  • Настроить резервное копирование базы данных

Сравнение подходов: плагин vs код

МетодПреимуществаНедостатки
Плагин (например, WP Bulk Delete)Готовый интерфейс, удобство настройки, поддержкаНагрузка, возможные конфликты, ограниченная кастомизация
Код (через wp_cron)Максимальный контроль, минимальная нагрузка, гибкостьТребует навыков, риск ошибок при неправильной реализации
Оптимизация кода в WordPresses: эффективное использование хуков и фильтров
02.11.2025
WooCommerce: как автоматически удалять товары без запаса
04.05.2026
Как отключить XML-RPC в WordPress без плагинов
10.05.2026
Как создать динамический фильтр товаров в WooCommerce без плагинов
09.01.2026
WooCommerce: как автоматически удалять просроченные заказы
16.05.2026