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

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

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

Проверить наличие таких заказов можно через административную панель в разделе WooCommerce > Заказы, выбрав фильтр по статусу pending или on-hold. Чтобы понять, сколько заказов осталось неоплаченными длительное время, можно использовать SQL-запрос в базе данных:

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-pending' AND post_date < NOW() - INTERVAL 7 DAY;

Этот запрос покажет количество заказов, которые находятся в статусе pending более 7 дней.

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

Самый надёжный способ – написать кастомный код, который регулярно запускается через WP Cron и удаляет заказ, если он не оплачен и старше заданного времени.

1. Добавляем функцию удаления заказов

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

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array('wc-pending', 'wc-on-hold'),
        'date_query'     => array(
            array(
                'before' => $date_threshold,
                'inclusive' => true,
            ),
        ),
        'posts_per_page' => -1,
        'fields'         => 'ids',
    );

    $orders = get_posts($args);

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

2. Регистрируем планировщик WP Cron

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

3. Привязываем нашу функцию к событию WP Cron

add_action('wptask_delete_old_unpaid_orders_hook', 'wptask_delete_old_unpaid_orders');

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

  • После добавления кода очистка запустится автоматически раз в сутки.
  • Для проверки можно вручную запустить cron-задачу, выполнив в functions.php временно:
wptask_delete_old_unpaid_orders();
  • или вызвать хук через WP CLI:
wp cron event run wptask_delete_old_unpaid_orders_hook
  • Затем проверить раздел заказов на отсутствие старых неоплаченных.
  • Также в базе данных можно снова выполнить SQL-запрос для контроля.

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

  • Удаление не происходит: Проверьте, что WP Cron работает (например, с помощью плагина WP Crontrol). На локальных или некоторых серверах cron может быть отключён.
  • Удаляются оплаченные заказы: Убедитесь, что в фильтр добавлены только статусы wc-pending и wc-on-hold, а не processing или completed.
  • Заказы не удаляются из-за ограничений базы: В случае большого количества заказов стоит делать удаление пакетами (например, по 50 заказов за запуск), чтобы избежать таймаута.
  • Ошибка прав доступа: Убедитесь, что функция вызывается в контексте WordPress с достаточными правами, а удаление через wp_delete_post не блокируется другими плагинами.

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

  • Не используйте wp_delete_post без параметра $force_delete = true, если хотите полностью удалить заказ, а не отправить в корзину.
  • Для сайтов с большой нагрузкой рекомендуем запускать очистку в off-peak время, например с помощью системного cron, который вызывает wp-cron.php.
  • Логируйте удалённые ID заказов в отдельный файл или в системный лог, чтобы иметь возможность отследить действия очистки.
  • Перед удалением можно отправлять уведомление администратору или создавать резервную копию базы, чтобы избежать потери данных.

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

МетодПлюсыМинусыКогда использовать
Плагин (например, WooCommerce Cancel Abandoned Order) Простота настройки, поддержка обновлений Может быть тяжеловесным, добавляет нагрузку Для простых магазинов без кастомных сценариев
Кастомный код с WP Cron (описанный в статье) Лёгкий, гибкий, можно адаптировать под свои нужды Требует базовых навыков программирования Для опытных разработчиков и крупных проектов
Ручное удаление через админку Безопасно, нет рисков автоматизации Нужно время, неудобно при большом количестве заказов Для маленьких магазинов с редкими неоплаченными заказами
Как автоматизировать удаление старых медиа файлов в WordPress
31.01.2026
Автоматическое создание отчёта об ошибках в WordPress
12.12.2025
Как полностью удалить emoji из WordPress для оптимизации скорости
12.12.2025
Как создать автоматическую ответную форму в WordPress
06.01.2026
Как изменить URL автора в WordPress без плагинов
16.12.2025