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

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

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

Чтобы выявить проблему, зайдите в админ-панель WooCommerce → Заказы и отфильтруйте по статусам Ожидает оплаты и Ошибка оплаты. Если таких заказов сотни и они не меняются длительное время (например, старше 3-7 дней), стоит автоматизировать их удаление.

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

Шаг 1. Создаем функцию для удаления заказов по статусу и возрасту

Добавьте следующий код в файл functions.php вашей дочерней темы или в отдельный плагин для кастомных функций:

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

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

    $orders = wc_get_orders($args);

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

Шаг 2. Планируем регулярное выполнение через WP-Cron

Чтобы функция выполнялась автоматически, нужно зарегистрировать событие:

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

add_action('wpco_cleanup_old_orders_hook', 'wpco_delete_old_unpaid_orders');

Шаг 3. Проверяем удаление вручную

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

add_action('admin_init', function() {
    if (current_user_can('manage_woocommerce')) {
        wpco_delete_old_unpaid_orders();
    }
});

После успешной проверки удалите этот код, чтобы не запускать при каждом заходе в админку.

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

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

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

  • Заказы не удаляются: проверьте, что WP-Cron включен и работает, нет конфликтов с плагинами, которые блокируют удаление заказов.
  • Удаляются нужные заказы: внимательно проверьте условие $days_to_keep и статусы. Можно временно изменить status на pending только для теста.
  • Ошибка при вызове wc_get_orders: убедитесь, что WooCommerce активен и загружен до выполнения кода.
  • Функция не запускается по расписанию: добавьте плагин WP Crontrol для просмотра и управления крон-задачами.

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

  • Принудительное удаление заказов wp_delete_post($order_id, true) полностью удаляет запись и метаданные. Если нужно сохранить логи, используйте false.
  • Не уменьшайте $days_to_keep слишком сильно, чтобы не удалять заказы, которые пользователь может оплатить с задержкой.
  • Для больших магазинов с тысячами заказов добавляйте постраничное удаление, чтобы не перегружать память сервера:
function wpco_delete_old_unpaid_orders_batch($batch_size = 50) {
    $days_to_keep = 7;
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_to_keep . ' days'));

    $args = array(
        'status' => array('pending', 'failed'),
        'date_created' => '<' . $date_threshold,
        'limit' => $batch_size,
        'return' => 'ids',
    );

    $orders = wc_get_orders($args);

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true);
        }
    }
}
  • Для запуска в WP-Cron вызывайте эту функцию несколько раз или увеличьте частоту.
  • Используйте плагин Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wpco.ru&utm_medium=article&utm_campaign=woocommerce-avtomaticheskoe-udaleniye-nezakonchennyh-zakazov) для оптимизации WooCommerce, включая очистку базы и управление заказами.

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

МетодПреимуществаНедостатки
Код с WP-CronГибкость настройки, без плагинов, интеграция с магазиномТребует знаний PHP, возможны ошибки при неправильной настройке
Плагин очистки базы (например, Clearfy Pro)Простота, дополнительные инструменты оптимизацииМожет быть платным, нагрузка на сервер при больших объемах данных
Ручное удаление в админкеПростота, нет риска автоматических ошибокТрудоемко, неэффективно при большом количестве заказов
Как закрыть дубли страниц от пагинации в WordPress через robots, noindex и canonical
13.08.2026