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

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

На больших магазинах WooCommerce накопление неоплаченных заказов приводит к раздуванию базы данных, замедлению работы и усложнению администрирования. При этом стандартного механизма для автоматического удаления таких заказов по истечении определённого времени нет. Обычно неоплаченные заказы остаются в статусе pending или failed и требуют ручного вмешательства.

Чтобы убедиться в наличии проблемы, можно проверить количество неоплаченных заказов в админке WooCommerce в разделе Заказы, отфильтровав по статусам pending и failed. Если их много и они не закрываются, стоит автоматизировать очистку.

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

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

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

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

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

    $orders = wc_get_orders($args);

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

2. Запускаем функцию по расписанию через WP-Cron

Добавьте следующий код для регистрации задания, которое будет запускаться ежедневно:

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

add_action('wpcodex_daily_delete_unpaid_orders', 'wpcodex_delete_old_unpaid_orders');

3. Очистка корзины заказов (Trash)

Заказы, отправленные в корзину, не удаляются автоматически, их нужно очищать периодически. Добавьте функцию для удаления заказов из корзины старше 30 дней:

function wpcodex_empty_trash_orders() {
    global $wpdb;
    $days = 30;
    $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $trash_orders = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = 'trash' AND post_modified < %s",
        $date
    ));

    foreach ($trash_orders as $order_id) {
        wp_delete_post($order_id, true); // окончательное удаление
    }
}

if (! wp_next_scheduled('wpcodex_daily_empty_trash_orders')) {
    wp_schedule_event(time(), 'daily', 'wpcodex_daily_empty_trash_orders');
}
add_action('wpcodex_daily_empty_trash_orders', 'wpcodex_empty_trash_orders');

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

  • Создайте тестовый заказ с оплатой «Ожидает оплаты» и укажите дату создания более 7 дней назад через базу данных или с помощью плагина для редактирования даты.
  • Запустите вручную функцию wpcodex_delete_old_unpaid_orders() из консоли или через админский плагин для запуска хуков (например, WP Crontrol).
  • Проверьте, что заказ переместился в корзину.
  • Запустите функцию wpcodex_empty_trash_orders() и убедитесь, что заказ окончательно удалён из базы.
  • Проверьте логи и работу сайта: отсутствие ошибок и корректное отображение заказов.

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

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

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

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

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

МетодПлюсыМинусыРекомендации
Плагин для очистки заказовПростота установки, готовый интерфейсМожет быть избыточным, нагрузка, ограничения по настройкамИспользовать для небольших магазинов с минимальными требованиями
Ручной запуск SQL-запросовМгновенный результат, без нагрузки на WP-CronРиск повреждения данных, требует знаний SQLИспользовать только с резервной копией и осторожностью
Код на PHP с WP-Cron (как в статье)Гибкость, автоматизация, интеграция с WPЗависит от работы WP-Cron, требует проверкиОптимальный вариант для большинства магазинов
WooCommerce: как автоматически обновлять статус заказа после успешной оплаты
03.06.2026
Как создать автoобновляемый отпуск для постов в WordPress
28.11.2025
Как создать автоматический импорт записей из ВКонтакте в WordPress
14.03.2026
Как создать автоматический импорт сообщений из Telegram в WordPress
05.04.2026
Автоматический импорт данных из Excel в WordPress
06.12.2025