Как отменить заказ в WooCommerce после оплаты: практическое руководство

Диагностика проблемы с отменой заказа после оплаты в WooCommerce

Частая задача в WooCommerce — отменить заказ после того, как клиент уже оплатил покупку. Это может быть связано с ошибкой в заказе, отсутствием товара на складе или возвратом средств. Однако стандартный функционал WooCommerce не всегда позволяет удобно и корректно отменить оплаченный заказ, особенно если вы хотите автоматически изменить статус заказа и инициировать возврат средств.

Основные проблемы, с которыми сталкиваются разработчики и администраторы:

  • Заказ остается в статусе «в обработке» или «выполнен», что не отражает фактическое состояние отмены.
  • Отсутствие автоматического возврата платежа (refund) при смене статуса.
  • Ошибки в уведомлениях клиенту после отмены заказа.

Пошаговое решение: как отменить оплаченный заказ с возвратом средств

Шаг 1. Создание функции для отмены заказа с возвратом

Добавьте следующий код в файл functions.php вашей дочерней темы или в кастомный плагин, чтобы добавить возможность отменять заказ и автоматически создавать возврат средств.

function wc_cancel_order_and_refund( $order_id, $refund_amount = 0, $reason = '' ) {
    if ( ! $order_id ) {
        return new WP_Error( 'no_order', 'Order ID is required' );
    }

    $order = wc_get_order( $order_id );
    if ( ! $order ) {
        return new WP_Error( 'invalid_order', 'Order not found' );
    }

    // Проверяем, был ли заказ оплачен
    if ( ! $order->is_paid() ) {
        return new WP_Error( 'not_paid', 'Order is not paid' );
    }

    // Создаем возврат средств
    $refund = wc_create_refund( array(
        'amount'         => $refund_amount > 0 ? $refund_amount : $order->get_total(),
        'reason'         => $reason,
        'order_id'       => $order_id,
        'refund_payment' => true,
    ) );

    if ( is_wp_error( $refund ) ) {
        return $refund;
    }

    // Меняем статус заказа на отменён
    $order->update_status( 'cancelled', $reason ?: 'Order cancelled and refunded automatically' );

    return true;
}

Шаг 2. Вызов функции для конкретного заказа

Для отмены заказа с ID 123 и возвратом полной суммы вызовите функцию так:

$result = wc_cancel_order_and_refund( 123 );
if ( is_wp_error( $result ) ) {
    error_log( 'Ошибка отмены заказа: ' . $result->get_error_message() );
} else {
    error_log( 'Заказ успешно отменён и возращены средства' );
}

Шаг 3. Добавление кнопки отмены заказа в админку (опционально)

Чтобы ускорить процесс, можно добавить кнопку в список заказов для быстрого вызова отмены. Для этого используйте хук woocommerce_admin_order_actions_end и AJAX вызов.

Код для добавления кнопки:

add_action( 'woocommerce_admin_order_actions_end', function( $order ) {
    if ( $order->is_paid() && $order->get_status() !== 'cancelled' ) {
        $url = wp_nonce_url( admin_url( 'admin-ajax.php?action=cancel_paid_order&order_id=' . $order->get_id() ), 'cancel_paid_order' );
        echo '<a class="button tips cancel-paid-order" href="' . esc_url( $url ) . '" data-tip="Отменить и вернуть">×</a>';
    }
} );

add_action( 'wp_ajax_cancel_paid_order', function() {
    if ( ! current_user_can( 'manage_woocommerce' ) || ! check_admin_referer( 'cancel_paid_order' ) ) {
        wp_die( 'Нет доступа' );
    }
    $order_id = absint( $_GET['order_id'] );
    $result = wc_cancel_order_and_refund( $order_id, 0, 'Отмена через админку' );
    if ( is_wp_error( $result ) ) {
        wp_die( 'Ошибка: ' . $result->get_error_message() );
    }
    wp_redirect( wp_get_referer() );
    exit;
} );

Проверка результата после внедрения

  • Перейдите в админку WooCommerce > Заказы;
  • Откройте оплаченный заказ;
  • Вызовите функцию отмены через код или кнопку;
  • Проверьте, что заказ получил статус cancelled;
  • Убедитесь, что в разделе возвратов создан возврат средств с нужной суммой;
  • Проверьте уведомления клиенту — они должны содержать информацию об отмене и возврате.

Частые ошибки и как их исправить

  • Ошибка возврата средств: некоторые платежные шлюзы не поддерживают автоматический refund через WooCommerce API. В этом случае возврат нужно делать вручную в панели платежной системы.
  • Статус заказа не меняется: убедитесь, что используемый статус cancelled разрешён в настройках WooCommerce, и что нет конфликтов с плагинами, которые могут блокировать смену статуса.
  • Ошибка прав доступа: для вызова функции из админки пользователь должен иметь права manage_woocommerce. Проверьте роли и права пользователей.
  • Отсутствие уведомлений клиенту: убедитесь, что включены соответствующие email-уведомления в WooCommerce > Настройки > Email.

Практические советы по безопасности и производительности

  • Используйте nonce и проверку прав доступа при реализации отмены заказов из админки, чтобы предотвратить несанкционированные действия.
  • Если на сайте много заказов, избегайте частых автоматических возвратов через API платежных систем, чтобы не создавать нагрузку и не получать блокировки.
  • Для массовой отмены заказов используйте WP CLI или кастомные скрипты с лимитами по количеству заказов за один запуск.
  • Храните логи возвратов и отмен для аудита и быстрого выявления проблем.

Сравнение вариантов реализации отмены заказов

МетодПлюсыМинусы
Ручная отмена и возврат в админке WooCommerceПростота, не требует кодаТрудозатратно при большом количестве заказов
Автоматический refund через кастомный код (пример выше)Автоматизация, экономия времениЗависимость от API платежных шлюзов, возможны ошибки
Использование плагинов возврата (например, WooCommerce Refund and Exchange)Расширенный функционал, UI для управленияДополнительные расходы и нагрузка на сайт
WooCommerce: установка и настройка оплаты платежными системами без ошибок
25.05.2026
Как создать свой плагин для расширения функционала WordPress
14.11.2025
Как автоматически удалять неактивных пользователей в WordPress
25.03.2026
Как отменить заказ в WooCommerce после оплаты: практическое руководство
07.05.2026
Как использовать хуки для изменения вывода корзины WooCommerce
20.05.2026