Диагностика проблемы с неподтверждёнными заказами в WooCommerce
В интернет-магазинах на WooCommerce часто накапливаются заказы со статусом pending или failed, которые не были оплачены или подтверждены. Это приводит к раздутой базе данных и усложняет управление заказами.
Проверьте, сколько таких заказов у вас сейчас в базе. Для этого можно использовать SQL-запрос в phpMyAdmin или WP-CLI:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed');Если число превышает несколько сотен или тысяч — пора автоматизировать очистку.
Почему важно удалять неподтверждённые заказы
- Уменьшается размер базы данных и время отклика запросов.
- Административная панель работает быстрее без лишних записей.
- Уменьшается риск ошибок при выгрузке заказов в бухгалтерию и CRM.
Пошаговое решение: автоматическое удаление неподтверждённых заказов через код
1. Создание функции для удаления заказов старше заданного срока
Добавьте следующий код в файл functions.php вашей дочерней темы или в плагин для кастомных функций:
function wpaction_delete_old_unpaid_orders() {
$days = 7; // количество дней, по истечении которых заказы считаются устаревшими
$date = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$args = [
'post_type' => 'shop_order',
'post_status' => ['wc-pending', 'wc-failed'],
'date_query' => [
[
'column' => 'post_date',
'before' => $date,
],
],
'fields' => 'ids',
'posts_per_page' => -1,
];
$orders = get_posts($args);
foreach ($orders as $order_id) {
wp_delete_post($order_id, true);
}
}2. Запуск функции по расписанию через WP-Cron
Добавьте планировщик задач, чтобы функция запускалась ежедневно:
if (! wp_next_scheduled('wpaction_delete_old_unpaid_orders_event')) {
wp_schedule_event(time(), 'daily', 'wpaction_delete_old_unpaid_orders_event');
}
add_action('wpaction_delete_old_unpaid_orders_event', 'wpaction_delete_old_unpaid_orders');3. Очистка задачи при деактивации
Чтобы не оставлять мусор, удалите расписание при деактивации плагина или темы:
function wpaction_deactivate_cleanup() {
$timestamp = wp_next_scheduled('wpaction_delete_old_unpaid_orders_event');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpaction_delete_old_unpaid_orders_event');
}
}
register_deactivation_hook(__FILE__, 'wpaction_deactivate_cleanup');Проверка результата после внедрения
1. Перед добавлением кода сделайте резервную копию базы данных.
2. Запустите функцию вручную в тестовой среде:
wpaction_delete_old_unpaid_orders();3. Проверьте количество заказов с помощью SQL-запроса из раздела диагностики.
4. Убедитесь, что заказы старше 7 дней со статусом pending и failed удалены.
5. Проверьте журнал ошибок и логи сервера на предмет нежелательных ошибок.
Частые ошибки и как их исправить
- Не удаляются заказы: Проверьте правильность статусов и даты в
date_query. Возможно, у вас нестандартные статусы или другая временная зона. - Планировщик не срабатывает: WP-Cron запускается при посещении сайта. Для надёжности настройте системный
cronна сервере. - Удаление не полное: Функция
wp_delete_postс параметромtrueудаляет все связанные метаданные. Если остались данные — проверьте сторонние плагины, которые могут создавать свои таблицы.
Практические советы по безопасности и производительности
- Запускайте удаление в низкую нагрузку сервера, чтобы не замедлять сайт.
- Ограничьте количество удаляемых заказов за один раз, если база очень большая. Например, добавьте параметр
posts_per_page = 100и используйте пагинацию. - Храните резервные копии базы, чтобы избежать потери важных данных.
- Для масштабных магазинов рассмотрите использование WP-CLI-скриптов для пакетного удаления.
Таблица сравнения способов удаления неподтверждённых заказов
| Способ | Преимущества | Недостатки |
|---|---|---|
| Ручное удаление через админку | Просто, не требует кода | Затратно по времени, не автоматично |
| Плагины очистки (например, WP Sweep) | Автоматизация, удобный интерфейс | Дополнительная нагрузка, могут удалять лишнее |
| Код с WP-Cron (описанный способ) | Полный контроль, без сторонних плагинов | Требует навыков разработки, настройка WP-Cron |