Диагностика проблемы: что такое забытые заказы и почему их нужно удалять
В WooCommerce «забытые заказы» — это заказы со статусом pending или failed, которые не были завершены покупателем. Они не только загромождают базу данных, но и могут влиять на аналитические отчёты и замедлять работу сайта при большом количестве таких записей.
Диагностика: Вы можете проверить количество таких заказов с помощью SQL-запроса к базе данных:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed');Если число превышает несколько сотен — имеет смысл настроить автоматическое удаление.
Пошаговое решение: настройка автоматического удаления забытых заказов через WP-Cron
1. Создание функции для удаления старых заказов
Добавьте следующий код в файл functions.php вашей темы или в кастомный плагин:
function wptest_delete_old_abandoned_orders() {
global $wpdb;
$days = 7; // Удалять заказы старше 7 дней
$statuses = ['wc-pending', 'wc-failed'];
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
foreach ($statuses as $status) {
$orders = wc_get_orders([
'status' => $status,
'date_created' => '<' . $date_threshold,
'limit' => -1,
'return' => 'ids',
]);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // Удаление без возможности восстановления
}
}
}
}2. Регистрация события WP-Cron для периодического запуска
Добавьте планировщик, который будет запускать функцию раз в сутки:
function wptest_schedule_abandoned_order_cleanup() {
if (!wp_next_scheduled('wptest_abandoned_order_cleanup_hook')) {
wp_schedule_event(time(), 'daily', 'wptest_abandoned_order_cleanup_hook');
}
}
add_action('wp', 'wptest_schedule_abandoned_order_cleanup');
add_action('wptest_abandoned_order_cleanup_hook', 'wptest_delete_old_abandoned_orders');3. Удаление задачи при деактивации
Чтобы избежать «мусора» в планировщике, удалите cron-задачу при деактивации плагина или смене темы:
function wptest_clear_abandoned_order_cleanup_schedule() {
$timestamp = wp_next_scheduled('wptest_abandoned_order_cleanup_hook');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wptest_abandoned_order_cleanup_hook');
}
}
register_deactivation_hook(__FILE__, 'wptest_clear_abandoned_order_cleanup_schedule');Проверка результата после внедрения
- Через несколько дней (или для теста вручную вызовите
wptest_delete_old_abandoned_orders()) проверьте базу данных SQL-запросом выше. Количество заказов со статусамиwc-pendingиwc-failedдолжно уменьшиться. - В панели WooCommerce убедитесь, что старые незавершённые заказы отсутствуют.
- Для отладки добавьте логирование в функцию удаления через
error_log()или используйте плагин Debug Bar.
Частые ошибки и их исправление
- Заказы не удаляются: Проверьте, что статус заказа указан с префиксом
wc-(например,wc-pending), а не простоpending. - WP-Cron не срабатывает: Убедитесь, что на сайте есть трафик — WP-Cron запускается при посещении сайта. Для теста используйте плагин WP Crontrol для ручного запуска задачи.
- Ошибка в SQL или wp_delete_post: Проверьте наличие прав пользователя, под которым работает сайт, и синтаксис кода.
Практические советы по безопасности и производительности
- Безопасное удаление: Используйте
wp_delete_post($order_id, true), чтобы полностью удалить заказ из базы без помещения в корзину удалённых записей, что уменьшит нагрузку. - Ограничение числа удаляемых заказов: В больших базах данных при большом количестве забытых заказов добавьте пагинацию удаления, чтобы не перегружать сервер:
function wptest_delete_old_abandoned_orders_batch() {
$days = 7;
$statuses = ['wc-pending', 'wc-failed'];
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$batch_limit = 20; // Удалять по 20 заказов за запуск
foreach ($statuses as $status) {
$orders = wc_get_orders([
'status' => $status,
'date_created' => '<' . $date_threshold,
'limit' => $batch_limit,
'return' => 'ids',
]);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_delete_post($order_id, true);
}
}
}
}- Регулярно чистите базу: Настройте резервное копирование перед внедрением автоматического удаления.
- Мониторинг: Используйте плагины типа Clearfy Pro для контроля дублей и оптимизации базы данных.
Сравнение вариантов удаления забытых заказов
| Метод | Плюсы | Минусы | Пример использования |
|---|---|---|---|
| Ручное удаление через админку | Простота, без кода | Трудоёмко при большом количестве | WooCommerce > Заказы > фильтр > удаление |
| Плагины очистки (например Clearfy Pro) | Автоматизация, дополнительные функции оптимизации | Потенциальная нагрузка, необходимость обновлений | Clearfy Pro |
| Кастомный код с WP-Cron (этот метод) | Контроль, без сторонних плагинов, гибкость | Требует навыков, нужно тестировать | Код из статьи |