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

Диагностика проблемы с неподтверждёнными заказами в WooCommerce

В интернет-магазинах на WooCommerce часто накапливаются заказы со статусом pending или failed, которые не были оплачены или подтверждены. Это приводит к раздутой базе данных и усложняет управление заказами.

Проверьте, сколько таких заказов у вас сейчас в базе. Для этого можно использовать SQL-запрос в phpMyAdmin или WP-CLI:

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed');

Если число превышает несколько сотен или тысяч — пора автоматизировать очистку.

Почему важно удалять неподтверждённые заказы

  • Уменьшается размер базы данных и время отклика запросов.
  • Административная панель работает быстрее без лишних записей.
  • Уменьшается риск ошибок при выгрузке заказов в бухгалтерию и CRM.

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

1. Создание функции для удаления заказов старше заданного срока

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

function wpaction_delete_old_unpaid_orders() {
    $days = 7; // количество дней, по истечении которых заказы считаются устаревшими
    $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => ['wc-pending', 'wc-failed'],
        'date_query'     => [
            [
                'column' => 'post_date',
                'before' => $date,
            ],
        ],
        'fields'         => 'ids',
        'posts_per_page' => -1,
    ];

    $orders = get_posts($args);

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

2. Запуск функции по расписанию через WP-Cron

Добавьте планировщик задач, чтобы функция запускалась ежедневно:

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

add_action('wpaction_delete_old_unpaid_orders_event', 'wpaction_delete_old_unpaid_orders');

3. Очистка задачи при деактивации

Чтобы не оставлять мусор, удалите расписание при деактивации плагина или темы:

function wpaction_deactivate_cleanup() {
    $timestamp = wp_next_scheduled('wpaction_delete_old_unpaid_orders_event');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpaction_delete_old_unpaid_orders_event');
    }
}
register_deactivation_hook(__FILE__, 'wpaction_deactivate_cleanup');

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

1. Перед добавлением кода сделайте резервную копию базы данных.

2. Запустите функцию вручную в тестовой среде:

wpaction_delete_old_unpaid_orders();

3. Проверьте количество заказов с помощью SQL-запроса из раздела диагностики.

4. Убедитесь, что заказы старше 7 дней со статусом pending и failed удалены.

5. Проверьте журнал ошибок и логи сервера на предмет нежелательных ошибок.

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

  • Не удаляются заказы: Проверьте правильность статусов и даты в date_query. Возможно, у вас нестандартные статусы или другая временная зона.
  • Планировщик не срабатывает: WP-Cron запускается при посещении сайта. Для надёжности настройте системный cron на сервере.
  • Удаление не полное: Функция wp_delete_post с параметром true удаляет все связанные метаданные. Если остались данные — проверьте сторонние плагины, которые могут создавать свои таблицы.

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

  • Запускайте удаление в низкую нагрузку сервера, чтобы не замедлять сайт.
  • Ограничьте количество удаляемых заказов за один раз, если база очень большая. Например, добавьте параметр posts_per_page = 100 и используйте пагинацию.
  • Храните резервные копии базы, чтобы избежать потери важных данных.
  • Для масштабных магазинов рассмотрите использование WP-CLI-скриптов для пакетного удаления.

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

СпособПреимуществаНедостатки
Ручное удаление через админкуПросто, не требует кодаЗатратно по времени, не автоматично
Плагины очистки (например, WP Sweep)Автоматизация, удобный интерфейсДополнительная нагрузка, могут удалять лишнее
Код с WP-Cron (описанный способ)Полный контроль, без сторонних плагиновТребует навыков разработки, настройка WP-Cron
WooCommerce: как автоматически удалять товары из каталога при нулевых запасах без плагинов
07.08.2026
WooCommerce: как автоматически удалять товары из каталога при отсутствии на складе
15.06.2026
WooCommerce: как автоматически исключать товары из каталога при отсутствии на складе
20.05.2026
Как установить охранные роли в WordPress для доступа к административной панели
09.03.2026
WooCommerce: как изменить цену товара на лету с помощью фильтров
04.06.2026