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

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

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

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

Чтобы определить, есть ли неподтверждённые заказы, можно выполнить SQL-запрос или использовать WP_Query с фильтром по статусу:

$args = [
    'post_type'      => 'shop_order',
    'post_status'    => ['wc-pending', 'wc-on-hold'],
    'date_query'     => [
        'before' => '2 days ago', // например, старше 2 дней
    ],
    'posts_per_page' => -1,
];

$query = new WP_Query($args);

if ($query->have_posts()) {
    echo 'Найдены неподтверждённые заказы старше 2 дней: ' . $query->found_posts;
} else {
    echo 'Неподтверждённых заказов нет.';
}

Если таких заказов много, стоит настроить автоматическое удаление.

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

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

function wpma_delete_unconfirmed_orders() {
    $args = [
        'post_type'      => 'shop_order',
        'post_status'    => ['wc-pending', 'wc-on-hold'],
        'date_query'     => [
            'before' => date('Y-m-d H:i:s', strtotime('-2 days')),
        ],
        'fields'         => 'ids',
        'posts_per_page' => 100,
    ];

    $query = new WP_Query($args);

    if (!$query->have_posts()) {
        return;
    }

    foreach ($query->posts as $order_id) {
        wp_delete_post($order_id, true); // true — физическое удаление
    }
}

2. Регистрируем событие WP-Cron для регулярного запуска

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

add_action('wpma_cleanup_unconfirmed_orders_hook', 'wpma_delete_unconfirmed_orders');

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

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

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

  • Подождите 24 часа или запустите WP-Cron вручную через плагин WP Crontrol или вызовом функции do_action('wpma_cleanup_unconfirmed_orders_hook');.
  • Проверьте в админке WooCommerce раздел заказы — неподтверждённые заказы старше 2 дней должны быть удалены.
  • Просмотрите логи сервера на предмет ошибок удаления.

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

  • Заказы не удаляются: Проверьте, что WP-Cron работает. На локальных серверах с отключённым cron-задачами автоматический запуск не работает. Используйте системный cron для вызова wp-cron.php или плагин WP Crontrol для теста.
  • Удаляются не те заказы: Проверьте параметры post_status и date_query. Статус должен точно соответствовать «wc-pending» или «wc-on-hold». Даты — корректно рассчитываться через strtotime.
  • Проблемы с производительностью при большом количестве заказов: Рекомендуется ограничивать выборку по количеству (например, по 100 заказов за раз) и запускать cron ежедневно, чтобы избежать перегрузки базы.

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

  • Используйте wp_delete_post($order_id, true) с осторожностью — это физическое удаление. Альтернативно можно менять статус заказа на «отменён» для сохранения истории.
  • Добавьте логирование удалённых заказов для аудита. Пример:
function wpma_log_deleted_orders($order_id) {
    error_log('Удалён неподтверждённый заказ ID: ' . $order_id);
}

foreach ($query->posts as $order_id) {
    wp_delete_post($order_id, true);
    wpma_log_deleted_orders($order_id);
}
  • Для больших магазинов рассмотрите возможность запуска cron-задач через системный планировщик (crontab), чтобы избежать пропуска задач.
  • Если вы используете плагины кэширования, убедитесь, что правила удаления заказов не конфликтуют с кэшем.

Сравнение способов автоматического удаления неподтверждённых заказов

СпособПлюсыМинусы
WP-Cron и кастомный кодГибко, не нужно дополнительное ПО, контролируем процессЗависит от посещений сайта, возможны пропуски задач
Системный cron + WP-CLI командаНадёжно, не зависит от посещений, подходит для крупных сайтовТребует доступ к серверу и навыков администрирования
Плагины автоматизацииУдобно, готовые решения, часто с настройкамиЗависимость от стороннего кода, возможная нагрузка, платные опции
Как создать защищённый формуляр обработки данных в WordPress
03.12.2025
WooCommerce: как решить проблему с повторной оплатой одного заказа
30.04.2026
Как удалить категории из архива WooCommerce
10.02.2026
Как добавить кастомные типы записей в WordPress без плагинов
16.12.2025
Как сделать автоматический редирект после удаления страницы в WordPress
22.01.2026