WooCommerce: автоматическое удаление заказов со статусом «Отслеживание» с подтверждением

Диагностика задачи: зачем удалять заказы со статусом «Отслеживание»?

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

Как проверить наличие заказов со статусом «Отслеживание»?

Для выявления таких заказов выполните SQL-запрос в базе данных или используйте WP-CLI:

wp post list --post_type=shop_order --meta_key=_order_status --meta_value=tracking --fields=ID,post_date,post_status

Или через PHP в консоли или тему:

$args = [
    'post_type' => 'shop_order',
    'post_status' => 'wc-tracking',
    'posts_per_page' => -1
];
$orders = get_posts($args);
echo 'Найдено заказов со статусом tracking: ' . count($orders);

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

1. Создаем пользовательский хук для удаления заказов

Добавьте следующий код в файл functions.php вашей темы или в отдельный плагин:

function wpdemo_delete_tracking_orders() {
    // Убедимся, что это выполнение из консоли или безопасно
    if ( ! defined('WP_CLI') && ! current_user_can('manage_woocommerce') ) {
        return;
    }

    $args = [
        'post_type' => 'shop_order',
        'post_status' => 'wc-tracking',
        'posts_per_page' => -1,
        'fields' => 'ids',
    ];

    $orders = get_posts($args);

    if (empty($orders)) {
        echo "Нет заказов со статусом 'Отслеживание'.\n";
        return;
    }

    foreach ($orders as $order_id) {
        // Выводим ID для подтверждения
        echo "Удаляем заказ ID: $order_id\n";
        wp_delete_post($order_id, true); // true - принудительное удаление
    }

    echo "Удаление заказов завершено.\n";
}

2. Добавляем страницу с подтверждением в админку

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

add_action('admin_menu', function() {
    add_submenu_page(
        'woocommerce',
        'Удалить заказы со статусом Отслеживание',
        'Удалить заказы tracking',
        'manage_woocommerce',
        'wpdemo-delete-tracking-orders',
        'wpdemo_render_delete_tracking_orders_page'
    );
});

function wpdemo_render_delete_tracking_orders_page() {
    if (!current_user_can('manage_woocommerce')) {
        wp_die('Доступ запрещён');
    }

    if (isset($_POST['wpdemo_confirm_delete'])) {
        wpdemo_delete_tracking_orders();
        echo '<div class="notice notice-success"><p>Заказы удалены.</p></div>';
    }

    ?>
    <div class="wrap">
        <h1>Удаление заказов со статусом «Отслеживание»</h1>
        <form method="post">
            <p>Вы действительно хотите удалить все заказы со статусом «Отслеживание»?</p>
            <input type="hidden" name="wpdemo_confirm_delete" value="1" />
            <button type="submit" class="button button-danger">Удалить заказы</button>
        </form>
    </div>
    <?php
}

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

  • Перейдите в WooCommerce > Удалить заказы tracking
  • Убедитесь, что появляется форма с предупреждением и кнопкой
  • Нажмите кнопку, после чего заказы со статусом «Отслеживание» удалятся
  • Проверьте в админке WooCommerce > Заказы, что этих заказов больше нет
  • Для дополнительной проверки выполните SQL-запрос или WP-CLI команду из раздела диагностики

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

  • Неправильный статус заказа: Статус «tracking» должен быть зарегистрирован как wc-tracking. Проверьте, что статус добавлен и именно под этим ключом.
  • Отсутствие прав доступа: Скрипт требует права manage_woocommerce. Убедитесь, что вы вошли как администратор или менеджер WooCommerce.
  • Заказы не удаляются: Проверьте, не используются ли сторонние плагины, которые блокируют удаление заказов или изменяют статус.
  • Ошибка при удалении: Включите режим отладки WordPress (WP_DEBUG) для выявления ошибок в коде.

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

  • Всегда создавайте резервную копию базы данных перед массовым удалением заказов.
  • Реализуйте подтверждение действия, чтобы избежать случайного удаления.
  • Оптимизируйте выборку заказов, добавляя лимиты или пагинацию, если заказов слишком много.
  • Если заказы критичны для аудита, вместо удаления рассмотрите автоматическое изменение статуса на архивный.
  • Для регулярного запуска используйте WP-Cron с проверкой и логированием результатов удаления.

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

МетодПлюсыМинусы
Ручное удаление через админкуПросто, не требует кодаТрудоемко, риск ошибки
WP-CLI скриптБыстро, подходит для больших объемовТребует доступа к серверу и навыков
Админ-страница с подтверждением (код из статьи)Безопасно, удобно для админовНе подходит для полностью автоматической очистки
Автоматический WP-CronПолная автоматизацияНужен контроль и логирование, возможны сбои WP-Cron
Как создать проверку валидации формы на AJAX в WordPress с примерами кода
23.02.2026
WooCommerce: автоматический сброс статуса заказа при ошибках платежа
30.04.2026
WooCommerce: как изменить и добавить свойства товара в личном кабинете покупателя
20.04.2026
Как установить ограничение на размер файлов при загрузке в WordPress
13.04.2026
WooCommerce: автоматическое изменение цены товара при акции с примерами кода
20.07.2026