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

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

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

Стандартно WooCommerce не удаляет такие заказы автоматически, что создаёт «засор» базы. Если таких заказов много, это может замедлить работу админки и усложнить управление заказами.

Как проверить наличие «зависших» неоплаченных заказов

Для начала стоит оценить масштаб проблемы. В базе данных заказы хранятся в таблице wp_posts с типом shop_order. Неоплаченные заказы обычно имеют статусы pending, failed или on-hold.

Чтобы быстро увидеть количество неоплаченных заказов, можно выполнить SQL-запрос через phpMyAdmin или WP-CLI:

SELECT post_status, COUNT(*) as count FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('pending', 'failed', 'on-hold') GROUP BY post_status;

Если число заказов в этих статусах большое (сотни и больше), стоит автоматизировать их удаление.

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

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

Создайте или добавьте в functions.php вашей темы следующий код. Он удалит заказы старше 24 часов с статусом pending и failed:

function wc_delete_old_unpaid_orders() {
    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array('wc-pending', 'wc-failed'),
        'date_query'     => array(
            array(
                'column' => 'post_date',
                'before' => '24 hours ago',
            ),
        ),
        'fields'         => 'ids',
        'posts_per_page' => -1,
    );
    $orders = get_posts($args);
    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_trash_post($order_id); // Можно заменить на wp_delete_post($order_id, true) для полного удаления
        }
    }
}

2. Создаём WP-Cron задачу для регулярного запуска

Добавьте регистрацию задачи и её запуск раз в 6 часов:

if (!wp_next_scheduled('wc_delete_unpaid_orders_event')) {
    wp_schedule_event(time(), 'six_hours', 'wc_delete_unpaid_orders_event');
}

add_action('wc_delete_unpaid_orders_event', 'wc_delete_old_unpaid_orders');

// Добавляем интервал 6 часов
add_filter('cron_schedules', function($schedules) {
    $schedules['six_hours'] = array(
        'interval' => 6 * 60 * 60,
        'display'  => __('Каждые 6 часов')
    );
    return $schedules;
});

3. Очистка WP-Cron при удалении темы

Чтобы избежать мусора, удалим задачу при деактивации темы:

function wc_clear_unpaid_orders_cron() {
    $timestamp = wp_next_scheduled('wc_delete_unpaid_orders_event');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wc_delete_unpaid_orders_event');
    }
}
add_action('switch_theme', 'wc_clear_unpaid_orders_cron');

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

  • Через 24 часа проверьте в админке заказы с статусами pending и failed. Старые заказы должны исчезнуть или переместиться в корзину (если используется wp_trash_post).
  • Для контроля можно временно добавить error_log() в функцию удаления, например error_log('Удалён заказ ID: ' . $order_id);, и смотреть логи.
  • Проверьте, что заказ с датой создания менее 24 часов сохраняется.

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

  • Неправильные статусы заказов. WooCommerce хранит статусы с префиксом wc-. Проверьте, что в запросе указан правильный статус: wc-pending, а не pending.
  • WP-Cron не запускается. Если сайт имеет низкий трафик, WP-Cron может не срабатывать. Для надёжности настройте системный cron на сервере или используйте плагин WP Crontrol для ручного запуска.
  • Заказы не удаляются полностью. Функция wp_trash_post() только перемещает заказ в корзину. Для полного удаления используйте wp_delete_post($order_id, true), но будьте осторожны — данные будут безвозвратно утеряны.

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

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

Сравнение вариантов решения

МетодПлюсыМинусы
Плагин (например, WooCommerce Order Cleanup)Простой в установке, готовый функционал, настройки через админкуМожет нагружать сайт, не всегда гибко под нужды проекта
Код в functions.php + WP-CronГибкость, можно настроить под свои задачи, нет лишних плагиновТребуется техническая экспертиза, возможны ошибки при написании кода
Ручное удаление через БД (SQL-запросы)Очень быстро и эффективно, прямой контрольРиск повреждения данных, требует аккуратности, не автоматизировано
WooCommerce: как автоматически удалять товары с нулевым запасом из корзины
05.06.2026
Как использовать хуки в WordPress для эффективного кода
21.11.2025
Как автоматизировать управление публикациями в WordPress с помощью WP-Cron и кода
11.04.2026
Как удалить автоматически ожидающие регистрации пользователей в WordPress
24.03.2026
Как удалить старые ревизии постов WordPress для оптимизации базы данных
01.01.2026

Возникли задачи по WP? Вы можете задать свой вопрос на FAQwp.com Либо обратиться к специалистам поддержки.