Почему важно удалять отказанные и возвращённые заказы автоматически
В WooCommerce накапливаются заказы с разными статусами, включая отказанные (failed) и возвращённые (refunded). Если их не удалять, база данных растёт, что замедляет сайт и усложняет управление заказами. Автоматизация удаления этих заказов помогает поддерживать базу в порядке и облегчает администрирование.
Диагностика проблемы: как понять, что нужно автоматизировать удаление
Проверьте количество заказов с нужными статусами через SQL-запрос:
SELECT post_status, COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-failed', 'wc-refunded') GROUP BY post_status;Если количество таких заказов превышает несколько сотен, это сигнал к автоматизации удаления.
Пошаговое решение: как настроить автоматическое удаление отказанных и возвращённых заказов
1. Создаём функцию для удаления заказов по статусу
function wc_delete_orders_by_status( $statuses = array(), $older_than_days = 7 ) {
if ( empty( $statuses ) ) {
return;
}
$date_query = date( 'Y-m-d H:i:s', strtotime( "-{$older_than_days} days" ) );
$args = array(
'post_type' => 'shop_order',
'post_status' => array_map( function( $status ) { return 'wc-' . $status; }, $statuses ),
'date_query' => array(
'before' => $date_query,
),
'fields' => 'ids',
'posts_per_page' => -1,
'no_found_rows' => true,
);
$query = new WP_Query( $args );
if ( $query->have_posts() ) {
foreach ( $query->posts as $order_id ) {
wp_delete_post( $order_id, true );
}
}
}2. Запускаем функцию через WP-Cron
Добавим событие, которое будет запускать удаление ежедневно:
if ( ! wp_next_scheduled( 'wc_delete_failed_refunded_orders_daily' ) ) {
wp_schedule_event( time(), 'daily', 'wc_delete_failed_refunded_orders_daily' );
}
add_action( 'wc_delete_failed_refunded_orders_daily', function() {
wc_delete_orders_by_status( array( 'failed', 'refunded' ), 7 );
} );3. Добавление кода в functions.php или в собственный плагин
Рекомендуется создать небольшой плагин для удобства контроля и отключения функции при необходимости.
Проверка результата после внедрения
- Через несколько дней проверьте таблицу заказов на предмет наличия старых отказанных и возвращённых заказов.
- Запустите вручную функцию для теста (например, через WP-CLI или временно вызовите функцию напрямую) и проверьте, удалились ли заказы.
- Проверьте логи ошибок сервера и WordPress на предмет сбоев.
Частые ошибки и как их исправить
Ошибка 1: Заказы не удаляются
- Проверьте правильность статусов: WooCommerce добавляет префикс
wc-к статусам заказов. - Убедитесь, что WP-Cron работает корректно. Для этого можно использовать плагин WP Crontrol.
- Проверьте права пользователя, под которым выполняется код, и права на удаление постов.
Ошибка 2: Удаляются не те заказы
- Проверьте корректность параметра
$older_than_days— возможно, срок слишком большой. - Проверьте, что в запросе фильтруются только нужные статусы.
Ошибка 3: Высокая нагрузка при удалении большого количества заказов
- Добавьте лимит на количество удаляемых заказов за один запуск (например,
posts_per_page => 50) и используйте повторный запуск до полного удаления.
Практические советы по безопасности и производительности
- Удаление заказов — операция необратимая, используйте параметр
wp_delete_post( $order_id, true )с осторожностью. - Для критичных магазинов лучше сначала архивировать данные в отдельную таблицу или экспортировать перед удалением.
- Рекомендуется тестировать на копии сайта.
- Используйте WP Crontrol для мониторинга и управления крон-задачами.
- Если база слишком большая, разбивайте удаление на несколько этапов с лимитами.
Сравнение вариантов автоматического удаления заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Плагин (например, Advanced WooCommerce Cleaner) | Простота настройки, интерфейс, дополнительные опции | Зависимость от стороннего кода, возможная нагрузка, лицензии |
| Своя реализация через WP-Cron и WP_Query | Полный контроль, отсутствие лишних зависимостей, легковесность | Требует навыков программирования, ответственность за код |
| Удаление вручную через SQL-запросы | Максимальная скорость, точечное удаление | Высокий риск ошибок, нет логов, сложно автоматизировать |