Почему важно автоматически удалять заказы с отменённой оплатой
В WooCommerce при отмене оплаты заказ остаётся в базе, что может привести к захламлению базы данных и искажению статистики продаж. Особенно критично для магазинов с большим количеством неоплаченных заказов. Автоматическое удаление таких заказов помогает поддерживать чистоту базы и облегчает управление заказами.
Диагностика проблемы: как понять, что заказы с отменённой оплатой не удаляются
Чтобы проверить, есть ли в базе заказы с отменённой оплатой:
- В админке WooCommerce перейдите в Заказы.
- Отфильтруйте заказы по статусу
cancelledилиfailed. - Обратите внимание на количество таких заказов и дату их создания.
Если таких заказов много и они не удаляются автоматически, пора реализовать скрипт для удаления.
Пошаговое решение: автоматическое удаление заказов с отменённой оплатой через cron
1. Добавляем функцию для удаления заказов с нужным статусом
function wplist_delete_cancelled_orders() {
$args = [
'status' => ['failed', 'cancelled'],
'limit' => -1,
'date_created' => '<' . ( time() - DAY_IN_SECONDS * 1 ), // старше 1 дня
'return' => 'ids',
];
$orders = wc_get_orders( $args );
foreach ( $orders as $order_id ) {
wp_delete_post( $order_id, true );
}
}2. Создаём WP-Cron задачу для регулярного запуска
if ( ! wp_next_scheduled( 'wplist_delete_cancelled_orders_hook' ) ) {
wp_schedule_event( time(), 'daily', 'wplist_delete_cancelled_orders_hook' );
}
add_action( 'wplist_delete_cancelled_orders_hook', 'wplist_delete_cancelled_orders' );3. Добавляем код в файл functions.php активной темы или создаём небольшой кастомный плагин
Рекомендуется использовать плагин, чтобы избежать потери изменений при обновлении темы.
Проверка результата после внедрения
- Создайте тестовый заказ с оплатой, затем отмените оплату или пометьте заказ статусом
cancelledилиfailed. - Подождите 24 часа (или временно измените параметр
date_createdна меньшее значение для теста). - Запустите вручную wp-cron, например, через плагин WP Crontrol или через браузер, перейдя по
https://example.com/wp-cron.php?doing_wp_cron. - Проверьте, удалён ли заказ из админки WooCommerce.
Частые ошибки и как их исправить
- Заказы не удаляются: проверьте, запланировано ли событие wp-cron (используйте WP Crontrol или аналогичные инструменты).
- Удаляются не те заказы: убедитесь, что в фильтре
'status'только нужные статусы (failed,cancelled). - Удаление происходит слишком рано: параметр
date_createdконтролирует возраст заказа. Не ставьте слишком маленькое значение, чтобы не удалять заказы, по которым ещё могут быть платежи. - Проблемы с правами: функция
wp_delete_post( $order_id, true )требует прав администратора, убедитесь, что код запускается с достаточными правами.
Практические советы по безопасности и производительности
- Не удаляйте заказы моментально — оставляйте запас по времени (например, 24 часа), чтобы избежать удаления заказов с задержкой платежей.
- Используйте
return => 'ids'вwc_get_ordersдля оптимизации памяти. - Для крупных магазинов с тысячами заказов разбейте удаление на части, чтобы избежать таймаутов, например, удаляйте по 100 заказов за один запуск.
- Резервное копирование базы перед автоматическим удалением — обязательно.
- Проверяйте логи сервера и ошибок WordPress после внедрения для выявления сбоев.
Сравнение вариантов реализации удаления заказов
| Вариант | Плюсы | Минусы |
|---|---|---|
| WP-Cron с кастомной функцией (код) | Гибкость, контроль, бесплатно | Требует знаний PHP, возможны таймауты при большом объёме |
| Плагины очистки (Clearfy, другие) | Простота установки, готовый функционал | Могут быть избыточными, ограниченная настройка |
| Ручное удаление через админку | Простота, без кода | Неэффективно при большом количестве заказов |