Проблема: накапливание неактивных заказов в WooCommerce
В интернет-магазинах на WooCommerce часто возникает ситуация, когда заказы со статусом «ожидает оплату» (pending) не закрываются и не удаляются автоматически. Это ведёт к разрастанию базы заказов, замедлению работы админки и усложнению аналитики. Особенно актуально для магазинов с высокой посещаемостью и большим количеством отказов от оплаты.
Диагностика проблемы
Чтобы проверить, есть ли такая проблема, зайдите в админку WooCommerce > Заказы и отфильтруйте заказы по статусу Ожидает оплаты. Если вы видите большое количество заказов с этим статусом, которым больше месяца, нужно автоматизировать их удаление.
Как проверить дату создания заказа и статус через код
function check_old_pending_orders() {
$args = [
'status' => 'pending',
'date_created' => '<' . ( new WC_DateTime() )->modify('-30 days')->format('Y-m-d H:i:s'),
'limit' => -1
];
$orders = wc_get_orders($args);
return count($orders);
}
// Выводим в лог количество старых заказов
error_log('Старых заказов pending: ' . check_old_pending_orders());Пошаговое решение: автоматизация удаления заказов старше 30 дней
Для удаления заказов старше 30 дней с статусом «ожидает оплату» используем кастомный PHP-код в functions.php темы или отдельном плагине. Код срабатывает по крону (wp_cron) раз в сутки.
1. Создаём функцию удаления заказов
function wpload_delete_old_pending_orders() {
$args = [
'status' => 'pending',
'date_created' => '<' . ( new WC_DateTime() )->modify('-30 days')->format('Y-m-d H:i:s'),
'limit' => -1
];
$orders = wc_get_orders($args);
foreach ( $orders as $order ) {
$order->delete(true); // true — удаление без возможности восстановления
}
}2. Регистрируем событие wp_cron для запуска раз в сутки
function wpload_schedule_pending_orders_cleanup() {
if ( ! wp_next_scheduled( 'wpload_pending_orders_cleanup_hook' ) ) {
wp_schedule_event(time(), 'daily', 'wpload_pending_orders_cleanup_hook');
}
}
add_action('wp', 'wpload_schedule_pending_orders_cleanup');
add_action('wpload_pending_orders_cleanup_hook', 'wpload_delete_old_pending_orders');3. Убираем крон при деактивации темы/плагина
function wpload_remove_pending_orders_cleanup_schedule() {
$timestamp = wp_next_scheduled('wpload_pending_orders_cleanup_hook');
if ($timestamp) {
wp_clear_scheduled_hook('wpload_pending_orders_cleanup_hook');
}
}
register_deactivation_hook(__FILE__, 'wpload_remove_pending_orders_cleanup_schedule');Проверка результата
- После добавления кода и прохождения суток проверьте в базе заказов наличие старых заказов со статусом «ожидает оплату».
- При необходимости запустите функцию вручную через WP-CLI или временно добавьте вызов
wpload_delete_old_pending_orders()в functions.php и обновите сайт. - Проверьте логи ошибок, чтобы убедиться, что нет фатальных ошибок.
Частые ошибки и как их исправить
- Крон не срабатывает: Проверьте, что в WordPress включён wp_cron (опция
DISABLE_WP_CRONне установлена в true). Для теста вызовите вручнуюdo_action('wpload_pending_orders_cleanup_hook');. - Функция удаления не работает: Убедитесь, что используете правильный метод
$order->delete(true);. Без параметра true — заказ только в корзину отправляется. - Удаляются не те заказы: Проверьте условие
date_created < '30 дней назад'и статусpending. Можно вывести в лог список ID удаляемых заказов. - Ошибка из-за версии WooCommerce: Используйте последние версии WooCommerce. Функция
wc_get_orders()и классWC_DateTimeдолжны поддерживаться.
Практические советы по безопасности и производительности
- Удаление заказов — необратимая операция. Рекомендуется перед внедрением сделать резервную копию базы.
- Если заказов очень много, можно удалять партиями для снижения нагрузки (например, по 50 штук за запуск).
- Для уменьшения нагрузки на сервер используйте WP-CLI скрипты для периодического запуска, если wp_cron не надёжно срабатывает.
- Добавьте логирование удалённых заказов в отдельный файл для аудита.
- Рассмотрите возможность использования плагина Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wpload.ru&utm_medium=article&utm_campaign=woocommerce-avtomaticheskoe-udalenie-zakazov-posle-30-dnej-bez-oplaty) для комплексной оптимизации WooCommerce.
Сравнение вариантов автоматического удаления заказов
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| Плагин (готовый) | Простота установки и настройки | Может быть тяжёлым, лишний код | Использовать для быстрого старта |
| Кастомный код с wp_cron | Лёгкий, под контролем разработчика | Нужны навыки разработки, контроль cron | Лучше для стабильных и безопасных решений |
| WP-CLI скрипты | Максимальная производительность и контроль | Требует SSH доступа и навыков | Для крупных магазинов с большой нагрузкой |