Диагностика задачи: зачем удалять заказы со статусом «Отслеживание»?
В 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 |