Диагностика проблемы с неактивными и отменёнными заказами в WooCommerce
На интернет-магазинах на базе WooCommerce часто накапливаются заказы со статусами «отменён» (cancelled) и «ожидает оплаты» (pending), которые долго не меняются и засоряют базу данных. Это негативно влияет на производительность магазина и усложняет управление заказами. Чтобы убедиться в наличии таких заказов, выполните SQL-запрос в базе данных:
SELECT post_status, COUNT(*) as count FROM wp_posts WHERE post_type = 'shop_order' GROUP BY post_status;Если в результатах вы видите большое количество заказов со статусами wc-cancelled или wc-pending, значит стоит настроить автоматическое удаление устаревших заказов.
Пошаговое решение: автоматическое удаление заказов по статусу и дате
1. Создаём функцию для удаления заказов
Добавьте в файл functions.php вашей темы или в отдельный плагин следующий код, который удаляет заказы с заданным статусом, старше определённого количества дней:
function wpreboot_delete_old_orders_by_status( $status = 'cancelled', $days = 30 ) {
global $wpdb;
$date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );
// Получаем ID заказов
$order_ids = $wpdb->get_col( $wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status = %s AND post_date < %s",
'wc-' . $status,
$date_threshold
) );
if ( empty( $order_ids ) ) {
return;
}
foreach ( $order_ids as $order_id ) {
wp_delete_post( $order_id, true ); // true - удаление без возможности восстановления
}
}2. Запускаем функцию по расписанию с WP-Cron
Добавьте запуск очистки через CRON, например, раз в неделю:
// Регистрируем событие при активации темы или плагина
function wpreboot_schedule_order_cleanup() {
if ( ! wp_next_scheduled( 'wpreboot_weekly_order_cleanup' ) ) {
wp_schedule_event( time(), 'weekly', 'wpreboot_weekly_order_cleanup' );
}
}
add_action( 'wp', 'wpreboot_schedule_order_cleanup' );
// Хук для выполнения очистки
add_action( 'wpreboot_weekly_order_cleanup', function() {
wpreboot_delete_old_orders_by_status( 'cancelled', 30 );
wpreboot_delete_old_orders_by_status( 'pending', 14 );
} );3. Вручную запускать очистку (для теста)
Чтобы проверить работоспособность функции без ожидания cron, вызовите её вручную, например, добавив временный код:
add_action( 'admin_init', function() {
if ( current_user_can( 'manage_woocommerce' ) && isset( $_GET['run_order_cleanup'] ) ) {
wpreboot_delete_old_orders_by_status( 'cancelled', 30 );
wpreboot_delete_old_orders_by_status( 'pending', 14 );
wp_die( 'Очистка заказов выполнена' );
}
} );После этого зайдите в админку с параметром ?run_order_cleanup=1 в URL (например, https://example.com/wp-admin/?run_order_cleanup=1).
Проверка результата после внедрения
- Повторите SQL-запрос из раздела диагностики: количество заказов со статусами
wc-cancelledиwc-pendingдолжно существенно уменьшиться. - Просмотрите раздел заказов в админке WooCommerce — старые отменённые и неактивные заказы должны отсутствовать.
- При ручном запуске очистки в админке вы увидите сообщение «Очистка заказов выполнена».
- Проверьте логи ошибок и убедитесь, что нет проблем с удалением.
Частые ошибки и как их исправить
- Функция не удаляет заказы: проверьте префикс таблиц в базе данных, он может отличаться от
wp_. Используйте глобальную переменную$wpdb->postsдля правильных таблиц. - CRON не срабатывает: WP-Cron требует посещений сайта для срабатывания. Для теста используйте ручной вызов через
?run_order_cleanup=1. Для стабильности настроить системный cron на вызовwp-cron.php. - Удаляются не те заказы: проверьте корректность статусов — WooCommerce добавляет префикс
wc-к статусам заказов, используйте именно их. - Потеря данных: функция удаляет заказы без возможности восстановления. Сделайте резервную копию базы перед внедрением.
Практические советы по безопасности и производительности
- Всегда тестируйте код на копии сайта, а не на боевом магазине.
- Для больших магазинов удаление большого количества заказов за один запрос может приводить к таймаутам. Можно добавить лимит на количество удаляемых заказов за один запуск.
- Регулярно создавайте резервные копии базы данных, особенно перед автоматическими удалениями.
- Включайте логирование удаления заказов в отдельный файл для аудита и отладки.
Сравнение вариантов автоматического удаления заказов
| Вариант | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку WooCommerce | Простота, без кода | Трудозатратно, не подходит для большого количества заказов |
| Плагины очистки заказов | Готовое решение, настройки через UI | Могут быть избыточными, нагрузка, возможны конфликты |
| Самописный код с WP-Cron (как в статье) | Гибкость, точечное решение, контроль | Требует навыков разработки, нужно следить за работой WP-Cron |