Диагностика задачи: зачем и когда нужно удалять заказы по статусу
В крупных интернет-магазинах на WooCommerce со временем накапливается большое количество заказов с разными статусами: отменённые, неудавшиеся, ожидающие оплаты и т.д. Некоторые из них уже не нужны в базе, но оставлять их бессмысленно — они замедляют работу сайта и увеличивают размер базы данных. Поскольку WooCommerce не предоставляет встроенной функции для массового удаления заказов по статусу, потребуется написать кастомное решение.
Как определить заказы для удаления
Для начала нужно понять, какие статусы критичны для очистки. Чаще всего это статусы:
cancelled— отменённые заказы;failed— неудачные платежи;refunded— возвращённые заказы;pending— необработанные, ожидающие оплаты.
Удалять заказы нужно аккуратно, чтобы не потерять важную статистику и историю.
Пошаговое решение: автоматическое удаление заказов по статусу с помощью WP-Cron
1. Создаём функцию для удаления заказов
function wpreboot_delete_orders_by_status( $status = 'cancelled' ) {
$args = array(
'post_type' => 'shop_order',
'post_status' => array('wc-' . $status),
'posts_per_page' => 100,
'fields' => 'ids',
);
$orders = get_posts( $args );
if ( empty( $orders ) ) {
return;
}
foreach ( $orders as $order_id ) {
wp_delete_post( $order_id, true ); // true - без отправки в корзину
}
}2. Добавляем планировщик задач (WP-Cron) для регулярного запуска
function wpreboot_schedule_order_cleanup() {
if ( ! wp_next_scheduled( 'wpreboot_order_cleanup_hook' ) ) {
wp_schedule_event( time(), 'daily', 'wpreboot_order_cleanup_hook' );
}
}
add_action( 'wp', 'wpreboot_schedule_order_cleanup' );
add_action( 'wpreboot_order_cleanup_hook', function() {
// Удаляем отменённые и неудачные заказы ежедневно
wpreboot_delete_orders_by_status( 'cancelled' );
wpreboot_delete_orders_by_status( 'failed' );
} );3. Очистка по другим статусам и кастомизация
Вы можете расширить функцию, передавая массив статусов или добавляя проверку даты создания заказа, чтобы удалять только старые записи, например старше 30 дней. Для этого добавьте параметр date_query в get_posts:
$args['date_query'] = array(
array(
'column' => 'post_date',
'before' => '30 days ago',
),
);Проверка результата после внедрения
Чтобы убедиться, что задача работает:
- Запустите вручную функцию
wpreboot_delete_orders_by_status('cancelled')в консоли WP-CLIwp eval 'wpreboot_delete_orders_by_status("cancelled");'— заказы с этим статусом должны удалиться; - Проверьте базу данных, запросом
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-cancelled';— число записей должно стать нулём после выполнения; - Убедитесь, что Cron-событие зарегистрировано:
wp cron event list; - После автоматического запуска (например, через сутки) проверьте, что заказы удалились.
Частые ошибки и способы исправления
- Заказы не удаляются: проверьте, что статус указан с префиксом
wc-вpost_statusпри запросе (wc-cancelled, а не простоcancelled). - WP-Cron не срабатывает: убедитесь, что на вашем сайте посещаемость есть или настройте реальный системный cron на запуск
wp cron event run --due-now. - Удаление происходит медленно или вызывает таймаут: уменьшите
posts_per_pageдо 20-50, добавьте пагинацию удаления, чтобы не удалять все за раз. - Потеря данных статистики: всегда делайте резервную копию базы перед автоматическим удалением.
Практические советы по безопасности и производительности
- Не удаляйте заказы без резервного копирования базы.
- Добавьте логирование удалений, например, через
error_logили отдельный файл, чтобы отслеживать работу скрипта. - Оптимизируйте запросы, добавив фильтр по дате, чтобы удалять только старые заказы.
- Используйте WP-CLI для запуска массовых операций на больших магазинах, это надёжнее, чем WP-Cron.
- Если не хотите писать код, можно использовать плагин Clearfy Pro из WPShop для очистки базы с фильтрацией по статусам, но кастомный код даёт больше контроля.
Сравнение способов удаления заказов по статусу
| Метод | Плюсы | Минусы | Применимость |
|---|---|---|---|
| Ручное удаление через админку WooCommerce | Простота, не требует кода | Трудоёмко при большом количестве заказов | Малые магазины |
| Кастомный код с WP-Cron | Автоматизация, гибкость, учёт бизнес-логики | Требует навыков разработки, можно ошибиться | Средние и крупные магазины |
| Плагины (напр. Clearfy Pro) | Простота настройки, дополнительные функции оптимизации | Ограниченная кастомизация, возможны конфликты | Любой уровень с бюджетом на плагины |