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

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

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

Как работает удаление заказов в WooCommerce

Заказы в WooCommerce — это тип записи shop_order с метаданными, где есть статус заказа. Неоплаченные заказы обычно имеют статус pending или failed. Удаление таких заказов вручную возможно через админку, но для автоматизации нужен код, который по расписанию будет искать и удалять их.

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

Важна проверка времени создания заказа, т.к. свежие pending-ордера ещё могут быть актуальны. Обычно удаляют заказы старше 24 часов.

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

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

function wptask_delete_old_unpaid_orders() {
    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => ['wc-pending', 'wc-failed'],
        'date_query'     => [
            [
                'column' => 'post_date',
                'before' => '24 hours ago',
            ],
        ],
        'posts_per_page' => -1,
        'fields'         => 'ids',
    ];

    $orders = get_posts($args);

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

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

2. Регистрируем кастомный хук для cron

add_action('wptask_cron_delete_unpaid_orders', 'wptask_delete_old_unpaid_orders');

3. Добавляем событие в cron, если его ещё нет

function wptask_schedule_unpaid_orders_cron() {
    if (!wp_next_scheduled('wptask_cron_delete_unpaid_orders')) {
        wp_schedule_event(time(), 'hourly', 'wptask_cron_delete_unpaid_orders');
    }
}
add_action('wp', 'wptask_schedule_unpaid_orders_cron');

4. Очищаем планировщик при деактивации плагина или темы

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

Проверка результата: как убедиться, что удаление работает

  • Перейдите в админку WooCommerce → Заказы и отфильтруйте по статусу Ожидает оплаты или Failed.
  • Запустите вручную функцию через wp shell или вставьте вызов wptask_delete_old_unpaid_orders(); в functions.php и обновите сайт.
  • Проверьте, что заказы старше 24 часов исчезли.
  • Посмотрите в таблице wp_posts, что записи с такими статусами и датой старше 24 часов удалены.

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

  • Функция не вызывается по расписанию: проверьте, что cron запускается на сервере. По умолчанию WP-Cron работает при заходе на сайт. Для более надёжной работы настройте системный cron на вызов wp-cron.php.
  • Статусы заказов указаны неверно: используйте префикс wc- для статусов, например, wc-pending, иначе WP не найдёт нужные заказы.
  • Удаление не происходит из-за прав доступа: убедитесь, что код выполняется с достаточными правами и что в wp_delete_post передан параметр true для принудительного удаления.
  • Удаляется лишнее: всегда фильтруйте по дате, чтобы не удалить свежие заказы.

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

  • Для магазинов с очень большим количеством заказов используйте пагинацию при выборке заказов, чтобы не перегружать память. Например, обрабатывать по 100 заказов за раз.
  • Добавьте логирование удалённых заказов, чтобы при необходимости восстановить информацию.
  • Настройте системный cron на сервере для вызова wp-cron.php раз в 5-10 минут, чтобы обеспечить стабильную работу задач.
  • Перед удалением можно добавить проверку, что заказ не был оплачен после создания, используя мета или статус.

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

МетодПлюсыМинусыРекомендуемое применение
Удаление через WP-Cron и кастомный хукГибкость, автоматизация, точная настройка по статусу и времениЗависимость от посещаемости сайта, требует настройки cronСредние и крупные магазины с нестабильным трафиком
Плагины для очистки заказовПростота установки, готовый функционалМогут быть избыточны, влиять на производительностьМалые магазины, где нет возможности писать код
Ручное удаление в админкеКонтроль над каждым заказомТрудозатратно, не автоматизированоМагазины с малым количеством заказов
WooCommerce: автоматическое удаление старых отгруженных заказов
17.05.2026
Добавление пользовательских полей в WP REST API для пользователей WordPress
19.03.2026
Автоматическое удаление неоплаченных заказов в WooCommerce
13.05.2026
Как автоматизировать удаление старых медиа файлов в WordPress
31.01.2026
Как создать собственный shortcode в WordPress с примером кода
05.11.2025