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

Что такое удаление заказов по просроченной оплате в WooCommerce и зачем это нужно

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

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

Для начала нужно проверить, есть ли у вас в базе заказы с статусом pending, on-hold или failed, которые не меняют статус длительное время. Обычно неоплаченные заказы старше 7–14 дней можно безопасно удалять.

Проверить количество таких заказов можно через SQL-запрос к базе данных:

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-on-hold') AND post_date < NOW() - INTERVAL 14 DAY;

Если число большое — стоит настроить автоматическое удаление.

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

1. Добавление WP-Cron задачи

Создадим функцию, которая будет запускаться ежедневно и удалять заказы со статусом pending старше 14 дней.

function wpb_delete_expired_orders() {
    $args = array(
        'post_type'   => 'shop_order',
        'post_status' => array('wc-pending', 'wc-on-hold'),
        'date_query'  => array(
            array(
                'column'   => 'post_date',
                'before'   => '14 days ago',
            ),
        ),
        'fields'      => 'ids',
        'posts_per_page' => -1,
    );

    $orders = get_posts($args);

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_trash_post($order_id);
        }
    }
}

// Регистрируем событие, если оно еще не зарегистрировано
if (!wp_next_scheduled('wpb_daily_delete_expired_orders')) {
    wp_schedule_event(time(), 'daily', 'wpb_daily_delete_expired_orders');
}

// Подписываем функцию на событие
add_action('wpb_daily_delete_expired_orders', 'wpb_delete_expired_orders');

2. Очистка корзины и удаление связанных данных

Удаление заказа из корзины происходит автоматически при удалении записи типа shop_order. Если вам нужно дополнительно очистить метаданные, можно расширить функцию:

function wpb_delete_expired_orders() {
    $args = array(
        'post_type'   => 'shop_order',
        'post_status' => array('wc-pending', 'wc-on-hold'),
        'date_query'  => array(
            array(
                'column'   => 'post_date',
                'before'   => '14 days ago',
            ),
        ),
        'fields'      => 'ids',
        'posts_per_page' => -1,
    );

    $orders = get_posts($args);

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            // Удаляем метаданные заказов
            global $wpdb;
            $wpdb->delete($wpdb->postmeta, array('post_id' => $order_id));
            // Удаляем сам заказ
            wp_delete_post($order_id, true); // true — принудительное удаление без корзины
        }
    }
}

Как проверить, что удаление заказов работает корректно

  • Проверьте, что в базе нет заказов с post_status wc-pending или wc-on-hold, старше 14 дней (через SQL или админку WooCommerce).
  • Включите логирование и отладку WP-Cron, чтобы убедиться, что задача запускается ежедневно (плагин WP Crontrol или debug-логи).
  • Создайте тестовый заказ со статусом pending и датой более 14 дней назад, затем запустите задачу вручную:
do_action('wpb_daily_delete_expired_orders');

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

Частые ошибки и как их устранить

  • Задача WP-Cron не запускается: Проверьте, что на вашем сайте не отключен WP-Cron (DISABLE_WP_CRON в wp-config.php), либо настройте системный cron на вызов wp-cron.php.
  • Заказы не удаляются: Возможно, статус заказов отличается от указанных. Используйте SQL-запрос для проверки фактических статусов (wc-cancelled, wc-failed и т.д.).
  • Удаляются не те заказы: Убедитесь, что дата сравнивается с post_date заказа, а не с датой статуса. Для точной проверки можно использовать мета-поля даты.

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

  • Используйте wp_trash_post вместо wp_delete_post, если хотите иметь возможность восстановить удалённые заказы.
  • Для больших баз данных разбивайте удаление на партии по 50–100 заказов, чтобы не перегружать сервер.
  • Перед удалением обязательно создайте резервную копию базы данных.
  • Проверяйте, что удаление не ломает отчёты или интеграции с CRM, если они завязаны на заказы.

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

МетодПреимуществаНедостаткиРекомендации
Ручное удаление через админкуПростота, контроль выборкиТрудозатратно при большом количествеПодходит для разовых случаев
Автоматизация через WP-Cron и кодАвтоматизация, регулярность, гибкостьНужно правильно настроить и тестироватьРекомендуется для активных магазинов
Плагины для очистки заказовУдобство интерфейса, дополнительные функцииМожет вызывать конфликты, нагрузкаИспользовать проверенные и обновляемые плагины
Запрет доступа к админке WordPress по IP: настройка и примеры
08.01.2026
Как автоматизировать удаление нерабочих редиректов в WordPress
12.01.2026
Автоматическое удаление заказов WooCommerce по использованным купонам
01.07.2026
WooCommerce: автоматическое удаление заказов по просроченной оплате
21.07.2026
Как создать функцию автоподсказки в поиске WordPress с поддержкой AJAX
19.01.2026