WPCourse

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

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

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

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

1. Определяем критерии для удаления

Обычно удаляем заказы со статусом pending или failed, которые старше определённого срока (например, 7 дней).

2. Добавляем планировщик задач (WP-Cron)

Создайте функцию для удаления заказов и запустите её по расписанию, например, один раз в сутки.

function wpcourse_delete_old_unpaid_orders() {
    $days = 7; // удалить заказы старше 7 дней
    $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $args = [
        'limit' => -1,
        'status' => ['pending', 'failed'],
        'date_created' => '<' . $date,
        'return' => 'ids',
    ];

    $orders = wc_get_orders($args);

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // принудительно удалить заказ
    }
}

// Регистрируем задачу при активации темы или плагина
function wpcourse_schedule_order_cleanup() {
    if (!wp_next_scheduled('wpcourse_daily_order_cleanup')) {
        wp_schedule_event(time(), 'daily', 'wpcourse_daily_order_cleanup');
    }
}
add_action('wp', 'wpcourse_schedule_order_cleanup');

// Вешаем функцию удаления на событие
add_action('wpcourse_daily_order_cleanup', 'wpcourse_delete_old_unpaid_orders');

3. Очистка базы данных

Удаление заказов через wp_delete_post очищает все связанные записи, в том числе метаданные и элементы корзины, что важно для корректного освобождения места.

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

  • Создайте тестовый заказ со статусом pending и установите дату создания старше 7 дней в базе через phpMyAdmin или плагин WP Crontrol.
  • Запустите вручную крон-задачу через WP CLI или плагин WP Crontrol.
  • Проверьте, удалился ли заказ из списка заказов WooCommerce.

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

  • Задача не запускается: проверьте, работает ли WP-Cron на сайте, нет ли конфликтов с хостингом, где Cron может быть отключён.
  • Удаление заказов не происходит: убедитесь, что функция получает ID заказов, и что wp_delete_post вызывается без ошибок.
  • Заказы остаются в базе: возможно, статусы заказов отличаются от pending и failed. Расширьте массив статусов или проверьте даты создания заказов.
  • Ошибка прав доступа: код должен выполняться с правами администратора, либо при запуске WP-Cron.

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

  • Для больших магазинов с огромным количеством заказов используйте постраничный обход заказов с 'limit' => 100 и смещением, чтобы не перегружать память.
  • Регулярно делайте резервные копии базы перед внедрением автоматических удалений.
  • Добавьте логирование удалённых заказов для контроля и аудита.
  • Если WP-Cron не работает стабильно, настройте системный cron на хостинге для вызова wp-cron.php.

Таблица сравнения методов очистки заказов

МетодПлюсыМинусыКомпромисс
Удаление через WP-Cron и wc_get_ordersАвтоматизация, чистое удаление, гибкие критерииЗависит от WP-Cron, нагрузка при большом количестве заказовПостраничная обработка для нагрузки
Ручное удаление через админкуПростота, не требует кодаНеавтоматично, трудоёмко при больших объёмахИспользовать для мелких магазинов
Плагины очистки базыДополнительный функционал, удобствоМогут конфликтовать, не всегда тонкая настройкаИспользовать при отсутствии кастомных требований
×
Прокачай свой сайт WordPress!

WordPress

-20% на премиум темы и плагины

Создай сайт своей мечты ⋙