Автоматическое удаление отменённых и завершённых заказов WooCommerce по времени

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

В интернет-магазинах на WooCommerce с течением времени накапливается много заказов, особенно со статусами «отменён» и «завершён». Это приводит к росту размера базы данных, замедлению работы административной панели и увеличению времени резервного копирования. Автоматизация удаления таких заказов позволяет поддерживать базу в оптимальном состоянии без ручного вмешательства.

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

  • Увеличение размера таблиц wp_posts и wp_postmeta из-за накопления заказов.
  • Замедление загрузки страницы «Заказы» в WooCommerce.
  • Длительное время создания бэкапов базы.
  • Рост нагрузки на сервер при выборке заказов с указанными статусами.

Проверить размер таблиц можно через phpMyAdmin или с помощью плагинов оптимизации базы данных, например Clearfy Pro.

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

1. Добавляем пользовательский cron-задание для удаления заказов

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

function wc_delete_old_orders() {
    // Время в днях, старше которого заказы будут удалены
    $days = 30;
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    global $wpdb;
    // Получаем ID заказов со статусом cancelled или completed старше даты
    $order_ids = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status IN ('wc-cancelled', 'wc-completed') AND post_date < %s",
        $date_threshold
    ));

    if (!empty($order_ids)) {
        foreach ($order_ids as $order_id) {
            wp_delete_post($order_id, true); // Полное удаление заказа
        }
    }
}

// Регистрация cron задачи при активации темы или плагина
function wc_schedule_old_order_deletion() {
    if (!wp_next_scheduled('wc_delete_old_orders_daily')) {
        wp_schedule_event(time(), 'daily', 'wc_delete_old_orders_daily');
    }
}
add_action('wp', 'wc_schedule_old_order_deletion');

// Хук для запуска нашей функции
add_action('wc_delete_old_orders_daily', 'wc_delete_old_orders');

// Очистка cron задачи при деактивации темы/плагина
function wc_clear_old_order_deletion_schedule() {
    $timestamp = wp_next_scheduled('wc_delete_old_orders_daily');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wc_delete_old_orders_daily');
    }
}

2. Настройка параметров удаления и запуск вручную

В переменной $days можно указать любое количество дней. Например, 30 — удалять заказы старше месяца. Чтобы проверить работу сразу после добавления кода, вызовите функцию вручную:

add_action('admin_init', function() {
    if (current_user_can('manage_woocommerce') && isset($_GET['run_old_order_deletion'])) {
        wc_delete_old_orders();
        wp_redirect(admin_url('edit.php?post_type=shop_order')); // редирект после удаления
        exit;
    }
});

Затем в админке перейдите по адресу /wp-admin/edit.php?post_type=shop_order&run_old_order_deletion=1 для однократного запуска.

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

  • Перейдите в админку WooCommerce — «Заказы» и проверьте отсутствие заказов со статусами wc-cancelled и wc-completed старше заданного срока.
  • Через phpMyAdmin выполните запрос на подсчёт заказов старше даты и убедитесь, что они удалены.
  • Проверьте логи сервера на наличие ошибок при выполнении задачи WP-Cron.

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

  • Заказы не удаляются: Проверьте, запущено ли WP-Cron. Если сайт мало посещаемый, cron может не запускаться. Для теста можно использовать плагин WP Crontrol.
  • Удаление не происходит для всех статусов: Убедитесь, что в запросе post_status указаны правильные статусы. WooCommerce использует префикс wc-.
  • Удаление приводит к потере данных, которые нужны: Перед автоматическим удалением сделайте резервную копию базы и убедитесь, что заказам действительно можно удалить.
  • Долгая работа функции: При большом количестве заказов разбейте удаление на партии, например, по 100 заказов за один запуск, чтобы не перегружать сервер.

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

  • Используйте wp_delete_post($order_id, true) для полного удаления, включая метаданные, чтобы избежать мусора в базе.
  • Перед удалением можно отправлять данные в архив или создавать резервную копию заказов.
  • Проверяйте нагрузку на базу данных после внедрения автоматизации.
  • Если WP-Cron не срабатывает регулярно, настройте системный cron на сервере для вызова wp-cron.php по расписанию.
  • Ограничьте права доступа к функции удаления, чтобы её не мог запускать любой пользователь.

Сравнение способов удаления заказов WooCommerce

МетодПреимуществаНедостаткиРекомендуемое использование
Ручное удаление через админкуПростота, нет кодаТрудоёмко, риск пропуска заказовМалые магазины, редкое удаление
Плагины оптимизации (например, Clearfy Pro)Автоматизация, удобный интерфейсМожет быть платным, дополнительная нагрузкаСредние и крупные магазины
Код WP-Cron (предложенный метод)Гибкость, полное управление, бесплатныйТребует навыков, возможны ошибки кодаРазработчики, кастомные решения
Как создать динамические таблицы в WordPress с помощью шорткодов
06.01.2026
Автоматическое удаление неактивных пользователей WordPress по последнему логину
14.03.2026
Как создать собственный тип записей WordPress для необычной структуры данных
09.01.2026
Как отключить AJAX в WooCommerce на страницах корзины и оформления заказа
30.05.2026
Как создать адаптивные блоки в WordPress Gutenberg
02.12.2025