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

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

Накопление неподтверждённых заказов (статусы «pending» или «on-hold») может приводить к росту базы данных и замедлению работы сайта. Особенно это заметно при большом трафике и активных продажах. Чтобы понять, есть ли такая проблема, выполните запрос к базе данных через phpMyAdmin или с помощью WP-CLI:

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

Если количество неподтверждённых заказов растёт непропорционально продажам, пора автоматизировать их удаление.

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

1. Создание функции для удаления заказов

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

function wpma_delete_unconfirmed_orders() {
    global $wpdb;
    $statuses = ['wc-pending', 'wc-on-hold'];
    $interval = 60 * 60 * 24; // 24 часа
    $threshold = time() - $interval;

    $orders = $wpdb->get_col( $wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status IN (%s, %s) AND post_date < %s",
        $statuses[0], $statuses[1], date('Y-m-d H:i:s', $threshold)
    ));

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // true для полного удаления
    }
}

2. Регистрация WP-Cron задачи

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

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

add_action('wpma_delete_unconfirmed_orders_hook', 'wpma_delete_unconfirmed_orders');

3. Очистка при деактивации плагина или темы

Важно убрать задачу WP-Cron при деактивации, чтобы не оставлять мусор:

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

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

Для проверки работы решения:

  • Создайте тестовый заказ в статусе pending.
  • Установите время создания заказа более 24 часов назад (через базу или измените период в коде на меньшее время для теста).
  • Запустите событие WP-Cron вручную с помощью плагина WP Crontrol или WP-CLI:
wp cron event run wpma_delete_unconfirmed_orders_hook

После выполнения заказа должен исчезнуть из базы. Проверьте таблицу wp_posts на наличие заказов с указанными статусами старше 24 часов.

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

  • Не срабатывает WP-Cron: проверьте, включён ли WP-Cron на сайте, и есть ли вызовы wp-cron.php в браузере или через системный cron. Для надёжности настройте системный cron на вызов wp-cron.php.
  • Неправильные статусы заказов: убедитесь, что используете правильные статусы WooCommerce с префиксом wc-. Для проверки выполните print_r(wc_get_order_statuses()); в отладчике.
  • Отсутствие прав на удаление: функция wp_delete_post требует прав администратора — убедитесь, что код запускается с достаточными правами.
  • Удаление не того периода: будьте осторожны с временным порогом, лучше протестировать на небольшом интервале, прежде чем ставить 24 часа.

Варианты решения: плагин vs код vs компромисс

МетодПлюсыМинусыКомпромисс
Плагин (например, Clearfy Pro) Удобный интерфейс, поддержка, обновления, дополнительные функции очистки Дополнитель нагрузка, стоимость, возможные конфликты Использовать на крупных сайтах с поддержкой
Код через WP-Cron (как в статье) Полный контроль, нет лишних зависимостей, минимальная нагрузка Требуется опыт, возможны ошибки при неправильной настройке cron Использовать на средних и малых сайтах с разработчиком
Комбинация: плагин + кастомный код Использовать плагин для мониторинга, код для кастомных условий Сложность поддержки, требует тестирования Оптимально для проектов с уникальными требованиями

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

  • Перед удалением заказов лучше сделать резервную копию базы, особенно на боевом сайте.
  • Настройте системный cron для вызова WP-Cron, чтобы задачи выполнялись надёжно.
  • Следите за размерами таблиц wp_posts и wp_postmeta, чтобы вовремя оптимизировать базу.
  • Не увеличивайте слишком часто интервал проверки, чтобы не создавать лишнюю нагрузку.
  • Если используете плагины кеширования, убедитесь, что кеш не мешает обновлению данных о заказах.
Как удалить или скрыть категории из публикаций WordPress
02.02.2026
WooCommerce: автоматическое отключение способов оплаты при неподтверждённых заказах
14.06.2026
WooCommerce: установка отзывов после покупки с автоподтверждением
20.04.2026
WooCommerce: автоматическое отключение способов оплаты при неподтверждённых заказах
03.06.2026
WooCommerce: автоматическое отключение способов оплаты при неподтверждённых заказах
22.05.2026