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

Проблема: накопление незавершённых заказов в WooCommerce

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

Удалять такие заказы вручную неудобно, особенно при большом количестве. Решение — автоматизировать удаление таких заказов через WP-Cron или системный cron.

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

Для начала нужно понять, какие заказы считаются незавершёнными. Обычно это статусы:

  • pending — ожидает оплаты;
  • failed — оплата не прошла;
  • cancelled — отменён пользователем (по желанию можно включить);
  • on-hold — заказ поставлен на удержание;

Чтобы проверить количество таких заказов, можно выполнить SQL-запрос через phpMyAdmin или использовать WP-CLI:

wp post list --post_type=shop_order --post_status=pending,failed --fields=ID,post_status --format=table

Или простой запрос в базе данных:

SELECT COUNT(ID) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed');

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

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

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

function wpmarketing_delete_old_pending_orders() {
    $days = 7; // Удалять заказы старше 7 дней
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

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

    $orders = wc_get_orders($args);

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

2. Автоматизация с помощью WP-Cron

Чтобы запускать удаление автоматически, зарегистрируем cron-задачу:

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

add_action('wpmarketing_delete_old_orders_event', 'wpmarketing_delete_old_pending_orders');

Этот код добавит ежедневный запуск функции удаления заказов старше 7 дней со статусом pending и failed.

3. Ручной запуск для проверки

Вы можете запустить функцию вручную для теста, добавив временный вызов в functions.php:

// Временно для теста
wpmarketing_delete_old_pending_orders();

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

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

  • Проверьте базу через phpMyAdmin или WP-CLI — количество заказов со статусом pending и failed должно уменьшиться.
  • В админке WooCommerce зайдите в раздел «Заказы» и отфильтруйте по статусам Ожидает оплаты и Ошибка оплаты — старые заказы должны исчезнуть.
  • Проверьте логи сайта и WP-Cron (например, с помощью плагина WP Crontrol), что задача выполняется без ошибок.

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

  • Заказы не удаляются: проверьте, что статус у заказов именно wc-pending или wc-failed, и что дата создания старше указанного порога.
  • WP-Cron не срабатывает: если на сайте низкий трафик, WP-Cron может не запускаться. Рекомендуется настроить системный cron на сервере для точного выполнения задач.
  • Удаление приводит к ошибкам: убедитесь, что функция вызывается корректно, и что нет конфликтов с плагинами, которые блокируют удаление заказов.
  • Удаляются нужные заказы: проверьте временное окно удаления, например, увеличьте порог с 7 до 14 дней, чтобы не потерять актуальные заказы.

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

  • Перед внедрением автоматического удаления сделайте полный бэкап базы данных.
  • Используйте транзакции или проверяйте логику удаления на тестовом стенде.
  • Если заказов очень много, разбивайте удаление на партии, чтобы избежать превышения времени выполнения скрипта.
  • Для мониторинга выполнения cron-задач используйте плагины типа WP Crontrol или логи сервера.
  • Для точного контроля интегрируйте уведомления на email или в лог после удаления заказов.

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

МетодПлюсыМинусыПример
Ручное удаление через админкуПросто, без кодаНепрактично при большом количестве заказовWooCommerce - Заказы - Фильтр - Удалить
SQL-запросБыстро, без загрузки WordPressРиск повредить данные, требует доступа к базеDELETE FROM wp_posts WHERE post_type='shop_order' AND post_status IN ('wc-pending','wc-failed') AND post_date < '2024-01-01';
Автоматизация через WP-Cron и PHPПолный контроль, автоматизацияТребует навыков, настройка cronКод из статьи выше
Как автоматически изменять метаданные WooCommerce при обновлении заказа
10.06.2026
Как установить UTM-метки в WordPress для точной аналитики маркетинга
18.12.2025
Как автоматизировать управление SEO метаданными в WordPress
26.03.2026
Как автоматизировать управление решением технических проблем на сайте WordPress
23.03.2026
Как использовать хуки WooCommerce для кастомизации поля оплаты
14.05.2026