Почему важно удалять незавершённые заказы в WooCommerce
Незавершённые заказы — это заказы, которые были созданы, но не оплачены или отменены. Они занимают место в базе данных, могут влиять на отчёты, а при большом количестве замедлять работу сайта и создавать путаницу в админке.
Регулярное удаление таких заказов помогает поддерживать базу в чистоте и улучшает производительность WooCommerce.
Диагностика проблемы: как выявить незавершённые заказы
В WooCommerce незавершённые заказы обычно имеют статус pending (ожидание оплаты), failed (неудачная оплата) или cancelled (отменённый). Чтобы проверить их количество, выполните SQL-запрос к базе данных:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed', 'wc-cancelled');Или используйте WP-CLI:
wp post list --post_type=shop_order --post_status=wc-pending,wc-failed,wc-cancelled --field=ID | wc -lЕсли число превышает несколько сотен — пора автоматизировать очистку.
Пошаговое решение: как автоматически удалять незавершённые заказы
1. Создаём функцию для удаления заказов старше N часов
Добавьте следующий код в файл functions.php вашей темы или в отдельный плагин:
function wpex_delete_old_unpaid_orders() {
$hours = 24; // Время в часах, старше которого заказы удаляются
$date = date('Y-m-d H:i:s', strtotime('-' . $hours . ' hours'));
$args = array(
'post_type' => 'shop_order',
'post_status' => array('wc-pending', 'wc-failed', 'wc-cancelled'),
'date_query' => array(
array(
'column' => 'post_date',
'before' => $date,
),
),
'fields' => 'ids',
'posts_per_page' => -1,
);
$orders = get_posts($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_trash_post($order_id); // Можно заменить на wp_delete_post для полной очистки
}
}
}2. Запускаем функцию по расписанию с помощью WP-Cron
Добавьте код для создания периодического задания:
if (!wp_next_scheduled('wpex_daily_delete_unpaid_orders')) {
wp_schedule_event(time(), 'daily', 'wpex_daily_delete_unpaid_orders');
}
add_action('wpex_daily_delete_unpaid_orders', 'wpex_delete_old_unpaid_orders');Это обеспечит ежедневное удаление заказов старше 24 часов.
3. Проверка работы задачи
Чтобы проверить выполнение, можно добавить логирование:
function wpex_delete_old_unpaid_orders() {
$hours = 24;
$date = date('Y-m-d H:i:s', strtotime('-' . $hours . ' hours'));
$args = array(
'post_type' => 'shop_order',
'post_status' => array('wc-pending', 'wc-failed', 'wc-cancelled'),
'date_query' => array(
array('column' => 'post_date', 'before' => $date),
),
'fields' => 'ids',
'posts_per_page' => -1,
);
$orders = get_posts($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_trash_post($order_id);
}
error_log('Deleted ' . count($orders) . ' old unpaid orders');
} else {
error_log('No old unpaid orders found');
}
}Логи смотрите в wp-content/debug.log при включённом WP_DEBUG_LOG.
Проверка результата после внедрения
- Зайдите в админку WooCommerce — заказы со статусами
pending,failed,cancelledстарше 24 часов должны исчезнуть. - Выполните SQL-запрос или WP-CLI команду из раздела диагностики — количество старых заказов снизится.
- Проверьте файл логов для подтверждения выполнения задачи.
Частые ошибки и как их исправить
- Заказы не удаляются: Проверьте, активен ли WP-Cron. На некоторых хостингах он отключён — настройте системный cron или используйте плагин WP Crontrol.
- Удаляются свежие заказы: Проверьте параметр
$hoursи формат даты; используйте UTC-время, если необходимо. - Ошибки прав доступа: Убедитесь, что пользователь с нужными правами запускает код, особенно если используете WP-CLI.
- Потеря данных: Рекомендуется использовать
wp_trash_postвместоwp_delete_postдля возможности восстановления.
Практические советы по безопасности и производительности
- Не запускайте удаление слишком часто (например, не чаще раза в час), чтобы избежать нагрузки на базу.
- Добавьте проверку nonce и прав для вызова удаления вручную через админку, если планируете такой функционал.
- Регулярно очищайте корзину (trash) заказов, чтобы полностью освободить место.
- Если заказов очень много, делайте удаление пакетами, например по 100 заказов за раз, чтобы избежать таймаутов.
Сравнение способов удаления незавершённых заказов
| Метод | Простота | Контроль | Риски |
|---|---|---|---|
| Плагин (например, WooCommerce Cleanup) | Высокая | Ограниченный | Зависимость от стороннего кода |
| WP-Cron + кастомный код | Средняя | Высокий, можно адаптировать | Требует тестирования и поддержки |
| Ручное удаление через админку | Низкая | Максимальный контроль | Трудозатратно, риск пропуска |