Проблема: накопление неоплаченных заказов в WooCommerce
В интернет-магазинах на WooCommerce часто возникает ситуация, когда в базе накапливается множество неоплаченных заказов. Это загромождает базу данных, замедляет работу панели администратора и может влиять на отчёты и аналитику. Автоматическое удаление заказов, которые не были оплачены в течение определённого времени, решает эту проблему.
Диагностика проблемы
Чтобы проверить, есть ли неоплаченные заказы и сколько их, используйте SQL-запрос или WP-CLI:
SELECT COUNT(*) FROM wp_posts WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-on-hold');Здесь wc-pending и wc-on-hold — статусы неоплаченных заказов. Если количество большое (от сотен и выше), есть смысл автоматизировать их удаление.
Пошаговое решение: удаление заказов по времени ожидания
Шаг 1. Добавляем функцию для удаления заказов старше N часов
В файл functions.php вашей дочерней темы или в кастомный плагин добавьте следующий код:
function wpdream_delete_unpaid_orders() {
$hours = 24; // время в часах, по истечении которого удаляем заказ
$date = date('Y-m-d H:i:s', strtotime("-{$hours} hours"));
$args = [
'posts_per_page' => -1,
'post_type' => 'shop_order',
'post_status' => [ 'wc-pending', 'wc-on-hold' ],
'date_query' => [
[
'column' => 'post_date',
'before' => $date,
],
],
'fields' => 'ids',
];
$orders = get_posts($args);
if (!empty($orders)) {
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // true - без возможности восстановления
}
}
}Шаг 2. Настраиваем крон-задачу для регулярного вызова
Добавьте следующий код для регистрации собственного Cron-события:
if (!wp_next_scheduled('wpdream_cron_delete_unpaid_orders')) {
wp_schedule_event(time(), 'hourly', 'wpdream_cron_delete_unpaid_orders');
}
add_action('wpdream_cron_delete_unpaid_orders', 'wpdream_delete_unpaid_orders');Этот код запустит функцию wpdream_delete_unpaid_orders каждый час, удаляя старые неоплаченные заказы.
Шаг 3. Очистка Cron при деактивации
Чтобы избежать мусора в планировщике, добавьте в плагин или functions.php такую функцию:
function wpdream_deactivate_cleanup() {
$timestamp = wp_next_scheduled('wpdream_cron_delete_unpaid_orders');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpdream_cron_delete_unpaid_orders');
}
}
register_deactivation_hook(__FILE__, 'wpdream_deactivate_cleanup');Проверка результата после внедрения
- Подождите час после внедрения или вручную запустите Cron через WP-CLI:
wp cron event run wpdream_cron_delete_unpaid_orders - Проверьте базу заказов, чтобы убедиться, что старые неоплаченные заказы удалены
- В административной панели WooCommerce зайдите в «Заказы» и отфильтруйте по статусам
Ожидает оплатыилиВ ожидании— количество должно уменьшиться
Частые ошибки и как их исправить
- Заказы не удаляются: проверьте, что Cron действительно запускается (логируйте вызов функции или используйте плагин WP Crontrol)
- Удаляются не те заказы: убедитесь, что в
post_statusуказаны нужные статусы, и правильно рассчитывается дата - Удаление тормозит сайт: если заказов очень много, удаляйте партиями, разбивая их на части, например по 50 штук
- Заказы важно не удалять навсегда: замените
wp_delete_post($order_id, true)наwp_trash_post($order_id), чтобы сначала переместить в корзину
Практические советы по безопасности и производительности
- Регулярно создавайте резервные копии базы данных перед удалением заказов
- Добавьте логирование в файл, чтобы отслеживать удалённые заказы и время удаления
- Используйте WP-CLI для ручного запуска и отладки процесса удаления
- Если на сайте много заказов, запуск cron лучше делать не чаще раза в час, чтобы не создавать нагрузку
- Рассмотрите использование плагина Clearfy Pro для дополнительной оптимизации WooCommerce и базы данных
Таблица сравнения способов удаления неоплаченных заказов
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Удаление через WP Cron и код | Полный контроль, без сторонних плагинов, гибкость | Требует навыков разработки, настройки Cron | Для опытных пользователей, кастомных проектов |
| Плагины автоматической очистки заказов | Простота использования, готовые настройки | Может быть слишком общий функционал, нагрузка | Для новичков и типовых сайтов |
| Ручное удаление через админку | Просто, не требует кода | Трудозатратно при большом объёме заказов | Малые объёмы заказов |