Диагностика проблемы: почему нужно удалять отменённые заказы
С течением времени в WooCommerce накапливаются отменённые заказы, которые занимают место в базе данных и могут замедлять работу сайта. Особенно это актуально для магазинов с большим оборотом, где тысячи заказов с разными статусами. Ручное удаление через админ-панель неудобно и занимает много времени.
Основная задача — удалить заказы с определённым статусом (например, cancelled или failed) и которые старше заданной даты, чтобы не затронуть текущие активные заказы.
Как получить список отменённых заказов по дате и статусу
Для начала полезно вывести список заказов, которые попадут под удаление. Это поможет избежать удаления важных записей.
$args = [
'post_type' => 'shop_order',
'post_status' => ['wc-cancelled', 'wc-failed'],
'date_query' => [
[
'before' => '2023-01-01',
'inclusive' => true,
],
],
'posts_per_page' => -1,
'fields' => 'ids',
];
$query = new WP_Query($args);
if($query->have_posts()) {
echo 'Найдено заказов для удаления: ' . count($query->posts) . "\n";
foreach($query->posts as $order_id) {
echo 'Заказ ID: ' . $order_id . "\n";
}
} else {
echo 'Заказы не найдены.';
}
wp_reset_postdata();Пошаговое решение: удаление заказов через WP-CLI или PHP-скрипт
1. Создаём функцию для удаления заказов
Для удаления заказов безопаснее использовать функционал WooCommerce, чтобы очистить все связанные метаданные и записи.
function delete_old_cancelled_orders($date_before = '2023-01-01') {
$args = [
'post_type' => 'shop_order',
'post_status' => ['wc-cancelled', 'wc-failed'],
'date_query' => [
[
'before' => $date_before,
'inclusive' => true,
],
],
'posts_per_page' => -1,
'fields' => 'ids',
];
$query = new WP_Query($args);
if (!$query->have_posts()) {
return 0;
}
foreach ($query->posts as $order_id) {
wp_delete_post($order_id, true); // true — полное удаление без корзины
}
wp_reset_postdata();
return count($query->posts);
}2. Запускаем удаление
Этот код можно временно добавить в файл темы functions.php или создать отдельный плагин. Затем вызвать функцию, например, через admin-ajax или WP-CLI.
add_action('admin_init', function() {
if (current_user_can('manage_woocommerce') && isset($_GET['delete_old_orders'])) {
$deleted = delete_old_cancelled_orders('2023-01-01');
echo 'Удалено заказов: ' . $deleted;
exit;
}
});После добавления откройте URL https://site.ru/wp-admin/?delete_old_orders=1 под админом.
Проверка результата после внедрения
- Проверьте в админке WooCommerce — отменённые заказы до даты должны исчезнуть.
- Запустите запрос из первого шага — список должен быть пустым.
- Проверьте размер базы данных, если есть доступ, — должна уменьшиться таблица
wp_postsиwp_postmeta.
Частые ошибки и как исправить
- Удаление не происходит: проверьте права пользователя и корректность вызова функции.
- Некорректный статус заказа: WooCommerce использует префикс
wc-для статусов, напримерwc-cancelled. Без префикса запрос не найдёт заказы. - Удаляются нужные заказы: всегда сначала выводите список удаляемых заказов, чтобы проверить дату и статус.
- Замедление при большом количестве заказов: лучше удалять партиями по 100-200 заказов, чтобы избежать таймаутов.
Практические советы по производительности и безопасности
- Используйте WP-CLI для массового удаления заказов — это быстрее и безопаснее, чем через сайт.
- Создайте резервную копию базы перед удалением.
- Ограничьте права на запуск удаления только администраторам и менеджерам WooCommerce.
- Автоматизируйте удаление через WP-Cron с небольшим лимитом заказов за раз.
Сравнение способов удаления заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Через админку WooCommerce | Просто, не требует кода | Трудоёмко при большом количестве |
| PHP-функция (как выше) | Автоматизация, гибкость | Риск ошибки, нужно тестировать |
| WP-CLI команда | Быстро, безопасно, удобно для больших баз | Требуется SSH-доступ и знания командной строки |