Проблема: неоплаченные заказы захламляют базу данных WooCommerce
В интернет-магазинах на WooCommerce часто возникает ситуация, когда клиент оставляет заказ, но не завершает оплату. Такие заказы остаются в базе и со временем накапливаются, что замедляет работу сайта и усложняет администрирование. Автоматическое удаление неоплаченных заказов по таймауту решает эту проблему.
Диагностика проблемы
Чтобы убедиться, что именно неоплаченные заказы создают нагрузку, выполните следующие шаги:
- Зайдите в раздел WooCommerce > Заказы и отфильтруйте заказы по статусу
pendingилиon-hold. - Проверьте количество таких заказов и дату их создания.
- Если количество неоплаченных заказов большое и дата создания заказы более нескольких дней назад, это подтверждает необходимость очистки.
Пошаговое решение: удаление неоплаченных заказов через хук WordPress
Реализуем автоматическую очистку неоплаченных заказов с помощью планировщика задач WP-Cron и стандартных функций WooCommerce.
1. Добавляем функцию очистки заказов
В файл functions.php вашей дочерней темы или в кастомный плагин добавьте следующий код:
function wpkey_delete_unpaid_orders() {
$days_to_keep = 3; // Количество дней до удаления
$date = date('Y-m-d H:i:s', strtotime('-' . $days_to_keep . ' days'));
$args = array(
'limit' => -1,
'status' => array('pending', 'on-hold'),
'date_created' => '<' . $date,
'return' => 'ids',
);
$orders = wc_get_orders($args);
foreach ($orders as $order_id) {
wp_delete_post($order_id, true); // Полное удаление заказа
}
}
2. Добавляем событие Cron для периодического запуска
Добавьте регистрацию события при инициализации:
function wpkey_schedule_order_cleanup() {
if ( ! wp_next_scheduled( 'wpkey_cron_delete_unpaid_orders' ) ) {
wp_schedule_event( time(), 'daily', 'wpkey_cron_delete_unpaid_orders' );
}
}
add_action( 'wp', 'wpkey_schedule_order_cleanup' );
add_action( 'wpkey_cron_delete_unpaid_orders', 'wpkey_delete_unpaid_orders' );
Этот код настроит ежедневный запуск функции очистки.
Проверка результата после внедрения
- Создайте тестовый заказ со статусом
pendingи установите дату создания больше трёх дней назад (можно через базу или фильтр). - Запустите вручную функцию
wpkey_delete_unpaid_orders()через WP-CLIwp eval 'wpkey_delete_unpaid_orders();'или временно вызовите её из админки. - Проверьте раздел заказов — тестовый заказ должен исчезнуть.
- Через сутки система выполнит удаление автоматически.
Частые ошибки и способы их устранения
- Заказы не удаляются: проверьте, что хук
wpkey_cron_delete_unpaid_ordersзарегистрирован и cron-события работают (wp-cron может быть отключен на сервере). Для теста можно вызвать функцию вручную. - Удаляются нужные заказы: убедитесь, что в запросе фильтруются только статусы
pendingиon-hold, а также учитывается дата создания. - Производительность падает: если заказов слишком много, уменьшите лимит или разбейте удаление на куски с помощью пагинации.
Практические советы по безопасности и производительности
- Всегда делайте резервную копию базы перед внедрением автоматического удаления.
- Для больших магазинов используйте WP-CLI для запуска очистки вне Cron, чтобы снизить нагрузку.
- Проверяйте права пользователя, если добавляете интерактивные вызовы функции.
- Логи активности помогают отследить выполнение очистки и выявить ошибки.
Сравнение способов автоматизации удаления неоплаченных заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| WP-Cron + wp_delete_post | Простота, не требует плагинов | Зависит от WP-Cron, возможны задержки |
| Плагины автоматизации | Готовые решения, расширенные настройки | Дополнительная нагрузка, зависимость от плагина |
| WP-CLI скрипты | Высокая производительность, гибкость | Требуется доступ к серверу |