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

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

В WooCommerce неоплаченные заказы (статус pending или failed) могут накапливаться в базе, загромождая админку и замедляя работу сайта. Особенно это актуально для крупных магазинов с высокой конверсией и большим количеством отказов. Автоматическое удаление устаревших неоплаченных заказов помогает поддерживать чистоту базы и улучшить производительность.

Как определить заказы, подлежащие удалению

Мы будем удалять только те заказы, которые находятся в статусе pending или failed и были созданы более 24 часов назад. Это гарантирует, что активные или недавно созданные заказы не пострадают.

SQL-запрос для диагностики

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

SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed') AND post_date < NOW() - INTERVAL 1 DAY;

Если значение большое, есть смысл автоматизировать удаление.

Пошаговое решение: реализация автоматического удаления заказов через WP-Cron

Лучший способ — создать функцию, которая удаляет заказы и привязать её к периодическому событию WP-Cron.

1. Добавляем функцию удаления заказов

function wpb_delete_old_unpaid_orders() {
    global $wpdb;
    $interval = 24; // часы
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $interval . ' hours'));

    // Получаем ID заказов, которые старше 24 часов и имеют статус pending или failed
    $orders = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} 
         WHERE post_type = 'shop_order' 
         AND post_status IN ('wc-pending', 'wc-failed') 
         AND post_date < %s",
        $date_threshold
    ));

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true); // true — без перемещения в корзину
        }
    }
}

2. Регистрируем событие WP-Cron

function wpb_schedule_order_cleanup() {
    if (!wp_next_scheduled('wpb_delete_old_orders_hook')) {
        wp_schedule_event(time(), 'hourly', 'wpb_delete_old_orders_hook');
    }
}
add_action('wp', 'wpb_schedule_order_cleanup');
add_action('wpb_delete_old_orders_hook', 'wpb_delete_old_unpaid_orders');

3. Отмена по желанию (например, при деактивации плагина)

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

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

  • Зайдите в админку WooCommerce → Заказы и поставьте фильтр по статусу "Ожидает оплаты" (pending) и "Неудачный" (failed).
  • Проверьте, что заказы старше 24 часов исчезают или отсутствуют спустя несколько часов после активации кода.
  • Выполните вручную функцию из консоли WP-CLI: wp eval 'wpb_delete_old_unpaid_orders();' — проверьте, что ненужные заказы удаляются.

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

  • Код не запускается — нет события WP-Cron: Убедитесь, что на сайте посещения есть, так как WP-Cron запускается при загрузках страниц. Для теста можно вызвать функцию вручную.
  • Удаляются не те заказы или удаление не происходит: Проверьте правильность статусов заказов. В WooCommerce статусы начинаются с wc-, например wc-pending.
  • Удаление приводит к ошибкам плагинов: Убедитесь, что удаление заказов происходит только после проверки их статуса и возраста. Не удаляйте заказы в статусах «в обработке» или «завершён».
  • Заказы не удаляются, если используется внешний кеш: Очистите кеш сайта и браузера после внедрения кода.

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

  • Используйте wp_delete_post($order_id, true); для полного удаления, чтобы не оставлять в базе мусор.
  • Запускайте удаление не чаще раза в час, чтобы избежать нагрузки на базу.
  • Добавьте логирование в файл, чтобы отслеживать, сколько заказов удаляется за раз:
function wpb_delete_old_unpaid_orders() {
    global $wpdb;
    $interval = 24;
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $interval . ' hours'));
    $orders = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} 
         WHERE post_type = 'shop_order' 
         AND post_status IN ('wc-pending', 'wc-failed') 
         AND post_date < %s",
        $date_threshold
    ));

    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true);
        }
        error_log('Удалено заказов: ' . count($orders));
    } else {
        error_log('Заказы для удаления не найдены');
    }
}
  • Если вы используете плагин Clearfy Pro от WPSHOP, там есть возможность оптимизации базы с удалением заказов по статусам — рассмотрите как альтернативу.

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

МетодПлюсыМинусы
WP-Cron и кастомный кодПолный контроль, без лишних плагиновТребует навыков, зависит от посещаемости сайта
Плагин для очистки базы (например, Clearfy Pro)Простота настройки, доп. функции оптимизацииПлагин — дополнительная нагрузка и стоимость
Ручное удаление через админкуБезопасно, простоНеавтоматично, неудобно при большом объеме
WooCommerce: как автоматически изменять стоимость товара при изменении атрибутов
13.06.2026
Как использовать шорткоды в WooCommerce для расширения функционала на WPBegin
04.12.2025
Как использовать Nonces в WordPress для защиты форм и запросов
28.11.2025
WooCommerce: как автоматически удалять заказы со статусом «Отменен»
25.05.2026
Как удалить кеш в WordPress: практические способы и примеры кода
28.12.2025