Диагностика проблемы с неоплаченными заказами в WooCommerce
В интернет-магазинах на WooCommerce часто накапливаются неоплаченные заказы, которые занимают ресурсы базы данных и усложняют управление заказами. Если не очищать такие заказы, админка становится менее удобной, а отчеты и аналитика – менее точными. Задача — автоматическое удаление заказов со статусом pending или failed, которые не оплачены и старше определенного срока.
Типичные симптомы
- В админке WooCommerce много заказов со статусом «Ожидает оплаты» или «Ошибка»;
- Отчеты по заказам показывают завышенные цифры;
- Увеличивается нагрузка на базу данных;
- Ручная очистка заказов занимает много времени.
Пошаговое решение: как автоматически удалять неоплаченные заказы
Реализуем автоматическую очистку с помощью WP-Cron, который будет запускаться раз в сутки и удалять неоплаченные заказы старше 3 дней. В коде ниже показано, как создать собственное событие и обработчик.
function wpsource_schedule_cleanup() {
if ( ! wp_next_scheduled( 'wpsource_cleanup_unpaid_orders' ) ) {
wp_schedule_event( time(), 'daily', 'wpsource_cleanup_unpaid_orders' );
}
}
add_action( 'wp', 'wpsource_schedule_cleanup' );
function wpsource_cleanup_unpaid_orders_callback() {
global $wpdb;
$days = 3; // количество дней, по истечении которых заказы удаляются
$date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days} days" ) );
// Получаем ID заказов со статусом pending и failed старше даты
$order_ids = $wpdb->get_col( $wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'shop_order' AND post_status IN ('wc-pending', 'wc-failed') AND post_date < %s",
$date_threshold
) );
if ( ! empty( $order_ids ) ) {
foreach ( $order_ids as $order_id ) {
wp_delete_post( $order_id, true ); // принудительное удаление
}
}
}
add_action( 'wpsource_cleanup_unpaid_orders', 'wpsource_cleanup_unpaid_orders_callback' );
Этот код нужно добавить в файл functions.php вашей темы или в отдельный плагин. Он создаёт задачу, которая запускается ежедневно и удаляет все заказы с указанными статусами, которые старше 3 дней.
Как проверить, что удаление работает
- Создайте тестовый заказ с статусом
pending. - Измените его дату создания на дату более 3 дней назад через базу данных или плагин для редактирования заказов.
- Запустите вручную крон-задачу, используя плагин WP Crontrol или WP-CLI:
wp cron event run wpsource_cleanup_unpaid_orders. - Проверьте, что заказ удалён из админки WooCommerce и из базы данных (таблица
wp_posts).
Частые ошибки и их исправление
- Крон-задача не запускается: Убедитесь, что на сайте включён WP-Cron, и проверяйте логи ошибок. Иногда необходимо настроить реальный системный cron для запуска
wp-cron.php. - Заказы не удаляются: Проверьте правильность статусов заказов. WooCommerce сохраняет статусы с префиксом
wc-, например,wc-pending, а не простоpending. - Удаление не полное: Используйте параметр
trueвwp_delete_post, чтобы обойти корзину и сразу удалить записи. - Ошибка прав доступа: Убедитесь, что код выполняется с достаточными правами, и что пользователь, запускающий WP-Cron, имеет доступ к базе данных.
Практические советы по безопасности и производительности
- Перед автоматическим удалением рекомендуется делать резервные копии базы данных.
- Не задавайте слишком короткий срок удаления — 3 дня достаточно для большинства магазинов, чтобы покупатель имел возможность оплатить.
- Если заказов много, можно реализовать пакетную обработку с лимитом, чтобы избежать таймаутов.
- Логируйте удалённые заказы в отдельный файл для аудита и диагностики.
- Используйте WP-CLI для запуска крон-задач в продакшене, чтобы повысить надежность.
Сравнение методов удаления неоплаченных заказов
| Метод | Плюсы | Минусы |
|---|---|---|
| Плагин очистки заказов | Простота установки, готовые настройки, поддержка | Может влиять на производительность, лишние зависимости |
| Собственный WP-Cron скрипт (как в статье) | Контроль над процессом, легковесность, нет лишних плагинов | Требует навыков, возможны ошибки в коде, нужно тестировать |
| Ручная очистка через админку | Простота, контроль вручную | Трудоемко, неудобно при большом количестве заказов |