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

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

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

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

Если вы замечаете, что база данных WooCommerce растёт быстрее обычного, а в разделе заказов много отменённых (статус cancelled) или отменённых и не оплаченых (cancelled, failed), то стоит рассмотреть автоматизацию их удаления. Также замедление админки при работе с заказами или длительные резервные копии — косвенные признаки.

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

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled';

Если число слишком большое (например, тысячи), удаление по расписанию оправдано.

Пошаговое решение: настройка автоматического удаления отменённых заказов с помощью WP-Cron

1. Создаём функцию для удаления заказов

function wpdirect_delete_cancelled_orders() {
    global $wpdb;

    // Определяем дату, старше которой заказы будут удалены (например, 30 дней)
    $date_threshold = date('Y-m-d H:i:s', strtotime('-30 days'));

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

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            // Удаляем заказ вместе с метаданными
            wp_delete_post($order_id, true);
        }
    }
}

2. Регистрируем событие WP-Cron для запуска функции ежедневно

function wpdirect_schedule_cancelled_orders_cleanup() {
    if (!wp_next_scheduled('wpdirect_daily_cancelled_orders_cleanup')) {
        wp_schedule_event(time(), 'daily', 'wpdirect_daily_cancelled_orders_cleanup');
    }
}
add_action('wp', 'wpdirect_schedule_cancelled_orders_cleanup');

add_action('wpdirect_daily_cancelled_orders_cleanup', 'wpdirect_delete_cancelled_orders');

3. Как отключить задачу при необходимости

function wpdirect_clear_cancelled_orders_cleanup_schedule() {
    $timestamp = wp_next_scheduled('wpdirect_daily_cancelled_orders_cleanup');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpdirect_daily_cancelled_orders_cleanup');
    }
}

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

  • Подождите сутки или запустите задачу вручную через WP-CLI командой wp cron event run wpdirect_daily_cancelled_orders_cleanup.
  • Проверьте таблицу заказов в админке WooCommerce — отменённые заказы старше 30 дней должны исчезнуть.
  • Повторно выполните SQL-запрос из раздела диагностики — количество отменённых заказов должно уменьшиться.

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

  • Заказы не удаляются: Проверьте, что WP-Cron работает. Если на сайте мало трафика, WP-Cron может не запускаться — используйте системный cron для вызова wp cron event run.
  • Удаляются не те заказы: Убедитесь, что статус заказа в запросе указан корректно — WooCommerce использует префикс wc- для статусов в базе.
  • Ошибки доступа к базе: При использовании нестандартных таблиц или префиксов проверьте правильность обращения к $wpdb->posts.

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

  • Удаление заказов происходит с помощью wp_delete_post($order_id, true) — полный удаление с метаданными. Это безопасно, но не восстанавливаемо, поэтому тестируйте на копии сайта.
  • Для магазинов с огромным количеством заказов можно разбивать удаление на части, например, по 50 заказов за раз, чтобы не перегружать сервер.
  • Используйте логи или уведомления, чтобы отслеживать работу задачи, например, записывайте количество удалённых заказов в файл или отправляйте на почту.
  • Если хотите более продвинутый контроль, можно интегрировать решение с плагином Clearfy Pro для очистки базы с дополнительными настройками.

Сравнение способов удаления отменённых заказов

МетодПреимуществаНедостатки
Ручное удаление через админкуПростота, контрольЗатратно по времени, риск ошибок
Автоматизация с WP-Cron (код)Полный контроль, бесплатно, гибкоЗависит от корректной работы WP-Cron, требует навыков
Плагины для очистки базыУдобство, дополнительные функцииМогут нагружать сайт, платные
Как избежать ошибки maximum_execution_time в WordPress: практические решения
29.12.2025
Как использовать REST API в WordPress для расширения функционала
11.11.2025
Как создать автоматическое удаление старых постов в WordPress
28.03.2026
Как избежать ошибки PHP memory limit в WordPress: практические решения
02.02.2026
Как создать умное обновление данных в WordPress с помощью Webhook’ов
18.02.2026