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

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

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

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

Какие статусы заказов считать «нераскрытыми»

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

  • pending (ожидает оплаты)
  • failed (неудавшаяся оплата)
  • cancelled (отменён)

Не стоит удалять заказы со статусами processing, completed, on-hold, так как они могут содержать важную информацию для бухгалтерии и отчетности.

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

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

function wpcore_delete_old_unpaid_orders() {
    global $wpdb;
    // Задаем срок хранения заказов, например, 30 дней
    $days = 30;
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

    // Статусы для удаления
    $statuses = array('wc-pending', 'wc-failed', 'wc-cancelled');

    // Получаем ID заказов, удовлетворяющих условиям
    $placeholders = implode(',', array_fill(0, count($statuses), '%s'));

    $query = $wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status IN ($placeholders) AND post_date < %s",
        ...$statuses, $date_threshold
    );

    $order_ids = $wpdb->get_col($query);

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

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

if (!wp_next_scheduled('wpcore_delete_old_unpaid_orders_hook')) {
    wp_schedule_event(time(), 'daily', 'wpcore_delete_old_unpaid_orders_hook');
}
add_action('wpcore_delete_old_unpaid_orders_hook', 'wpcore_delete_old_unpaid_orders');

3. Добавляем код в functions.php вашей темы или в отдельный плагин

Рекомендуется вынести функционал в кастомный плагин, чтобы при смене темы код не потерялся.

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

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

  • Вручную вызовите функцию wpcore_delete_old_unpaid_orders() через WP-CLI или временно прикрепите вызов к admin_init, чтобы протестировать.
  • Проверьте таблицу заказов в базе данных: заказы с указанными статусами старше 30 дней должны исчезнуть.
  • Мониторьте логи сервера и WordPress на предмет ошибок.
  • Убедитесь, что заказы с другими статусами не удаляются.

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

  • Неправильные статусы заказов: WooCommerce добавляет префикс wc- к статусам, например wc-pending. Если забыть этот префикс, запрос не найдет нужные заказы.
  • Удаление заказов, которые нельзя удалять: Проверяйте статусы и не удаляйте processing и completed — они важны для учета.
  • Отсутствие Cron-задачи: Если Cron не работает, удаление не произойдет. Проверьте, что wp-cron.php выполняется, или настройте системный cron.
  • Потеря данных: Делайте резервные копии базы перед внедрением удаления заказов.

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

  • Безопасность: Используйте wp_delete_post($order_id, true) для полного удаления, избегайте удаления напрямую через SQL, чтобы не оставить связанные записи.
  • Производительность: При большом количестве заказов ограничьте количество удалений за один запуск, например, выбирайте по 50 заказов и запускайте процесс циклично.
  • Логирование: Добавьте логирование удаленных заказов для аудита, например, в отдельный файл или через error_log.
  • Альтернатива плагинам: Если нужна гибкость и интерфейс, можно использовать плагин Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wpcore.ru&utm_medium=article&utm_campaign=woocommerce-udalit-starie-neraskrytue-zakazy-avtomaticheski), но код выше — легковесное и прозрачное решение.

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

МетодПлюсыМинусы
Код в functions.php + CronЛегко кастомизировать, не требует плагиновТребует базовых знаний PHP, нужно следить за Cron
Плагин Clearfy ProУдобный UI, дополнительные функции оптимизацииПлатный, может быть избыточен для простой задачи
Ручное удаление через админкуПросто и быстро для единичных случаевНе подходит для автоматизации и больших объемов
Как установить ограничение на размер загружаемых файлов в WordPress
12.02.2026
Как удалить заблокированные пользователи WordPress
18.02.2026
Как создать персонализированные типы записей в WordPress
10.11.2025
Как создать динамическую форму обратной связи в WordPress с проверкой и отправкой на почту
19.11.2025
Автоподгрузка страниц WordPress без плагинов: реализация и примеры кода
25.11.2025