WooCommerce: как изменить способ оплаты после оформления заказа

Диагностика проблемы: когда и зачем менять способ оплаты заказа

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

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

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

Пошаговое решение: добавляем возможность менять способ оплаты вручную через код

1. Добавление поля для изменения способа оплаты в админке заказа

Добавим в метабокс заказа селектор с доступными платежными методами, чтобы администратор мог сменить способ оплаты.

add_action('woocommerce_admin_order_data_after_billing_address', 'wporders_add_payment_method_selector', 10, 1);
function wporders_add_payment_method_selector($order) {
    $available_gateways = WC()->payment_gateways()->get_available_payment_gateways();
    $current_method = $order->get_payment_method();
    echo '<p class="form-field form-field-wide"><label for="_payment_method">Изменить способ оплаты:</label><select name="_payment_method" id="_payment_method">';
    foreach ($available_gateways as $gateway_id => $gateway) {
        $selected = selected($gateway_id, $current_method, false);
        echo "<option value=\"$gateway_id\" $selected>" . esc_html($gateway->get_title()) . "</option>";
    }
    echo '</select></p>';
}

2. Сохранение выбранного способа оплаты при обновлении заказа

Обработаем сохранение нового метода оплаты на стороне сервера.

add_action('woocommerce_process_shop_order_meta', 'wporders_save_payment_method_change', 45, 2);
function wporders_save_payment_method_change($order_id, $post) {
    if (isset($_POST['_payment_method'])) {
        $order = wc_get_order($order_id);
        $new_payment_method = sanitize_text_field($_POST['_payment_method']);
        $available_gateways = WC()->payment_gateways()->get_available_payment_gateways();
        if (array_key_exists($new_payment_method, $available_gateways)) {
            $order->set_payment_method($new_payment_method);
            $order->save();
        }
    }
}

3. Обновление метаданных и уведомление клиента

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

add_action('woocommerce_order_edit_status', 'wporders_notify_payment_method_change', 10, 1);
function wporders_notify_payment_method_change($order_id) {
    $order = wc_get_order($order_id);
    // Здесь можно добавить логику отправки письма, если способ оплаты изменился
    // Например:
    // wc()->mailer()->customer_invoice($order_id);
}

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

  • В админке откройте существующий заказ;
  • Найдите новое поле "Изменить способ оплаты" и выберите другой метод;
  • Сохраните заказ;
  • Проверьте, что способ оплаты изменился в деталях заказа;
  • Если включено уведомление, убедитесь, что клиент получил письмо с обновленной информацией;
  • Попробуйте пройти оплату повторно, если ваш способ оплаты поддерживает повторные платежи по заказу.

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

  • Не отображается список платежных методов: Убедитесь, что в момент вызова функции доступны платежные шлюзы (инициализирован WC()->payment_gateways()).
  • Изменение способа оплаты не сохраняется: Проверьте, что хук woocommerce_process_shop_order_meta срабатывает, а в форме присутствует поле с именем _payment_method.
  • Клиент не получает уведомление о смене оплаты: Добавьте вызов отправки письма вручную, например wc()->mailer()->customer_invoice($order_id);, или используйте сторонние плагины уведомлений.
  • Несоответствие статусов заказа после смены оплаты: Проверьте логику обработки статусов в вашем магазине и при необходимости обновите статус заказа вручную.

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

  • Всегда проверяйте права текущего пользователя на редактирование заказов перед сохранением изменений.
  • Санитизируйте входные данные — используйте sanitize_text_field или другие фильтры.
  • Не меняйте метод оплаты для заказов со статусом completed или processing без дополнительной проверки, чтобы не нарушить логику учета.
  • Если у вас большой магазин с сотнями заказов, кешируйте список доступных платежных методов вне циклов.

Сравнение вариантов реализации изменения способа оплаты

ВариантПлюсыМинусы
Добавление поля в админку и сохранение через хукПрямой контроль, без сторонних плагинов, гибкость настройкиТребует базовых знаний PHP, нет поддержки в клиентской части
Использование стороннего плагина (например, WooCommerce Order Edit)Простая установка, часто поддерживается обновлениямиМожет конфликтовать с другими плагинами, лишний вес сайта
Создание отдельного пользовательского интерфейса для смены оплатыУдобно для клиентов, автоматизация процессовСложнее в реализации, требуется дополнительная безопасность
Создание автоматических заказов в WordPress без WooCommerce
19.01.2026
Автоматическая синхронизация заказов между WordPress и внешними системами
30.03.2026
Как автоматически отключать оплату при повторных неудачных попытках в WooCommerce
03.05.2026
WooCommerce: автоматическое изменение адреса доставки после оформления заказа
04.07.2026
Как создать автоматический скрипт для обновления статусов заказов WooCommerce
09.02.2026