Диагностика проблемы: зачем удалять заказы со статусом «неоплачено» в WooCommerce?
В WooCommerce заказ со статусом «неоплачено» (Pending payment) может оставаться в базе неопределённое время. При большом количестве таких заказов база растёт, что негативно влияет на производительность и усложняет работу с данными. Кроме того, многие магазины, использующие онлайн-кассы (ККМ), сталкиваются с необходимостью синхронизации статусов заказов, чтобы не отправлять в отчет лишние неоплаченные позиции.
Основные признаки, что автоматическое удаление нужно настроить:
- Более 5-10% заказов в статусе «неоплачено» за последние 30 дней;
- Замедление работы админки WooCommerce;
- Ошибки или некорректные отчёты с ККМ;
- Отсутствие политики хранения «неоплаченных» заказов.
Как проверить текущее количество заказов в статусе «неоплачено»
Для быстрой оценки можно выполнить SQL-запрос к базе данных WordPress:
SELECT COUNT(ID) FROM wp_posts WHERE post_type = 'shop_order' AND post_status = 'wc-pending';Замените wp_ на ваш префикс таблиц. Результат покажет, сколько заказов в статусе «неоплачено» сейчас хранится и может быть кандидатом на удаление.
Пошаговое решение: удаление заказов с «неоплачено» старше N дней
Шаг 1. Создаем функцию для удаления заказов
Добавьте следующий код в файл functions.php вашей темы или в отдельный плагин:
function wpclass_delete_old_pending_orders() {
$days = 7; // удалять заказы старше 7 дней
$date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$args = [
'limit' => -1,
'status' => 'pending',
'date_created' => '<' . $date,
'return' => 'ids',
];
$orders = wc_get_orders($args);
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // полное удаление без перемещения в корзину
}
}Шаг 2. Запускаем функцию по расписанию (WP-Cron)
Чтобы удаление происходило автоматически, зарегистрируем задачу в WP-Cron:
add_action('wpclass_daily_delete_pending_orders', 'wpclass_delete_old_pending_orders');
if (!wp_next_scheduled('wpclass_daily_delete_pending_orders')) {
wp_schedule_event(time(), 'daily', 'wpclass_daily_delete_pending_orders');
}Этот код запустит удаление заказов ежедневно. При необходимости интервал можно изменить на еженедельно, создав свой интервал.
Интеграция с ККМ: как не удалять заказы, отправленные в кассу
Если вы используете онлайн-кассу (например, через плагин «МойСклад», «АТОЛ» или другие), важно не удалять заказы, которые уже отправлены в ККМ для фискализации.
Для этого добавьте в заказы мета-ключ, например, kkm_sent со значением yes. Тогда функцию удаления можно модифицировать:
function wpclass_delete_old_pending_orders_exclude_kkm() {
$days = 7;
$date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$args = [
'limit' => -1,
'status' => 'pending',
'date_created' => '<' . $date,
'return' => 'ids',
'meta_query' => [
[
'key' => 'kkm_sent',
'compare' => 'NOT EXISTS',
],
],
];
$orders = wc_get_orders($args);
foreach ($orders as $order_id) {
wp_delete_post($order_id, true);
}
}Проверка результата после внедрения
Через 1-2 дня после запуска WP-Cron проверьте:
- Количество заказов в статусе «неоплачено» через SQL-запрос (см. выше) — оно должно уменьшиться;
- В админке WooCommerce — исчезновение старых неоплаченных заказов;
- Логи плагина ККМ — убедитесь, что удаляются только заказы без метки
kkm_sent; - Отчёты по заказам — нет пропавших или удалённых заказов с пометкой ККМ.
Частые ошибки и как их исправить
- Ошибка: Заказы не удаляются.
Причина: Задача WP-Cron не срабатывает или функция не вызывается.
Решение: Проверьте, работает ли WP-Cron на сайте, используя плагин WP Crontrol. Вызовите функцию вручную черезwpclass_delete_old_pending_orders()для теста. - Ошибка: Удаляются заказы, уже отправленные в ККМ.
Причина: Нет проверки мета-ключаkkm_sentили он не установлен.
Решение: Добавьте проверку мета-ключа, убедитесь, что плагин ККМ ставит этот флаг. - Ошибка: Удаление замедляет сайт.
Причина: При большом количестве заказов выполняется удаление всех сразу.
Решение: Разбейте удаление на партии по 50-100 заказов в одном запуске, добавьте задержки между пакетами.
Практические советы по безопасности и производительности
- Всегда делайте резервную копию базы перед внедрением автоматического удаления.
- Используйте WP-Cron только если на сайте достаточный трафик. Для низкотрафиковых сайтов настройте системный cron на сервере.
- При большом объёме заказов используйте пакетное удаление через WP_Query с параметром
posts_per_pageи циклом. - Не удаляйте заказы с другими статусами, чтобы избежать потери данных.
- Перед удалением можно отправлять уведомления администратору или сохранять лог удалённых заказов.
Сравнение методов удаления заказов
| Метод | Преимущества | Недостатки | Когда применять |
|---|---|---|---|
| Ручное SQL удаление | Быстро, эффективно | Риск повреждения данных, нет триггеров WP | Для опытных разработчиков, при аварийной очистке |
| Удаление через WP функции (wc_get_orders, wp_delete_post) | Безопасно, триггеры, хуки срабатывают | Медленнее, нагрузка на сервер | Для регулярного использования, автоматизации |
| Плагины очистки (например, Clearfy Pro) | Удобство, интерфейс | Ограниченная гибкость, возможны конфликты | Для пользователей без навыков программирования |