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

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

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

Чтобы избежать загромождения, важно настроить автоматическое удаление таких заказов по истечении заданного времени. Ручная очистка неудобна, а стандартного функционала WooCommerce для этого нет.

Как проверить, что проблема существует

  • Перейдите в WooCommerce → Заказы и отфильтруйте по статусам on-hold и pending.
  • Посмотрите на количество заказов, которые не меняли статус более 7-14 дней.
  • Оцените нагрузку на базу данных и скорость отклика сайта.

Если таких заказов более сотни, стоит подумать об их автоматическом удалении.

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

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

Создадим функцию, которая будет удалять заказы со статусом pending или on-hold, которым больше заданного количества дней:

function wplike_delete_old_unpaid_orders() {
    $days = 14; // Удаляем заказы старше 14 дней
    $date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

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

    $orders = get_posts($args);

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_trash_post($order_id); // Лучше сначала в корзину
        }
    }
}

2. Регистрируем WP-Cron задачу

Добавим ежедневное выполнение через cron:

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

add_action('wplike_daily_order_cleanup_hook', 'wplike_delete_old_unpaid_orders');

3. Очистка по расписанию и ручной запуск

Для тестирования можно вызвать функцию вручную через админский файл или WP-CLI:

wp eval 'wplike_delete_old_unpaid_orders();'

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

  • Проверьте список заказов в админке WooCommerce → Заказы — заказы старше 14 дней в статусах pending и on-hold должны пропасть.
  • Проверьте логи WP-Cron (например, с помощью плагина WP Crontrol), чтобы убедиться, что задача выполняется раз в сутки.
  • Убедитесь, что новые заказы не удаляются преждевременно.

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

  • Заказы не удаляются: проверьте, что WP-Cron работает. На хостингах с низкой посещаемостью cron может не запускаться — настройте системный cron или вызов wp-cron.php по расписанию.
  • Удаляются заказы, которые еще актуальны: проверьте значение переменной $days и фильтры статусов. Чтобы избежать потери данных, лучше сначала отправлять заказы в корзину, а не удалять сразу.
  • Повышенная нагрузка при удалении большого числа заказов: добавьте ограничение на количество удаляемых заказов за один запуск, например, posts_per_page => 100, и запускайте cron чаще.

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

  • Всегда используйте wp_trash_post(), чтобы оставить возможность восстановления заказа.
  • Добавьте логи удаления – записывайте ID удаленных заказов в отдельный лог-файл или таблицу для аудита.
  • Проводите очистку в ночное время, чтобы минимизировать влияние на работу сайта.
  • Для крупных магазинов с десятками тысяч заказов рассмотрите использование WP-CLI для пакетного удаления заказов без нагрузки на веб-сервер.
  • Перед внедрением сделайте резервную копию базы данных.

Таблица сравнения подходов удаления заказов

МетодПлюсыМинусыПример кода
Удаление через WP-Cron (автоматически) Автоматизация, минимальное вмешательство Зависит от работы WP-Cron, возможна нагрузка при большом объеме wp_schedule_event + wp_trash_post()
Ручное удаление в админке Полный контроль, безопасно Трудозатратно, не подходит для больших объемов Через интерфейс WooCommerce
Использование плагинов (например, Clearfy Pro) Готовые решения, удобный интерфейс Плагины могут быть платными, лишний код на сайте Настройки в плагине
Как сделать автоматический редирект в WordPress по условиям
14.04.2026
Как автоматически изменять URL записей WordPress по шаблону
03.04.2026
Как автоматизировать работу с изображениями в WordPress
25.11.2025
Как добавить уникальное метаполе к записям WordPress без плагинов
25.02.2026
Автоматическое удаление записей по возрасту в WordPress
01.03.2026