Диагностика проблемы с неоплаченными заказами в WooCommerce
Неоплаченные заказы (статус "pending", "failed" или "on-hold") могут накапливаться в базе данных WooCommerce, создавая нагрузку на систему и усложняя управление заказами. Особенно это актуально для магазинов с большим потоком клиентов. Автоматическое удаление таких заказов через определённое время помогает поддерживать базу в порядке и освобождать ресурсы.
Как определить, что проблема есть?
- Зайдите в WooCommerce → Заказы и отфильтруйте по статусу
pendingилиfailed. - Проверьте количество заказов с этими статусами и дату их создания.
- Используйте WP-CLI для подсчёта заказов, например:
wp post list --post_type=shop_order --post_status=pending --field=ID | wc -l
Если количество старых неоплаченных заказов превышает разумные пределы (например, более 50 заказов старше 3 дней), стоит автоматизировать их удаление.
Пошаговое решение: автоматическое удаление неоплаченных заказов через код
WooCommerce не предоставляет встроенной функции для удаления заказов по времени, но можно добавить кастомный cron-задачу, которая будет выполнять эту операцию.
1. Добавляем cron-задачу
В functions.php вашей темы или в кастомном плагине добавьте следующий код:
if (!wp_next_scheduled('wc_delete_old_unpaid_orders')) {
wp_schedule_event(time(), 'hourly', 'wc_delete_old_unpaid_orders');
}
add_action('wc_delete_old_unpaid_orders', 'wc_delete_old_unpaid_orders_callback');
function wc_delete_old_unpaid_orders_callback() {
$days = 3; // количество дней, после которых заказы удаляются
$date = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$args = [
'post_type' => 'shop_order',
'post_status' => ['wc-pending', 'wc-failed', 'wc-on-hold'],
'date_query' => [
[
'column' => 'post_date',
'before' => $date,
],
],
'fields' => 'ids',
'posts_per_page' => -1,
];
$old_orders = get_posts($args);
if (!empty($old_orders)) {
foreach ($old_orders as $order_id) {
wp_delete_post($order_id, true); // true - удаляет без возможности восстановления
}
}
}2. Проверка работы крона
Для проверки, сработал ли cron, можно временно добавить логирование в файл:
function wc_delete_old_unpaid_orders_callback() {
$days = 3;
$date = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$args = [
'post_type' => 'shop_order',
'post_status' => ['wc-pending', 'wc-failed', 'wc-on-hold'],
'date_query' => [
[
'column' => 'post_date',
'before' => $date,
],
],
'fields' => 'ids',
'posts_per_page' => -1,
];
$old_orders = get_posts($args);
if (!empty($old_orders)) {
foreach ($old_orders as $order_id) {
wp_delete_post($order_id, true);
}
}
error_log('Удалено заказов: ' . count($old_orders));
}Логи можно посмотреть в wp-content/debug.log при включенном WP_DEBUG_LOG.
3. Запуск cron вручную для теста
Используйте WP-CLI для запуска задачи вручную:
wp cron event run wc_delete_old_unpaid_ordersПроверка результата после внедрения
- Через админку WooCommerce проверьте количество неоплаченных заказов старше 3 дней — их должно стать меньше или они должны исчезнуть.
- Просмотрите логи (если добавили логирование) для подтверждения удаления.
- Используйте WP-CLI для подсчёта заказов с нужным статусом и датой.
Частые ошибки и как их исправить
- Cron не срабатывает: Проверьте, включена ли система WP-Cron. В некоторых случаях нужен системный cron, особенно на больших сайтах. Для теста запустите cron вручную через WP-CLI.
- Заказы не удаляются: Убедитесь, что статус заказов в коде указан правильно: WooCommerce использует статусы с префиксом
wc-, напримерwc-pending. - Удаляются нужные заказы: Проверьте условие по дате и статусу, чтобы не удалить оплаченные или актуальные заказы.
- Проблемы с правами доступа: Скрипт должен запускаться под пользователем с правами администратора или с правами на удаление постов.
Практические советы по безопасности и производительности
- Резервное копирование: Перед внедрением автоматического удаления убедитесь, что есть резервные копии базы данных.
- Используйте транзакции: Если у вас большой магазин, подумайте о пакетном удалении заказов по частям, чтобы не перегружать сервер.
- Ограничивайте статус и дату: Удаляйте только действительно старые и неоплаченные заказы, чтобы не потерять важные данные.
- Проверяйте совместимость: Если используете сторонние плагины для заказов, убедитесь, что их данные тоже будут корректно удаляться.
Альтернативы: плагины и код
| Вариант | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Код из статьи | Полный контроль, нет лишних плагинов | Нужны навыки кода, поддержка своими силами | Подходит для опытных разработчиков |
| Плагины автоочистки заказов (например, WooCommerce Order Cleanup) | Простота использования, настройки через UI | Может быть избыточным, нагрузка на сайт | Подходит для новичков и средних магазинов |