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

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

В WooCommerce незавершённые заказы (например, со статусом pending или failed) могут накапливаться, занимая место в базе данных и замедляя работу административной панели. Это особенно критично для магазинов с большим трафиком и частыми брошенными корзинами.

Если вы заметили, что в разделе заказов WooCommerce много заказов со статусом «Ожидает оплаты» или «Неуспешный», и они не удаляются автоматически, стоит настроить очистку заказов по расписанию.

Пошаговое решение: удаляем заказы по cron

1. Определяем статусы для удаления

Чаще всего удаляют заказы со статусами pending и failed, которым больше определённого времени (например, 7 дней).

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

function wpmarketing_delete_old_unpaid_orders() {
    $days = 7; // Количество дней для хранения заказов
    $date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

    $args = array(
        'status' => array('pending', 'failed'),
        'date_created' => '<' . $date,
        'limit'  => -1,
        'return' => 'ids',
    );

    $orders = wc_get_orders($args);
    if (empty($orders)) {
        return;
    }

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

3. Регистрируем cron-задачу

Добавляем расписание в WordPress и запускаем очистку раз в сутки.

add_filter('cron_schedules', function($schedules) {
    if (!isset($schedules['daily'])) {
        $schedules['daily'] = array(
            'interval' => 86400, // 24 часа
            'display'  => __('Once Daily'),
        );
    }
    return $schedules;
});

if (!wp_next_scheduled('wpmarketing_delete_unpaid_orders_hook')) {
    wp_schedule_event(time(), 'daily', 'wpmarketing_delete_unpaid_orders_hook');
}

add_action('wpmarketing_delete_unpaid_orders_hook', 'wpmarketing_delete_old_unpaid_orders');

4. Добавляем код в functions.php или создаём небольшой плагин

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

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

  • Перейдите в WooCommerce → Заказы и отфильтруйте заказы со статусом pending и failed.
  • Убедитесь, что заказы старше 7 дней отсутствуют.
  • Для теста можно изменить переменную $days на 0, чтобы сразу удалить все такие заказы, или вручную создать заказ с нужным статусом и датой.
  • Проверьте логи сервера и наличие ошибок в админке.

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

  • Заказы не удаляются: Проверьте, активна ли cron-задача. Для этого используйте плагин WP Crontrol и убедитесь, что событие wpmarketing_delete_unpaid_orders_hook запланировано.
  • Удаляются не те заказы: Проверьте параметры фильтрации в wc_get_orders(), особенно статус и дату создания.
  • Ошибка прав доступа при удалении: Функция wp_delete_post требует прав администратора. Убедитесь, что код выполняется в контексте с нужными правами.
  • Удаление заказов с важными данными: Перед внедрением сделайте резервную копию базы данных — удаление необратимо.

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

  • Добавляйте логирование удалённых заказов в отдельный файл для аудита, например, через error_log или кастомный лог.
  • Если заказов много, разбивайте удаление на партии, чтобы избежать превышения времени выполнения скрипта.
  • Используйте WP Cron только для небольших нагрузок. Для больших магазинов настраивайте системный cron, вызывающий wp-cron.php раз в сутки.
  • Регулярно проверяйте и очищайте базу данных, чтобы избежать замедления сайта.

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

МетодПлюсыМинусы
Ручное удаление через админкуПросто, не требует кодаТрудоёмко, не автоматизировано
Плагин для очистки заказовУдобный интерфейс, настройкиДополнительные зависимости, нагрузка
Автоматизация через WP Cron + кодНет лишних плагинов, гибкостьНужно писать и поддерживать код
Системный cron + WP CLIМаксимальная производительностьТребует доступа к серверу и навыков работы с консолью
Как создать динамический маркетинговый список клиентов в WordPress с помощью AJAX
21.01.2026
Как создать автоматический маркетинговый лендинг пейдж в WordPress
10.04.2026
Как установить отложенную загрузку изображений в WordPress для ускорения сайта
19.03.2026
Как удалить Emoji в WordPress: отключение скриптов и примеры кода
05.12.2025
Кастомизация полей оформления заказа WooCommerce без плагинов: полное руководство
24.04.2026