Диагностика проблемы с незавершёнными заказами WooCommerce
В WooCommerce часто накапливаются заказы со статусом pending или failed, которые пользователь не оплатил или оставил незавершёнными. Это влияет на базу данных, замедляет админку и усложняет аналитику. Чтобы держать базу в порядке, нужно периодически удалять такие заказы автоматически.
Пошаговое решение: удаление незавершённых заказов через WP-Cron
1. Создание функции для удаления заказов
Напишем функцию, которая удалит заказы со статусом pending и failed, старше определённого времени (например, 24 часа):
function wp_delete_old_unpaid_orders() {
$args = array(
'status' => array('pending', 'failed'),
'date_created' => '<' . ( time() - DAY_IN_SECONDS ),
'limit' => -1,
'return' => 'ids',
);
$orders = wc_get_orders( $args );
if ( empty( $orders ) ) {
return;
}
foreach ( $orders as $order_id ) {
wp_delete_post( $order_id, true );
}
}2. Регистрация cron-задачи при инициализации
Добавим событие, которое будет запускать функцию ежедневно:
function wp_schedule_delete_old_orders() {
if ( ! wp_next_scheduled( 'wp_delete_old_unpaid_orders_hook' ) ) {
wp_schedule_event( time(), 'daily', 'wp_delete_old_unpaid_orders_hook' );
}
}
add_action( 'wp', 'wp_schedule_delete_old_orders' );
add_action( 'wp_delete_old_unpaid_orders_hook', 'wp_delete_old_unpaid_orders' );3. Очистка cron при деактивации плагина или темы
Чтобы не оставлять лишних задач, удалим cron при деактивации:
function wp_clear_delete_old_orders_cron() {
$timestamp = wp_next_scheduled( 'wp_delete_old_unpaid_orders_hook' );
if ( $timestamp ) {
wp_unschedule_event( $timestamp, 'wp_delete_old_unpaid_orders_hook' );
}
}
register_deactivation_hook( __FILE__, 'wp_clear_delete_old_orders_cron' );Проверка результата после внедрения
- Выполните команду
wp cron event run wp_delete_old_unpaid_orders_hookчерез WP-CLI или дождитесь следующего запуска по расписанию. - Проверьте базу данных или раздел заказов WooCommerce — заказы со статусом
pendingиfailedстарше 24 часов должны быть удалены. - Для отладки можно добавить логирование, например, записывать ID удалённых заказов в отдельный файл.
Частые ошибки и их исправление
- Функция не запускается по расписанию: Убедитесь, что WP-Cron работает (нет блокировок на сервере), или настройте системный cron для вызова
wp-cron.php. - Заказы не удаляются: Проверьте, что статусы заказов указаны правильно и что есть заказы старше 24 часов. Для диагностики временно добавьте
error_log()внутри цикла удаления. - Удаляются не те заказы: Проверьте параметры фильтрации в
wc_get_orders(), особенно дату создания и статусы. - Ошибка при деактивации: Убедитесь, что
__FILE__вregister_deactivation_hookкорректно указывает на файл плагина.
Практические советы по безопасности и производительности
- Удаление заказов нельзя выполнять слишком часто — выбирайте интервал не реже раза в сутки, чтобы не перегружать базу.
- Не используйте массовое удаление в пользовательском запросе — лучше удалять заказы по одному через
wp_delete_post()с параметром$force_delete = true, чтобы удалить все связанные данные. - При большом количестве заказов добавьте лимит и делайте удаление по партиям, чтобы избежать таймаута.
- Для сайтов с высокой нагрузкой лучше переключиться на системный cron, а не полагаться на WP-Cron.
- Регулярно делайте резервные копии базы перед автоматическим удалением данных.
Сравнение вариантов реализации
| Метод | Преимущества | Недостатки |
|---|---|---|
| WP-Cron + PHP функция | Простота, не требует доступа к серверу | Зависит от посещаемости сайта, может не сработать вовремя |
| Системный cron + WP-CLI | Надёжность, точность выполнения | Требует доступа к серверу и знаний CLI |
| Плагины для очистки заказов | Готовые решения с интерфейсом | Могут быть избыточными и влиять на производительность |