Диагностика проблемы: зачем удалять незавершённые заказы
В WooCommerce заказы со статусом pending, failed или cancelled могут накапливаться и занимать место в базе данных, замедляя работу сайта и усложняя аналитику. Особенно если магазин работает давно и не очищается автоматически.
Пользователи часто задаются вопросом, как быстро удалить такие заказы по дате, например, старше 30 дней, чтобы не мешать статистике и не перегружать админку.
Пошаговое решение: удаление заказов по дате и статусу через код
1. Определяем критерии для удаления
- Статусы заказов:
pending,failed,cancelled - Дата создания заказа: старше N дней (например, 30)
2. Создаём функцию удаления заказов
Используем WP_Query для выборки заказов и wp_delete_post для удаления. Пример кода для файла functions.php или отдельного плагина:
function wc_delete_old_unfinished_orders( $days = 30 ) {
$date_query = array(
'column' => 'post_date',
'before' => sprintf( '%d days ago', $days ),
'inclusive' => true,
);
$args = array(
'post_type' => 'shop_order',
'post_status' => array('wc-pending', 'wc-failed', 'wc-cancelled'),
'date_query' => array( $date_query ),
'posts_per_page' => -1,
'fields' => 'ids',
);
$query = new WP_Query( $args );
if ( ! empty( $query->posts ) ) {
foreach ( $query->posts as $order_id ) {
wp_delete_post( $order_id, true ); // true - без перемещения в корзину
}
}
wp_reset_postdata();
}
3. Запуск функции вручную или через WP-Cron
Для разовой очистки вызовите функцию из админки или подключите к вашему плагину:
add_action('admin_init', function() {
if ( current_user_can('manage_woocommerce') && isset($_GET['delete_old_orders']) ) {
wc_delete_old_unfinished_orders(30);
echo 'Удаление старых заказов выполнено.';
}
});
После этого вызовите https://ваш-сайт.ru/wp-admin/?delete_old_orders=1, чтобы выполнить удаление.
Как проверить, что удаление сработало
- Перейдите в WooCommerce → Заказы, отфильтруйте по статусам
pending,failed,cancelled. - Проверьте, что нет заказов старше указанной даты.
- В базе данных (таблица
wp_posts) выполните запрос для проверки:
SELECT ID, post_date, post_status FROM wp_posts
WHERE post_type = 'shop_order'
AND post_status IN ('wc-pending','wc-failed','wc-cancelled')
AND post_date < DATE_SUB(NOW(), INTERVAL 30 DAY);
Запрос должен вернуть пустой результат.
Частые ошибки и их исправление
- Не удаляются заказы: Проверьте, что статусы указаны с префиксом
wc-. В WooCommerce статусы заказов хранятся с этим префиксом. - Удаление не происходит или происходит не полностью: Ограничение памяти или времени выполнения PHP. Запускайте удаление партиями или увеличьте лимиты.
- Удаление приводит к ошибкам на сайте: Убедитесь, что заказ не связан с активными подписками или плагинами, которые блокируют удаление.
- Функция вызывается слишком часто: Настройте WP-Cron с разумным интервалом, чтобы не перегружать сервер.
Практические советы по безопасности и производительности
- Всегда делайте бэкап базы данных перед массовым удалением.
- Для больших магазинов разбивайте удаление на партии, например, по 100 заказов за раз.
- Используйте WP-CLI для удаления заказов, если есть доступ к консоли сервера — это быстрее и надёжнее.
- Отключайте кэширование страниц и WooCommerce transient cache на время удаления, чтобы избежать рассинхронизации.
- Регулярно планируйте чистку заказов через WP-Cron, чтобы не накапливать устаревшие данные.
Сравнение способов удаления старых заказов WooCommerce
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Ручное удаление в админке | Удаление заказов через интерфейс WooCommerce | Просто, не требует кода | Медленно, неудобно при большом объёме заказов |
| PHP-функция с WP_Query | Программное удаление по статусу и дате | Гибко, можно автоматизировать | Нужно писать код, возможны ошибки при неправильной настройке |
| WP-CLI | Удаление через командную строку | Быстро, эффективно для больших сайтов | Требует доступа к серверу и навыков работы с CLI |
| Плагины очистки | Готовые решения для удаления старых заказов | Удобство использования | Могут конфликтовать с другими плагинами, нагрузка на сайт |