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

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

Магазины на WooCommerce часто сталкиваются с накоплением большого количества заказов со статусом «Ожидает оплаты» или «В ожидании». Это создает нагрузку на базу данных, затрудняет управление заказами и может влиять на отчеты. Автоматическое удаление таких заказов через определенное время помогает поддерживать базу в чистоте и облегчает администрирование.

Когда стоит использовать автоматическое удаление

  • Если клиенты часто создают заказы, но не завершают оплату
  • Нет необходимости сохранять историю неоплаченных заказов для аналитики
  • Хотите уменьшить размер базы данных и повысить производительность

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

Приведенный ниже код позволит автоматически удалять заказы со статусом pending (ожидание оплаты) через 24 часа после создания. Можно изменить период в секундах по вашему усмотрению.

<?php
// Функция для удаления заказов со статусом 'pending' старше $hours часов
function wc_auto_delete_pending_orders() {
    $hours = 24; // время в часах
    $timestamp_threshold = strtotime("-{$hours} hours");

    $args = array(
        'status' => 'pending',
        'limit' => -1,
        'date_created' => '<' . date('Y-m-d H:i:s', $timestamp_threshold),
        'return' => 'ids',
    );

    $orders = wc_get_orders($args);

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // жесткое удаление
    }
}

// Планирование задачи WP-Cron
function wc_schedule_delete_pending_orders() {
    if (! wp_next_scheduled('wc_delete_pending_orders_hook')) {
        wp_schedule_event(time(), 'hourly', 'wc_delete_pending_orders_hook');
    }
}
add_action('wp', 'wc_schedule_delete_pending_orders');

add_action('wc_delete_pending_orders_hook', 'wc_auto_delete_pending_orders');

// Очистка cron при деактивации плагина или темы
function wc_clear_delete_pending_orders_schedule() {
    $timestamp = wp_next_scheduled('wc_delete_pending_orders_hook');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wc_delete_pending_orders_hook');
    }
}
register_deactivation_hook(__FILE__, 'wc_clear_delete_pending_orders_schedule');

Этот код можно добавить в файл functions.php вашей темы или оформить в виде простого плагина.

Как проверить, что удаление заказов работает

  1. Создайте тестовый заказ со статусом pending через фронтенд магазина.
  2. Измените дату создания заказа в базе данных на более старую, чем 24 часа (например, через phpMyAdmin в таблице wp_posts, поле post_date).
  3. Запустите вручную WP-Cron задачу, например, используя плагин WP Crontrol или вызвав функцию do_action('wc_delete_pending_orders_hook');.
  4. Проверьте, что заказ удалился (проверьте в админке WooCommerce или в базе данных).

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

  • Заказы не удаляются: Убедитесь, что WP-Cron работает. Для этого можно проверить логи или использовать плагин WP Crontrol. Если на сайте мало трафика, WP-Cron может не запускаться — рассмотрите настройку системного cron-задания.
  • Удаляется не тот статус: Проверьте, что в параметрах запроса wc_get_orders() правильно указан статус pending. Возможно, у вас используется другой статус для неоплаченных заказов, например, on-hold.
  • Удаляются заказы с оплатой: Проверьте условие по дате создания и статусу. В коде заданы четкие фильтры.
  • Потеря данных: Жесткое удаление wp_delete_post($order_id, true) полностью удаляет заказ. Если нужна архивация — замените true на false для помещения в корзину.

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

  • Перед удалением убедитесь, что заказы действительно не нужны. Возможно, стоит сохранять логи или резервные копии.
  • Если база большая, не удаляйте все заказы за один раз — добавьте ограничение 'limit' => 50 и запускайте несколько циклов.
  • Используйте системный cron вместо WP-Cron для надежности на больших проектах.
  • Проверяйте права пользователя, если добавляете интерфейс управления удалением.

Сравнение вариантов реализации автоудаления заказов

МетодПлюсыМинусыКогда использовать
WP-Cron на PHP (код) Легко адаптировать, бесплатно, гибко Зависит от посещаемости сайта, требует навыков программирования Для проектов с ежедневным трафиком, где нужна кастомизация
Плагин для очистки заказов Быстрое внедрение, готовые настройки Менее гибкие, могут грузить базу при удалении большого объема Для небольших магазинов без навыков кода
Системный cron + WP-CLI Самый надежный, не зависит от трафика Требует доступа к серверу и навыков работы с терминалом Для крупных и бизнес-проектов с высокими требованиями
Как добавить собственные настройки в админ-панель WordPress
01.12.2025
Как использовать AJAX для отображения постов в WordPress без перезагрузки страницы
22.01.2026
WooCommerce: как добавить пользовательское поле в форму оплаты через хук
23.04.2026
Как создать автоматический импорт постов в WordPress
12.12.2025
Как удалить захламление базы данных WordPress без подключения к phpMyAdmin
19.02.2026