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) Готовые решения, удобный интерфейс Плагины могут быть платными, лишний код на сайте Настройки в плагине
Как использовать REST API в WordPress для создания кастомных решений
16.11.2025
Как автоматически удалять неиспользуемые метаполя в WordPress
31.03.2026
Как создать динамические формы в WordPress с помощью AJAX
31.03.2026
Как сделать автоматический редирект в WordPress по условиям
04.03.2026
Как добавить автоматическое сохранение записей через REST API в WordPress
13.12.2025