Диагностика проблемы: зачем удалять заказы по статусу в WooCommerce
WooCommerce не предусматривает удаление заказов по статусу из коробки. С течением времени накапливаются заказы со статусами «отменён», «в ожидании оплаты» или «отклонён», которые не нужны в админке и замедляют работу сайта и отчётов. Важно уметь автоматизировать удаление таких заказов, чтобы поддерживать базу данных в порядке и не нагружать сервер.
Пошаговое решение: автоматическое удаление заказов по статусу
1. Определяем статус заказа для удаления
Чаще всего удаляют заказы с такими статусами: cancelled, failed, pending. Можно выбрать один или несколько.
2. Создаём функцию удаления заказов
Пример функции для удаления заказов по статусу с использованием WP_Query и WP_Trash:
function wpbook_delete_orders_by_status($statuses = array('cancelled', 'failed', 'pending')) {
if (empty($statuses)) {
return;
}
$args = array(
'post_type' => 'shop_order',
'post_status' => array_map(function($status) { return 'wc-' . $status; }, $statuses),
'posts_per_page' => 100,
'fields' => 'ids',
'no_found_rows' => true
);
$query = new WP_Query($args);
if (!$query->have_posts()) {
return;
}
foreach ($query->posts as $order_id) {
wp_trash_post($order_id); // перемещаем заказ в корзину
}
}3. Автоматизация с помощью WP-Cron
Чтобы удалять заказы регулярно, добавим событие в WP-Cron:
function wpbook_schedule_order_deletion() {
if (!wp_next_scheduled('wpbook_delete_orders_event')) {
wp_schedule_event(time(), 'daily', 'wpbook_delete_orders_event');
}
}
add_action('wp', 'wpbook_schedule_order_deletion');
add_action('wpbook_delete_orders_event', function() {
wpbook_delete_orders_by_status(['cancelled', 'failed']);
});Как проверить, что удаление работает
- Через админку WooCommerce в разделе «Заказы» проверьте, что заказы со статусами «Отменён» и «Неудавшийся» исчезают после запуска cron.
- Для ручного теста вызовите функцию
wpbook_delete_orders_by_status(['cancelled'])через WP-CLI или временный код. - Проверьте таблицу
wp_postsв базе данных: заказы должны получить статусtrash(корзина).
Частые ошибки и как их исправить
- Заказы не удаляются: проверьте, что статусы указаны правильно, с префиксом
wc-в запросе. - WP-Cron не запускается: на некоторых серверах wp-cron требует внешнего триггера (например, через системный cron).
- Удаление не происходит полностью:
wp_trash_postтолько перемещает в корзину. Для окончательного удаления используйтеwp_delete_post($order_id, true), но будьте осторожны с потерей данных.
Практические советы по безопасности и производительности
- Перед удалением сделайте резервную копию базы данных.
- Не удаляйте заказы с важными статусами, например,
processingилиcompleted. - Для больших магазинов делайте удаление пакетами по 50–100 заказов, чтобы не перегружать сервер.
- Логируйте удалённые заказы для аудита, например, добавив запись в файл или базу.
- Используйте плагин Clearfy Pro для дополнительной оптимизации и очистки WooCommerce.
Сравнение способов удаления заказов WooCommerce
| Способ | Плюсы | Минусы |
|---|---|---|
| Ручное удаление в админке | Просто, не требует кода | Много времени при большом количестве заказов |
| Код с WP_Query и wp_trash_post | Автоматизация, контроль через код | Требует знаний PHP, не удаляет сразу из базы |
| wp_delete_post с принудительным удалением | Полное удаление из базы | Риск потери данных, без возможности восстановления |