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

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

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

Как определить, есть ли неоплаченные заказы

  • В админке WooCommerce перейдите в раздел Заказы.
  • Отфильтруйте заказы по статусу ожидает оплаты (pending payment).
  • Обратите внимание на дату создания заказов — если есть заказы старше нескольких дней, которые так и не оплатили, то их стоит удалять автоматически.

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

  • Снижение нагрузки на базу данных и ускорение запросов.
  • Предотвращение путаницы в отчетах и статистике продаж.
  • Автоматизация рутинных задач для удобства администраторов.

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

WooCommerce не имеет встроенного механизма для автоматического удаления неоплаченных заказов, но это можно реализовать с помощью пользовательского кода, добавленного в файл functions.php темы или в отдельный плагин.

Шаг 1. Настройте интервал времени для удаления

Определите, через сколько времени после создания заказа без оплаты его нужно удалять. Например, 24 часа.

Шаг 2. Создайте функцию удаления заказов

function wplist_delete_unpaid_orders() {
    $days = 1; // Количество дней после создания заказа
    $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $args = array(
        'status' => 'pending',
        'date_created' => '<' . $date,
        'limit' => -1,
        'return' => 'ids',
    );

    $orders = wc_get_orders($args);

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

Шаг 3. Запланируйте регулярное выполнение функции с помощью WP-Cron

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

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

add_action('wplist_daily_delete_unpaid_orders', 'wplist_delete_unpaid_orders');

Шаг 4. Добавьте очистку по удалению из корзины (опционально)

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

function wplist_empty_trash_orders() {
    $args = array(
        'post_type' => 'shop_order',
        'post_status' => 'trash',
        'posts_per_page' => -1,
    );
    $orders = get_posts($args);

    foreach ($orders as $order) {
        wp_delete_post($order->ID, true); // Удаление безвозвратно
    }
}

if (! wp_next_scheduled('wplist_weekly_empty_trash')) {
    wp_schedule_event(time(), 'weekly', 'wplist_weekly_empty_trash');
}
add_action('wplist_weekly_empty_trash', 'wplist_empty_trash_orders');

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

  • Создайте тестовый заказ в статусе ожидает оплаты.
  • Убедитесь, что дата создания заказа старше значения, заданного в переменной $days.
  • Запустите функцию вручную (для теста) или дождитесь срабатывания WP-Cron.
  • Проверьте админку WooCommerce, фильтруя заказы со статусом pending — тестовый заказ должен исчезнуть или попасть в корзину.
  • Проверьте корзину заказов и убедитесь, что там находятся удалённые заказы.

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

  • Функция не запускается автоматически
    Проверьте, активен ли WP-Cron на сайте. Если сайт редко посещается, WP-Cron может не срабатывать. Для решения можно настроить системный cron на сервере, который вызывает wp-cron.php.
  • Удаляются не те заказы
    Проверьте параметры в wc_get_orders, особенно статус и дату создания. Убедитесь, что статус pending используется корректно для неоплаченных заказов.
  • Функция удаляет заказы, которые должны остаться
    Увеличьте значение переменной $days или добавьте дополнительные условия фильтрации.
  • Заказы не удаляются, а только перемещаются в корзину
    Это штатное поведение функции wp_trash_post. Для полного удаления используйте wp_delete_post($order_id, true), но будьте осторожны — данные будут утеряны без возможности восстановления.

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

  • Перед добавлением кода сделайте резервную копию сайта и базы данных.
  • Добавляйте код в дочернюю тему или создавайте небольшой плагин, чтобы не потерять изменения при обновлении.
  • Проверяйте логи ошибок PHP для выявления возможных проблем с кодом.
  • Оптимизируйте частоту запуска WP-Cron, чтобы не перегружать сервер.
  • Используйте плагин Clearfy Pro для дополнительной оптимизации базы данных и очистки сайта от мусора, если количество заказов большое.

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

МетодПлюсыМинусыКомпромисс
Ручное удаление в админке WooCommerceПросто, не требует кодаТрудозатратно, риск забытьПодходит для маленьких магазинов
Автоматизация WP-Cron + кодПолная автоматизация, гибкость, контрольТребует навыков программированияИдеально для средних и крупных магазинов
Плагины для очистки заказов (например, WP Bulk Delete)Удобный интерфейс, дополнительные функцииМогут конфликтовать, лишний вес сайтаПодходит, если не хотите писать код
Как проверить и исправить ошибки в базе данных WordPress
09.04.2026
Упаковка данных в WordPress для оптимизации базы данных
26.01.2026
Как создать автоматический импорт пользовательских данных в WordPress
26.03.2026
Как удалить удалённых пользователей в WordPress без отказов и ошибок
08.12.2025
WooCommerce: Автоматическое удаление неоплаченных заказов — подробное руководство
12.06.2026