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

Диагностика проблемы с неоплаченными заказами

На сайтах WooCommerce часто накапливается большое количество неоплаченных заказов, которые не удаляются автоматически. Это приводит к раздутой базе данных, замедлению работы административной панели и неактуальной статистике. Особенно это заметно при большом потоке пользователей и заказов.

Проверьте, есть ли у вас неоплаченные заказы старше определённого срока. Для этого в админке WooCommerce перейдите в раздел Заказы и установите фильтр по статусу on-hold или pending, а затем отсортируйте по дате создания. Если таких заказов много, их стоит регулярно удалять.

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

Реализуем удаление неоплаченных заказов старше 3 дней с помощью WP-Cron и стандартных функций WooCommerce.

1. Создание WP-Cron задачи

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

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

add_action('wc_delete_old_unpaid_orders', 'wc_delete_unpaid_orders_older_than_3_days');

function wc_delete_unpaid_orders_older_than_3_days() {
    $args = array(
        'limit' => -1,
        'status' => array('pending', 'on-hold'),
        'date_created' => '<' . (time() - 3 * DAY_IN_SECONDS),
        'return' => 'ids',
    );

    $orders = wc_get_orders($args);

    foreach ($orders as $order_id) {
        $order = wc_get_order($order_id);
        if ($order) {
            $order->delete(true); // true для полного удаления
        }
    }
}

2. Объяснение кода

  • wp_schedule_event создает ежедневное событие, которое запускает функцию удаления.
  • wc_get_orders получает список заказов со статусом pending или on-hold, созданных более 3 дней назад.
  • Цикл удаляет каждый заказ полностью через метод delete(true).

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

  • Выполните вручную запуск задачи через WP-CLI: wp cron event run wc_delete_old_unpaid_orders.
  • Проверьте раздел заказов в админке — заказы старше трёх дней со статусом pending или on-hold должны исчезнуть.
  • Для отладки можно добавить логирование внутри функции, например, через error_log('Удален заказ ' . $order_id);.

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

  • Нечастый запуск WP-Cron: на некоторых хостингах WP-Cron запускается только при посещении сайта. Для надежности настройте системный cron или используйте плагин WP Crontrol для запуска задач вручную.
  • Неправильные статусы заказов: убедитесь, что в аргументе 'status' указаны именно те статусы, которые вы хотите удалять. Иногда статусы могут быть кастомными.
  • Удаление не происходит: проверьте, что функция подключена и не вызывает ошибок. Включите WP_DEBUG и смотрите логи.
  • Удаление заказов с оплатой в процессе: будьте осторожны с удалением заказов, которые могут быть в процессе оплаты или ожидать подтверждения.

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

  • Всегда делайте резервные копии базы данных перед автоматическим удалением заказов.
  • Ограничьте выборку заказов для удаления по времени и статусу, чтобы не перегружать сервер.
  • Если заказов очень много, разбивайте удаление на партии по 50-100 заказов за один запуск.
  • Для оптимизации можно использовать плагин Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wpteam.ru&utm_medium=article&utm_campaign=woocommerce-avtomaticheskoe-udaleniye-neoplachennyh-zakazov-po-sroku), который помогает управлять базой и удалять неактуальные записи.

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

СпособПлюсыМинусы
Ручное удаление в админкеПростота, контрольТрудозатратно, неавтоматично
WP-Cron с кастомным кодомАвтоматизация, точечное управлениеНужны навыки, возможны ошибки при некорректном коде
Плагины для очистки базыУдобно, набор функцийМогут влиять на производительность, лицензирование

Возникли задачи по WP? Вы можете задать свой вопрос на FAQwp.com Либо обратиться к специалистам поддержки.