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

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

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

Регулярное удаление таких заказов помогает поддерживать базу в чистоте и улучшает производительность WooCommerce.

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

В WooCommerce незавершённые заказы обычно имеют статус pending (ожидание оплаты), failed (неудачная оплата) или cancelled (отменённый). Чтобы проверить их количество, выполните SQL-запрос к базе данных:

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

Или используйте WP-CLI:

wp post list --post_type=shop_order --post_status=wc-pending,wc-failed,wc-cancelled --field=ID | wc -l

Если число превышает несколько сотен — пора автоматизировать очистку.

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

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

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

function wpex_delete_old_unpaid_orders() {
    $hours = 24; // Время в часах, старше которого заказы удаляются
    $date = date('Y-m-d H:i:s', strtotime('-' . $hours . ' hours'));

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array('wc-pending', 'wc-failed', 'wc-cancelled'),
        'date_query'     => array(
            array(
                'column' => 'post_date',
                'before' => $date,
            ),
        ),
        'fields'         => 'ids',
        'posts_per_page' => -1,
    );

    $orders = get_posts($args);

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_trash_post($order_id); // Можно заменить на wp_delete_post для полной очистки
        }
    }
}

2. Запускаем функцию по расписанию с помощью WP-Cron

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

if (!wp_next_scheduled('wpex_daily_delete_unpaid_orders')) {
    wp_schedule_event(time(), 'daily', 'wpex_daily_delete_unpaid_orders');
}
add_action('wpex_daily_delete_unpaid_orders', 'wpex_delete_old_unpaid_orders');

Это обеспечит ежедневное удаление заказов старше 24 часов.

3. Проверка работы задачи

Чтобы проверить выполнение, можно добавить логирование:

function wpex_delete_old_unpaid_orders() {
    $hours = 24;
    $date = date('Y-m-d H:i:s', strtotime('-' . $hours . ' hours'));

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array('wc-pending', 'wc-failed', 'wc-cancelled'),
        'date_query'     => array(
            array('column' => 'post_date', 'before' => $date),
        ),
        'fields'         => 'ids',
        'posts_per_page' => -1,
    );

    $orders = get_posts($args);

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_trash_post($order_id);
        }
        error_log('Deleted ' . count($orders) . ' old unpaid orders');
    } else {
        error_log('No old unpaid orders found');
    }
}

Логи смотрите в wp-content/debug.log при включённом WP_DEBUG_LOG.

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

  • Зайдите в админку WooCommerce — заказы со статусами pending, failed, cancelled старше 24 часов должны исчезнуть.
  • Выполните SQL-запрос или WP-CLI команду из раздела диагностики — количество старых заказов снизится.
  • Проверьте файл логов для подтверждения выполнения задачи.

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

  • Заказы не удаляются: Проверьте, активен ли WP-Cron. На некоторых хостингах он отключён — настройте системный cron или используйте плагин WP Crontrol.
  • Удаляются свежие заказы: Проверьте параметр $hours и формат даты; используйте UTC-время, если необходимо.
  • Ошибки прав доступа: Убедитесь, что пользователь с нужными правами запускает код, особенно если используете WP-CLI.
  • Потеря данных: Рекомендуется использовать wp_trash_post вместо wp_delete_post для возможности восстановления.

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

  • Не запускайте удаление слишком часто (например, не чаще раза в час), чтобы избежать нагрузки на базу.
  • Добавьте проверку nonce и прав для вызова удаления вручную через админку, если планируете такой функционал.
  • Регулярно очищайте корзину (trash) заказов, чтобы полностью освободить место.
  • Если заказов очень много, делайте удаление пакетами, например по 100 заказов за раз, чтобы избежать таймаутов.

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

МетодПростотаКонтрольРиски
Плагин (например, WooCommerce Cleanup)ВысокаяОграниченныйЗависимость от стороннего кода
WP-Cron + кастомный кодСредняяВысокий, можно адаптироватьТребует тестирования и поддержки
Ручное удаление через админкуНизкаяМаксимальный контрольТрудозатратно, риск пропуска
Как удалить неиспользуемые виджеты в WordPress: практическое руководство
11.03.2026
Удаление оставшихся закрытых HTML тегов в WordPress
21.03.2026
WooCommerce: отключение автоматического создания заказов при незавершённом оформлении
07.07.2026
WooCommerce: автоматическое удаление зависших вариантов товаров с нулевым запасом
04.07.2026
WooCommerce: как избежать ошибок при автоматическом удалении незавершённых заказов
19.05.2026