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

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

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

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

Для начала нужно определить, сколько у вас таких заказов и как давно они создавались. Выполните следующий SQL-запрос в базе данных (через phpMyAdmin или wp-cli):

SELECT ID, post_date, post_status FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-pending' ORDER BY post_date ASC;

Этот запрос покажет все заказы со статусом wc-pending — то есть созданные, но не оплаченные. Если вы видите много таких заказов старше нескольких дней, есть смысл автоматизировать их удаление.

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

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

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

function wpexperts_delete_old_unpaid_orders() {
    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => 'wc-pending',
        'date_query'     => array(
            array(
                'before' => '48 hours ago',
            ),
        ),
        'fields'         => 'ids',
        'posts_per_page' => -1,
    );

    $orders = get_posts($args);

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

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // true — удаляем навсегда
    }
}

2. Настраиваем cron-задачу для регулярного запуска

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

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

add_action('wpexperts_daily_order_cleanup', 'wpexperts_delete_old_unpaid_orders');

3. Очистка cron-задачи при деактивации (если используете плагин)

function wpexperts_clear_order_cleanup_cron() {
    $timestamp = wp_next_scheduled('wpexperts_daily_order_cleanup');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpexperts_daily_order_cleanup');
    }
}
// добавить вызов этой функции при деактивации плагина

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

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

  • Создайте тестовый заказ и оставьте его неоплаченным.
  • Измените дату создания заказа в базе данных на более чем 48 часов назад (для теста).
  • Запустите вручную функцию из консоли WP-CLI:
wp eval 'wpexperts_delete_old_unpaid_orders();'

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

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

  • Заказы не удаляются: проверьте, что статус заказа точно wc-pending — другие статусы не затрагиваются.
  • Крон-задача не срабатывает: убедитесь, что в WordPress работают крон-задачи (wp-cron). Для отладки используйте плагин WP Crontrol.
  • Удаление происходит слишком рано или слишком поздно: скорректируйте параметр 'before' => '48 hours ago' на нужный интервал, например, '24 hours ago' или '72 hours ago'.
  • Потеря заказов с другим статусом: внимательно проверьте условие выборки, чтобы не затронуть оплаченные, отменённые или в обработке заказы.

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

  • Используйте wp_delete_post($id, true) для полного удаления, если не планируете восстановление заказов. Иначе можно передавать false и удалять в корзину.
  • Регулярно делайте резервные копии базы данных перед внедрением автоматических удалений.
  • Для больших магазинов с тысячами заказов используйте пагинацию в запросе get_posts, чтобы избежать превышения времени выполнения скрипта.
  • Можно расширить функционал, отправляя уведомления администратору о количестве удалённых заказов по email.

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

МетодОписаниеПлюсыМинусы
Плагин (например, WooCommerce Cancel Abandoned Order) Готовое решение с настройками из админки Простота установки, поддержка Зависимость от стороннего кода, нагрузка
Кастомный код (как в статье) Полный контроль, лёгкость кастомизации Минимальная нагрузка, гибкость Требует навыков, поддержка на вас
Ручное удаление через админку Удаление заказов вручную Безопасно, не требует кода Время, риск пропуска старых заказов
Автоматическое отключение неиспользуемых плагинов в WordPress
20.03.2026
Как сделать автоматический отзыв в WordPress после покупки
22.02.2026
Как использовать внешние шаблоны в WordPress без рисков
03.04.2026
Как использовать хук pre_get_posts для фильтрации запросов в WordPress
19.12.2025
WooCommerce: автоматическое отключение товаров при нулевом остатке без плагинов
19.06.2026