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

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

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

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

1. Определение условий удаления

Для примера возьмём заказы со статусом pending (ожидает оплаты), которые старше 7 дней. Этот период можно настроить.

2. Создание функции для удаления заказов

function wpco_delete_old_pending_orders() {
    $days = 7; // количество дней
    $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    $args = [
        'status' => 'pending',
        'date_modified' => '<' . $date,
        'limit' => -1,
        'return' => 'ids',
    ];

    $orders = wc_get_orders($args);

    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true); // безвозвратно удаляем заказ
    }
}

3. Запуск функции по расписанию с помощью WP-Cron

Добавим задачу в WP-Cron, чтобы функция запускалась, например, раз в сутки.

function wpco_schedule_delete_old_orders() {
    if (!wp_next_scheduled('wpco_daily_delete_old_orders')) {
        wp_schedule_event(time(), 'daily', 'wpco_daily_delete_old_orders');
    }
}
add_action('wp', 'wpco_schedule_delete_old_orders');
add_action('wpco_daily_delete_old_orders', 'wpco_delete_old_pending_orders');

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

  • Зайдите в WooCommerce → Заказы и отфильтруйте по статусу pending и дате, старше 7 дней. Заказы должны отсутствовать.
  • Для тестирования можно временно уменьшить период в функции до 1 дня и создать заказ с соответствующей датой.
  • Проверьте логи сервера и отладку WordPress, чтобы убедиться, что ошибок нет.

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

  • Функция не запускается: проверьте, активен ли WP-Cron и действительно ли событие wpco_daily_delete_old_orders запланировано (wp cron event list в WP-CLI).
  • Заказы не удаляются: убедитесь, что статус указан правильно ('pending' или другой), и что дата сравнивается корректно.
  • Удаление не происходит, а заказы только меняют статус: функция использует wp_delete_post($order_id, true) — безвозвратное удаление. Если хотите менять статус, используйте методы WooCommerce для обновления.
  • Проблемы с производительностью при большом количестве заказов: ограничьте количество заказов на проход (например, 'limit' => 50) и используйте пагинацию.

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

  • Обязательно делайте резервные копии перед внедрением автоматического удаления.
  • Ставьте ограничение на количество удаляемых заказов за один запуск, чтобы не перегрузить сервер.
  • Используйте wp_schedule_single_event для более точного контроля.
  • Для сайтов с большим трафиком и заказами лучше перенести задачу на серверный cron, отключив WP-Cron.
  • Включите логирование удалённых заказов, чтобы можно было отслеживать действия (например, записывать ID в отдельный файл или таблицу). Пример:
function wpco_log_deleted_order($order_id) {
    $log_file = WP_CONTENT_DIR . '/deleted_orders.log';
    $entry = date('Y-m-d H:i:s') . " - Deleted order ID: " . $order_id . "\n";
    file_put_contents($log_file, $entry, FILE_APPEND);
}

function wpco_delete_old_pending_orders() {
    $days = 7;
    $date = date('Y-m-d H:i:s', strtotime("-{$days} days"));
    $args = [
        'status' => 'pending',
        'date_modified' => '<' . $date,
        'limit' => 50,
        'return' => 'ids',
    ];
    $orders = wc_get_orders($args);
    foreach ($orders as $order_id) {
        wp_delete_post($order_id, true);
        wpco_log_deleted_order($order_id);
    }
}

Сравнение подходов к удалению заказов

МетодПлюсыМинусыКогда использовать
Ручное удаление через админкуПростой способ, не требует кодаТрудоёмко при большом количестве заказовДля редких случаев, когда мало заказов
WP-Cron с функцией удаления (код)Автоматизация, гибкость настройкиЗависит от работы WP-Cron, нагрузка при большом количестве заказовМалые и средние магазины с регулярной очисткой
Серверный Cron + WP-CLI скриптыВысокая производительность, надежностьСложнее в настройке, требует доступа к серверуКрупные проекты с большим объемом данных
WooCommerce: как автоматически удалять товары по истечении срока действия
16.05.2026
WooCommerce: решение проблемы с автозаполнением поля адреса покупателя
20.05.2026
WooCommerce: как автоматически удалять заказы по срокам и избежать дублирования
11.05.2026
Как удалить неиспользуемые файлы в Media Library WordPress: практические методы и примеры
28.12.2025
Как использовать WP-Cron для задач автоматизации в WordPress
14.04.2026