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

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

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

Проверить количество неоплаченных заказов можно в базе данных MySQL через запрос:

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

Если число превышает несколько сотен, это повод внедрять автоматическую очистку.

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

Выбор подхода: плагин или код

Для решения задачи доступны два варианта:

МетодПреимуществаНедостатки
Плагин (например, WooCommerce Delete Old Orders)Простая настройка, GUI, регулярные обновленияДополнительная нагрузка, ограниченные настройки
Кастомный код в functions.php или плагинеГибкость, минимальная нагрузка, точечное поведениеТребует навыков, нужно контролировать изменения WooCommerce

Пошаговая инструкция с кодом для автоматической очистки

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

function wpcoder_delete_old_unpaid_orders() {
    $days_to_keep = 7; // Срок хранения заказов в днях
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days_to_keep . ' days'));

    $args = array(
        'post_type'      => 'shop_order',
        'post_status'    => array('wc-pending', 'wc-failed'),
        'date_query'     => array(
            array(
                'column' => 'post_date',
                'before' => $date_threshold,
            ),
        ),
        'fields'         => 'ids',
        'posts_per_page' => -1,
        'no_found_rows'  => true,
    );

    $orders = get_posts($args);
    if (!empty($orders)) {
        foreach ($orders as $order_id) {
            wp_delete_post($order_id, true); // Полное удаление без перемещения в корзину
        }
    }
}

// Регистрация крон-задачи
if (!wp_next_scheduled('wpcoder_cron_delete_old_unpaid_orders')) {
    wp_schedule_event(time(), 'daily', 'wpcoder_cron_delete_old_unpaid_orders');
}
add_action('wpcoder_cron_delete_old_unpaid_orders', 'wpcoder_delete_old_unpaid_orders');

// При деактивации плагина или кода отключаем крон
function wpcoder_deactivate_cleanup() {
    $timestamp = wp_next_scheduled('wpcoder_cron_delete_old_unpaid_orders');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpcoder_cron_delete_old_unpaid_orders');
    }
}
register_deactivation_hook(__FILE__, 'wpcoder_deactivate_cleanup');

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

  1. Выполните запрос к базе данных для подсчёта неоплаченных заказов, как показано выше, до и после запуска крона.
  2. Проверьте лог WooCommerce или создайте простой лог в функции удаления (например, запись ID удалённых заказов в файл). Это поможет убедиться, что функция сработала.
  3. Подождите один-два дня и убедитесь, что новые неоплаченные заказы старше 7 дней удаляются автоматически.

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

  • Крон-задача не запускается: Проверьте, работает ли WP-Cron на сайте. Можно временно заменить на системный cron или запустить вручную через wp cron event run --due-now в WP-CLI.
  • Заказы не удаляются: Убедитесь, что статусы указаны правильно: wc-pending и wc-failed. Проверьте права пользователя, под которым запускается WP-Cron.
  • Удаляются лишние заказы: Проверьте условие по дате и статусам. При необходимости добавьте дополнительную фильтрацию (например, по метаполям).

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

  • Удаляйте заказы только с помощью wp_delete_post с параметром true, чтобы избежать оставшихся записей в базе.
  • Настройте срок хранения заказов в зависимости от специфики бизнеса, обычно 7–14 дней — оптимально.
  • Не ставьте слишком частый запуск крона — достаточно раз в день.
  • Добавьте логирование, чтобы отслеживать удалённые заказы, и быстро реагировать на сбои.
  • Перед массовым удалением сделайте резервную копию базы данных.
Автоматический импорт данных из Excel в WordPress: практическое руководство
25.03.2026
Как использовать WP-CLI для автоматизации WordPress
04.12.2025
Автоматическое удаление неиспользуемых метаполей в WordPress
22.03.2026
Как избежать проблем с пермалинками в WordPress
24.01.2026
Успешная интеграция WooCommerce с Битрикс24 в WordPress
10.01.2026