Проблема: необходимость удаления заказов по кастомным статусам WooCommerce
В стандартном WooCommerce доступен набор предопределённых статусов заказов (pending, processing, completed, cancelled и др.). Но часто магазины добавляют свои пользовательские статусы для более тонкого управления процессами. В таких случаях возникает задача массового удаления заказов по новым статусам, что не всегда удобно делать вручную через админку.
В этой статье разберём, как программно удалить заказы WooCommerce, которые относятся к пользовательским статусам заказов. Это поможет автоматизировать очистку базы от ненужных записей, например, старых отменённых заказов с кастомными статусами.
Диагностика: как проверить, что заказы с новыми статусами есть
Для начала нужно убедиться, что в базе есть заказы с нужными статусами и узнать, какие именно статусы зарегистрированы на сайте.
Получение списка всех статусов заказов WooCommerce
add_action('admin_init', function() {
$statuses = wc_get_order_statuses();
echo '<pre>';
print_r($statuses);
echo '</pre>';
exit;
});Этот код добавляем временно в functions.php, затем заходите в админку — увидите массив всех статусов с префиксом wc-. Например:
Array (
[wc-pending] => Ожидает оплаты
[wc-processing] => В обработке
[wc-custom-status] => Мой пользовательский статус
)Убедитесь, что нужный статус существует и в базе есть заказы с этим статусом.
Проверка наличия заказов с нужным статусом через SQL
SELECT COUNT(ID) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-custom-status';Если результат больше нуля, значит такие заказы есть и можно переходить к автоматическому удалению.
Пошаговое решение: удаление заказов с кастомным статусом
Стандартная функция wp_delete_post() корректно удаляет заказ и все связанные метаданные, но нужно сделать это массово и безопасно.
Код для массового удаления заказов по статусу
function delete_orders_by_status($status) {
$args = [
'post_type' => 'shop_order',
'post_status' => $status,
'posts_per_page' => -1,
'fields' => 'ids',
];
$orders = get_posts($args);
if (empty($orders)) {
return 'Заказы с таким статусом не найдены.';
}
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // true — принудительное удаление без корзины
}
return count($orders) . ' заказ(ов) было удалено с статусом ' . $status;
}
// Пример вызова
add_action('admin_init', function() {
if (current_user_can('manage_woocommerce') && isset($_GET['delete_orders_status'])) {
$status = sanitize_text_field($_GET['delete_orders_status']);
echo delete_orders_by_status('wc-' . $status);
exit;
}
});Используйте URL типа https://example.com/wp-admin/?delete_orders_status=custom-status для запуска удаления. Замените custom-status на ваш пользовательский статус без префикса wc-.
Проверка результата после удаления
Проверьте количество заказов в админке WooCommerce и повторите SQL-запрос для подсчёта заказов с этим статусом. Если запрос вернёт 0, значит удаление прошло успешно.
Также убедитесь, что связанные метаданные удалены — проверьте таблицы wp_postmeta на наличие записей с ID удалённых заказов.
Частые ошибки и их исправления
- Заказы не удаляются: Проверьте права пользователя. Скрипт запускается только для пользователей с правами
manage_woocommerce. - Удаляются не все заказы: Возможно, есть ограничения по количеству заказов на запрос. В данном примере мы используем
posts_per_page => -1, что должно вернуть все записи. Если база очень большая, лучше делать удаление пакетами. - Заказы удаляются, но метаданные остаются: Используйте
wp_delete_post()с параметромtrueдля полного удаления. - Неправильный статус: Указывайте статус с префиксом
wc-. В коде этот момент учтён, но будьте внимательны при вводе параметра.
Практические советы по безопасности и производительности
- Запускайте массовое удаление только под пользователем с правами администратора или менеджера WooCommerce.
- Для больших магазинов оптимальнее делать удаление пакетами по 100-200 заказов с помощью пагинации, чтобы не перегружать сервер.
- Резервное копирование базы перед массовым удалением — обязательная практика.
- Можно добавить логи удаления заказов для последующего аудита.
Сравнение способов удаления заказов по статусу
| Метод | Плюсы | Минусы | Применимость |
|---|---|---|---|
| Ручное удаление через админку WooCommerce | Простота, не требует кода | Долго, неудобно при большом количестве | Маленькие магазины, единичные удаления |
| SQL-запросы напрямую | Очень быстро | Риск повредить данные, не удаляются метаданные | Только опытным разработчикам с бэкапом |
| Программное удаление через wp_delete_post() | Безопасно, удаляет все данные, можно автоматизировать | Нужно писать код, нагрузка на сервер при больших объёмах | Автоматизация, регулярное обслуживание |