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

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

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

  • загрязнению базы данных ненужными записями;
  • затруднению аналитики и учёта продаж;
  • увеличению нагрузки на бэкенд и замедлению админки;
  • ошибкам при интеграции с платёжными системами и CRM.

Стандартный WooCommerce не удаляет автоматически такие заказы. Поэтому понадобится кастомное решение.

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

1. Выбор подходящего хука для автоматизации

Для регулярного удаления неоплаченных заказов используем WP-Cron — внутренний планировщик WordPress. Он запустит функцию очистки по расписанию.

2. Код для удаления неоплаченных заказов старше 24 часов

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

function wpsource_delete_unpaid_orders() {
    $args = array(
        'status' => 'pending', // статус неоплаченного заказа
        'date_created' => '<' . ( time() - DAY_IN_SECONDS ), // старше 1 дня
        'limit' => -1, // без лимита
        'return' => 'ids',
    );

    $orders = wc_get_orders( $args );

    if ( empty( $orders ) ) {
        return;
    }

    foreach ( $orders as $order_id ) {
        wp_trash_post( $order_id ); // отправляем заказ в корзину
    }
}

// Создаем событие при активации темы/плагина
function wpsource_schedule_order_cleanup() {
    if ( ! wp_next_scheduled( 'wpsource_daily_order_cleanup' ) ) {
        wp_schedule_event( time(), 'daily', 'wpsource_daily_order_cleanup' );
    }
}
add_action( 'wp', 'wpsource_schedule_order_cleanup' );

// Привязываем функцию к событию
add_action( 'wpsource_daily_order_cleanup', 'wpsource_delete_unpaid_orders' );

3. Объяснение кода

  • Функция wpsource_delete_unpaid_orders находит все заказы со статусом pending, созданные более суток назад.
  • Удаление происходит через wp_trash_post, чтобы не потерять данные сразу, но можно заменить на wp_delete_post для полного удаления.
  • Через wp_schedule_event создаётся ежедневное событие, которое запускает очистку автоматически.

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

Чтобы убедиться, что код работает:

  • Создайте тестовый заказ со статусом «Ожидает оплаты» (pending).
  • Измените дату создания заказа в базе на более старую, чем 24 часа (через phpMyAdmin или WP CLI).
  • Запустите wp-cron вручную: wget -q -O - https://ваш_сайт/wp-cron.php?doing_wp_cron или используйте плагин WP Crontrol.
  • Проверьте в админке WooCommerce — заказ должен быть перемещён в корзину (Trash).

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

  • Код не работает, cron не запускается: Проверьте, включён ли WP-Cron на сайте (опция DISABLE_WP_CRON не должна быть true). Можно настроить системный cron на сервере.
  • Заказы не удаляются, хотя подходят под условие: Проверьте правильность статуса заказа. Для неоплаченных чаще всего pending или failed. Можно расширить фильтр.
  • Удаляются лишние заказы: Перед удалением добавьте логирование или уведомление, чтобы убедиться, что выборка корректна.

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

  • Не используйте полный wp_delete_post без резервного копирования базы, чтобы избежать потери данных.
  • Добавьте проверку прав пользователя, если хотите запускать очистку вручную через админку.
  • Для больших магазинов с тысячами заказов делайте удаление пакетами (например, по 50 заказов за запуск), чтобы не перегружать сервер.
  • Используйте плагин как Clearfy Pro для дополнительной очистки и оптимизации WooCommerce без лишнего кода.

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

МетодПлюсыМинусы
WP-Cron + кастомный кодГибкость, без лишних плагинов, точный контрольНужен опыт, требует тестирования, зависит от WP-Cron
Плагины для очистки WooCommerceПростота использования, готовые настройкиМожет грузить сайт, лишний софт, меньше контроля
Ручное удаление через админкуПростота, отсутствие риска автоматических ошибокЗатратно по времени, не подходит для большого объёма
Как удалить автоматические ревизии в WordPress для ускорения сайта
19.03.2026
Как создать автоматический sitemap в WordPress без плагинов
06.12.2025
Как отключить Emoji в WordPress эффективно и без плагинов
29.12.2025
WooCommerce: решение проблем с оплатой через разные платёжные системы
21.05.2026
WooCommerce: как автоматически удалять заказы после отмены платежа
17.06.2026