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

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

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

Удаление таких заказов вручную через админку неудобно и занимает время. Автоматизация процесса с помощью кода — оптимальное решение.

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

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

В WooCommerce неоплаченные заказы обычно имеют статус pending (ожидает оплаты) или failed (неудачная оплата). В нашем примере будем удалять заказы со статусами pending и failed, созданные более 24 часов назад.

2. Добавляем функцию удаления заказов через WP-Cron

Чтобы не запускать удаление вручную, создадим ежесуточное задание с помощью WP-Cron, выполняющее очистку.

function wpt_remove_old_unpaid_orders() {
    $args = array(
        'status' => array('pending', 'failed'),
        'date_created' => '<' . ( time() - DAY_IN_SECONDS ),
        'limit' => -1,
        'return' => 'ids',
    );

    $orders = wc_get_orders( $args );
    foreach ( $orders as $order_id ) {
        wp_delete_post( $order_id, true );
    }
}

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

add_action( 'wpt_daily_remove_unpaid_orders', 'wpt_remove_old_unpaid_orders' );

3. Как добавить код в тему или плагин

Лучше всего помещать этот код в functions.php дочерней темы или в отдельный site-specific плагин, чтобы не потерять изменения при обновлении.

Проверка результата: как убедиться, что удаление работает

  1. Создайте тестовый заказ в статусе pending или failed.
  2. Измените дату создания заказа на более 24 часов назад (через базу или плагин для редактирования заказов).
  3. Вручную запустите событие WP-Cron:
    do_action('wpt_daily_remove_unpaid_orders');
  4. Проверьте, что заказ удалён из списка заказов WooCommerce.
  5. Убедитесь, что в дальнейшем удаление будет происходить автоматически раз в сутки.

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

  • Заказы не удаляются: Проверьте, что WP-Cron работает на вашем хостинге. Для теста вызовите функцию напрямую через do_action.
  • Удаляются не те заказы: Проверьте параметры фильтрации status и date_created в wc_get_orders. Можно вывести список ID заказов до удаления для отладки.
  • Код вызывает ошибку: Убедитесь, что WooCommerce активен и функция wc_get_orders доступна. Поместите код в after_setup_theme или используйте проверку функции function_exists.

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

  • Используйте wp_delete_post( $order_id, true ) с параметром true, чтобы полностью удалить заказ без перемещения в корзину, освобождая место.
  • Не запускайте удаление слишком часто — раз в сутки достаточно, чтобы избежать нагрузки.
  • Для больших магазинов с тысячами заказов добавьте пагинацию по ID заказов с ограничением, чтобы не превышать лимиты памяти и времени выполнения.
  • Перед внесением изменений сделайте резервную копию базы данных.

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

МетодПреимуществаНедостаткиПример
Ручное удаление через админкуПросто, не требует кодаЗатратно по времени, не автоматичноВ админке WooCommerce → Заказы
Плагин для очистки заказовАвтоматизация, удобный интерфейсНагрузка плагина, ограниченная гибкостьПлагины типа "WooCommerce Order Cleaner"
Самописный код с WP-CronПолный контроль, автоматизацияТребует навыков, возможны ошибкиКод из статьи
Как создать динамические формы в WordPress с помощью REST API
27.01.2026
Как сделать автоматический откат обновлений в WordPress при ошибках
03.04.2026
Как использовать REST API в WordPress для создания нестандартных эндпоинтов
09.12.2025
Как сделать динамические виджеты в WordPress с помощью REST API
25.12.2025
Как массово изменить title и meta description в WordPress без плагинов
07.05.2026