WPExperts

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

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

На крупных интернет-магазинах, работающих на WooCommerce, часто скапливается большое количество неоплаченных заказов. Это замедляет работу админки, увеличивает нагрузку на базу данных и искажает статистику продаж. По умолчанию WooCommerce не удаляет такие заказы автоматически — они остаются в базе навсегда. Чтобы поддерживать чистоту заказов и оптимизировать работу магазина, необходимо внедрить автоматическое удаление заказов, не оплаченных в указанный срок.

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

Для начала нужно определить, сколько у вас таких заказов и как давно они создавались. Выполните следующий SQL-запрос в базе данных (через phpMyAdmin или wp-cli):

SELECT ID, post_date, post_status FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-pending' ORDER BY post_date ASC;

Этот запрос покажет все заказы со статусом wc-pending — то есть созданные, но не оплаченные. Если вы видите много таких заказов старше нескольких дней, есть смысл автоматизировать их удаление.

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

1. Создаем функцию для удаления старых неоплаченных заказов

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

function wpexperts_delete_old_unpaid_orders() {
    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => 'wc-pending',
        'date_query'     => array(
            array(
                'before' => '48 hours ago',
            ),
        ),
        'fields'         => 'ids',
        'posts_per_page' => -1,
    );

    $orders = get_posts($args);

    if (empty($orders)) {
        return;
    }

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // true — удаляем навсегда
    }
}

2. Настраиваем cron-задачу для регулярного запуска

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

function wpexperts_schedule_order_cleanup() {
    if (!wp_next_scheduled('wpexperts_daily_order_cleanup')) {
        wp_schedule_event(time(), 'daily', 'wpexperts_daily_order_cleanup');
    }
}
add_action('wp', 'wpexperts_schedule_order_cleanup');

add_action('wpexperts_daily_order_cleanup', 'wpexperts_delete_old_unpaid_orders');

3. Очистка cron-задачи при деактивации (если используете плагин)

function wpexperts_clear_order_cleanup_cron() {
    $timestamp = wp_next_scheduled('wpexperts_daily_order_cleanup');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpexperts_daily_order_cleanup');
    }
}
// добавить вызов этой функции при деактивации плагина

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

Чтобы убедиться, что решение работает:

  • Создайте тестовый заказ и оставьте его неоплаченным.
  • Измените дату создания заказа в базе данных на более чем 48 часов назад (для теста).
  • Запустите вручную функцию из консоли WP-CLI:
wp eval 'wpexperts_delete_old_unpaid_orders();'

Проверьте, что заказ удалился из списка заказов в админке WooCommerce.

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

  • Заказы не удаляются: проверьте, что статус заказа точно wc-pending — другие статусы не затрагиваются.
  • Крон-задача не срабатывает: убедитесь, что в WordPress работают крон-задачи (wp-cron). Для отладки используйте плагин WP Crontrol.
  • Удаление происходит слишком рано или слишком поздно: скорректируйте параметр 'before' => '48 hours ago' на нужный интервал, например, '24 hours ago' или '72 hours ago'.
  • Потеря заказов с другим статусом: внимательно проверьте условие выборки, чтобы не затронуть оплаченные, отменённые или в обработке заказы.

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

  • Используйте wp_delete_post($id, true) для полного удаления, если не планируете восстановление заказов. Иначе можно передавать false и удалять в корзину.
  • Регулярно делайте резервные копии базы данных перед внедрением автоматических удалений.
  • Для больших магазинов с тысячами заказов используйте пагинацию в запросе get_posts, чтобы избежать превышения времени выполнения скрипта.
  • Можно расширить функционал, отправляя уведомления администратору о количестве удалённых заказов по email.

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

МетодОписаниеПлюсыМинусы
Плагин (например, WooCommerce Cancel Abandoned Order) Готовое решение с настройками из админки Простота установки, поддержка Зависимость от стороннего кода, нагрузка
Кастомный код (как в статье) Полный контроль, лёгкость кастомизации Минимальная нагрузка, гибкость Требует навыков, поддержка на вас
Ручное удаление через админку Удаление заказов вручную Безопасно, не требует кода Время, риск пропуска старых заказов
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее