Диагностика проблемы: зачем удалять отменённые заказы с возвратом средств
В стандартном WooCommerce отменённые заказы остаются в базе данных, занимая место и усложняя отчётность. При этом возврат средств часто выполняется вручную через платежные системы или админку. Автоматизация удаления таких заказов вместе с корректным возвратом средств позволяет упростить управление магазином и поддерживать базу в чистоте.
Как понять, что нужна автоматизация?
- Большое количество отменённых заказов, которые больше не нужны.
- Задержки и ошибки при возврате средств клиентам.
- Желание снизить нагрузку на базу данных и ускорить отчёты.
Пошаговое решение: автоматическое удаление отменённых заказов с возвратом средств
1. Создаём функцию для возврата средств по отменённому заказу
Обратите внимание: автоматический возврат средств работает только если платёжный шлюз поддерживает REST API или соответствующие функции WooCommerce.
function wc_refund_order_payment( $order_id ) {
$order = wc_get_order( $order_id );
if ( ! $order || $order->get_status() !== 'cancelled' ) {
return false;
}
// Проверяем, можно ли сделать возврат
if ( ! $order->get_payment_method() ) {
return false;
}
// Рассчитываем сумму для возврата
$refund_amount = $order->get_total();
if ( $refund_amount <= 0 ) {
return false;
}
// Создаём объект возврата
$refund = wc_create_refund( array(
'amount' => $refund_amount,
'reason' => 'Автоматический возврат для отменённого заказа',
'order_id' => $order_id,
'refund_payment' => true,
) );
return $refund;
}2. Добавляем хук, который запускает возврат и удаление заказа
Лучше запускать процесс по cron, чтобы не замедлять пользовательские запросы.
add_action( 'woocommerce_cancelled_order_cleanup', 'wc_auto_refund_and_delete_cancelled_orders' );
function wc_auto_refund_and_delete_cancelled_orders() {
$args = array(
'limit' => -1,
'status' => 'cancelled',
'return' => 'ids',
);
$orders = wc_get_orders( $args );
foreach ( $orders as $order_id ) {
$order = wc_get_order( $order_id );
// Автоматический возврат
$refund = wc_refund_order_payment( $order_id );
if ( $refund ) {
// Удаляем заказ после возврата
wp_trash_post( $order_id );
} else {
// Логируем ошибку, если возврат не выполнен
error_log('Ошибка возврата для заказа ID: ' . $order_id );
}
}
}
// Регистрируем событие cron на ежедневный запуск
if ( ! wp_next_scheduled( 'woocommerce_cancelled_order_cleanup' ) ) {
wp_schedule_event( time(), 'daily', 'woocommerce_cancelled_order_cleanup' );
}Проверка результата после внедрения
- Создайте тестовый заказ и отмените его через админку.
- Убедитесь, что по расписанию (ежедневно) запускается cron-задача — можно проверить в
wp-cron.phpили с помощью плагина WP Crontrol. - Проверьте, что заказ помечается как удалённый (перемещается в корзину).
- Проверьте историю возвратов в заказе — должен появиться автоматический возврат.
- Ошибки возврата смотрите в
error_logили в логах сервера.
Частые ошибки и как их исправить
- Возврат не создаётся: платежный шлюз не поддерживает автоматический возврат через API — проверьте документацию вашего шлюза.
- Функция wc_create_refund возвращает false: проверьте, что сумма возврата корректна и заказ оплачен.
- Удалённые заказы не исчезают из админки: они перемещаются в корзину, очистите корзину вручную или добавьте автоматическую очистку.
- Cron-задача не выполняется: убедитесь, что wp-cron включён или настройте системный cron для вызова
wp-cron.php.
Практические советы по безопасности и производительности
- Запускайте возврат и удаление только по cron, чтобы не блокировать пользовательские запросы.
- Логируйте ошибки возвратов в отдельный файл для быстрой диагностики.
- Ограничьте количество обрабатываемых заказов за один запуск, если их много, чтобы избежать таймаута.
- Перед удалением заказа убедитесь, что возврат средств прошёл успешно — это предотвращает потерю данных.
- Регулярно очищайте корзину заказов, чтобы база не раздувалась.
Сравнение вариантов автоматизации удаления отменённых заказов
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| Плагин для очистки заказов | Простота установки, интерфейс | Зависимость от стороннего кода, возможные конфликты | Advanced Order Cleaner |
| Код с автоматическим возвратом (описанный выше) | Контроль, кастомизация, без сторонних зависимостей | Необходимы знания, поддержка кода | Функции wc_create_refund и cron |
| Ручное удаление и возврат | Максимальный контроль | Трудозатратно, риск ошибок | Админка WooCommerce |