Диагностика проблемы с неактивными заказами в WooCommerce
В интернет-магазине на WooCommerce часто накапливаются заказы со статусом on-hold, pending или failed, которые не были завершены покупателем. Такие заказы увеличивают нагрузку на базу данных, замедляют работу админки и создают путаницу в отчетах.
Чтобы определить, есть ли проблема, можно выполнить запрос к базе данных:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-on-hold', 'wc-failed');Если число таких заказов превышает несколько сотен, стоит настроить автоматическое удаление неактивных заказов.
Пошаговое решение: автоматическое удаление неактивных заказов по статусу
1. Создание функции для удаления заказов
Добавьте следующий код в файл functions.php вашей дочерней темы или в кастомный плагин:
function delete_inactive_wc_orders() {
$statuses = ['pending', 'on-hold', 'failed'];
$days_limit = 30; // Количество дней, после которого заказы считаются неактивными
foreach ( $statuses as $status ) {
$args = [
'limit' => -1,
'status' => $status,
'date_created' => '<' . ( time() - DAY_IN_SECONDS * $days_limit ),
'return' => 'ids',
];
$orders = wc_get_orders( $args );
foreach ( $orders as $order_id ) {
wp_delete_post( $order_id, true );
}
}
}2. Планировщик задач WP-Cron для автоматизации
Добавьте планировщик, который будет запускать удаление раз в сутки:
if ( ! wp_next_scheduled( 'delete_inactive_wc_orders_cron' ) ) {
wp_schedule_event( time(), 'daily', 'delete_inactive_wc_orders_cron' );
}
add_action( 'delete_inactive_wc_orders_cron', 'delete_inactive_wc_orders' );3. Очистка планировщика при деактивации
Чтобы избежать утечек задач, добавьте код для удаления планировщика при деактивации плагина или темы:
function remove_inactive_orders_cron() {
$timestamp = wp_next_scheduled( 'delete_inactive_wc_orders_cron' );
if ( $timestamp ) {
wp_unschedule_event( $timestamp, 'delete_inactive_wc_orders_cron' );
}
}
register_deactivation_hook( __FILE__, 'remove_inactive_orders_cron' );Проверка результата после внедрения
- Запустите вручную функцию
delete_inactive_wc_orders()через WP CLI или временно вызовите её вfunctions.php, чтобы проверить удаление. - В админке WooCommerce проверьте количество заказов в статусах
pending,on-hold,failed– оно должно уменьшиться. - Убедитесь, что WP-Cron запущен, используя плагин WP Crontrol или команду
wp cron event list.
Частые ошибки и как их исправить
- Заказы не удаляются: проверьте, что функция подключена и WP-Cron работает. На некоторых хостингах WP-Cron отключен, для стабильности настройте системный cron.
- Удаляются не те заказы: проверьте правильность статусов и дату создания. В WooCommerce статусы заказов в базе обозначаются с префиксом
wc-, но при использованииwc_get_ordersнужно писать без префикса. - Потеря данных: функция удаляет заказы без возможности восстановления. При необходимости используйте
wp_trash_post()вместоwp_delete_post(), чтобы отправлять заказы в корзину.
Практические советы по безопасности и производительности
- Используйте транзакции или обрабатывайте заказы пакетами (например, по 20 штук), чтобы не перегружать сервер.
- Проводите резервное копирование базы данных перед внедрением автоматического удаления.
- Для проверки работы функции можно временно добавить логирование в файл или использовать функцию
error_log(). - Для сайтов с большим количеством заказов рекомендуется выполнять удаление через WP-CLI, чтобы избежать таймаутов в веб-сервере.
Сравнение вариантов автоматического удаления заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку | Просто, без кода | Трудоемко, не автоматично |
| Плагин (например, WooCommerce Cleanup) | Удобный интерфейс, настройки | Дополнительные зависимости, нагрузка |
| Кастомный код + WP-Cron | Легковесно, гибко, без сторонних плагинов | Требует навыков, настройка cron |