Автоматическое удаление заказов WooCommerce по статусу «неоплачено» и интеграция с кассой (ККМ)

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

В WooCommerce заказ со статусом «неоплачено» (Pending payment) может оставаться в базе неопределённое время. При большом количестве таких заказов база растёт, что негативно влияет на производительность и усложняет работу с данными. Кроме того, многие магазины, использующие онлайн-кассы (ККМ), сталкиваются с необходимостью синхронизации статусов заказов, чтобы не отправлять в отчет лишние неоплаченные позиции.

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

  • Более 5-10% заказов в статусе «неоплачено» за последние 30 дней;
  • Замедление работы админки WooCommerce;
  • Ошибки или некорректные отчёты с ККМ;
  • Отсутствие политики хранения «неоплаченных» заказов.

Как проверить текущее количество заказов в статусе «неоплачено»

Для быстрой оценки можно выполнить SQL-запрос к базе данных WordPress:

SELECT COUNT(ID) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-pending';

Замените wp_ на ваш префикс таблиц. Результат покажет, сколько заказов в статусе «неоплачено» сейчас хранится и может быть кандидатом на удаление.

Пошаговое решение: удаление заказов с «неоплачено» старше N дней

Шаг 1. Создаем функцию для удаления заказов

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

function wpclass_delete_old_pending_orders() {
    $days = 7; // удалять заказы старше 7 дней
    $date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
    
    $args = [
        'limit'        => -1,
        'status'       => 'pending',
        'date_created' => '<' . $date,
        'return'       => 'ids',
    ];
    
    $orders = wc_get_orders($args);
    
    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // полное удаление без перемещения в корзину
    }
}

Шаг 2. Запускаем функцию по расписанию (WP-Cron)

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

add_action('wpclass_daily_delete_pending_orders', 'wpclass_delete_old_pending_orders');

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

Этот код запустит удаление заказов ежедневно. При необходимости интервал можно изменить на еженедельно, создав свой интервал.

Интеграция с ККМ: как не удалять заказы, отправленные в кассу

Если вы используете онлайн-кассу (например, через плагин «МойСклад», «АТОЛ» или другие), важно не удалять заказы, которые уже отправлены в ККМ для фискализации.

Для этого добавьте в заказы мета-ключ, например, kkm_sent со значением yes. Тогда функцию удаления можно модифицировать:

function wpclass_delete_old_pending_orders_exclude_kkm() {
    $days = 7;
    $date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

    $args = [
        'limit'        => -1,
        'status'       => 'pending',
        'date_created' => '<' . $date,
        'return'       => 'ids',
        'meta_query'   => [
            [
                'key'     => 'kkm_sent',
                'compare' => 'NOT EXISTS',
            ],
        ],
    ];

    $orders = wc_get_orders($args);

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true);
    }
}

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

Через 1-2 дня после запуска WP-Cron проверьте:

  • Количество заказов в статусе «неоплачено» через SQL-запрос (см. выше) — оно должно уменьшиться;
  • В админке WooCommerce — исчезновение старых неоплаченных заказов;
  • Логи плагина ККМ — убедитесь, что удаляются только заказы без метки kkm_sent;
  • Отчёты по заказам — нет пропавших или удалённых заказов с пометкой ККМ.

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

  • Ошибка: Заказы не удаляются.
    Причина: Задача WP-Cron не срабатывает или функция не вызывается.
    Решение: Проверьте, работает ли WP-Cron на сайте, используя плагин WP Crontrol. Вызовите функцию вручную через wpclass_delete_old_pending_orders() для теста.
  • Ошибка: Удаляются заказы, уже отправленные в ККМ.
    Причина: Нет проверки мета-ключа kkm_sent или он не установлен.
    Решение: Добавьте проверку мета-ключа, убедитесь, что плагин ККМ ставит этот флаг.
  • Ошибка: Удаление замедляет сайт.
    Причина: При большом количестве заказов выполняется удаление всех сразу.
    Решение: Разбейте удаление на партии по 50-100 заказов в одном запуске, добавьте задержки между пакетами.

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

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

Сравнение методов удаления заказов

МетодПреимуществаНедостаткиКогда применять
Ручное SQL удалениеБыстро, эффективноРиск повреждения данных, нет триггеров WPДля опытных разработчиков, при аварийной очистке
Удаление через WP функции (wc_get_orders, wp_delete_post)Безопасно, триггеры, хуки срабатываютМедленнее, нагрузка на серверДля регулярного использования, автоматизации
Плагины очистки (например, Clearfy Pro)Удобство, интерфейсОграниченная гибкость, возможны конфликтыДля пользователей без навыков программирования
Создание настройки для изменения заголовка страницы в WordPress через админку
09.01.2026
Как создать динамический фильтр таксономий в WordPress для удобства пользователей
07.04.2026
Как избежать проблем со скоростью загрузки WordPress при большом количестве плагинов
17.12.2025
Как изменить URL структуру таксономии в WordPress без потери SEO
17.02.2026
Оптимальный порядок загрузки скриптов и стилей в WordPress для улучшения производительности
21.12.2025