WooCommerce: как отключить возможность изменения адреса доставки после оформления заказа

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

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

Определяем, где именно нужно запретить изменения

Адрес доставки обычно отображается в разделе «Мои заказы» (My Account) на странице просмотра заказа. Это поле выводится в форме, которая использует стандартные хуки WooCommerce. Нужно заблокировать редактирование именно на этой странице, не затрагивая форму оформления заказа.

Пошаговое решение: запрет редактирования адреса доставки после оформления заказа

Для решения задачи достаточно использовать фильтр woocommerce_my_account_my_address_formatted_address и отключить возможность редактирования адреса доставки.

Однако проще и надежнее отключить кнопку «Изменить адрес доставки» и сделать поля неактивными, чтобы пользователь не мог менять данные.

1. Убираем кнопку «Изменить» для адреса доставки после оформления

add_filter('woocommerce_my_account_edit_address_url', function($url, $address_type) {
    if ($address_type === 'shipping') {
        // Отключаем ссылку на редактирование адреса доставки
        return '';
    }
    return $url;
}, 10, 2);

2. Делать поля адреса доставки неактивными при просмотре заказа

Если на сайте используется кастомная форма редактирования адреса доставки (например, с помощью хуков или шаблонов), можно добавить атрибут disabled для полей, чтобы запретить их редактирование.

add_filter('woocommerce_form_field_shipping_address_1', function($field, $key, $args, $value) {
    if (is_account_page()) {
        $field = str_replace('<input', '<input disabled', $field);
    }
    return $field;
}, 10, 4);

Аналогично нужно проделать для других полей адреса доставки (shipping_address_2, shipping_city и т. д.) в зависимости от используемой темы и шаблонов.

3. Программное блокирование изменения адреса доставки в базе

Если нужно гарантировать запрет на изменение на уровне данных, можно использовать хук woocommerce_customer_save_address, который вызывается при сохранении адресов:

add_action('woocommerce_customer_save_address', function($user_id, $load_address) {
    if ($load_address === 'shipping') {
        // Получаем ID последнего заказа пользователя
        $orders = wc_get_orders(array(
            'customer_id' => $user_id,
            'limit' => 1,
            'orderby' => 'date',
            'order' => 'DESC',
            'return' => 'ids',
        ));
        if (!empty($orders)) {
            $last_order = wc_get_order($orders[0]);
            if ($last_order && $last_order->has_status(array('processing', 'completed'))) {
                // Отменяем сохранение адреса доставки
                wc_add_notice('Редактирование адреса доставки после оформления заказа невозможно.', 'error');
                wp_die();
            }
        }
    }
}, 10, 2);

Этот код прерывает сохранение, если у пользователя уже есть заказы со статусом «обрабатывается» или «завершён».

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

  1. Оформите новый заказ с любым адресом доставки.
  2. Перейдите в личный кабинет – «Мои заказы» и откройте подробности заказа.
  3. Убедитесь, что кнопка «Изменить адрес доставки» отсутствует.
  4. Попробуйте вручную перейти по ссылке редактирования адреса доставки – доступ должен быть заблокирован или поля должны быть неактивны.
  5. Попытка сохранить новый адрес через форму должна завершиться ошибкой.

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

  • Адрес все еще можно изменить через личный кабинет
    Причина: не удалена кнопка редактирования или тема перезаписывает шаблоны. Решение: проверьте шаблон myaccount/form-edit-address.php в теме и отключите ссылку там.
  • Пользователь может изменить адрес через REST API или кастомные формы
    Причина: не обработан хук сохранения адреса. Решение: добавьте проверку в woocommerce_customer_save_address, как показано выше.
  • Ошибка при сохранении адреса появляется всегда
    Причина: условие для проверки статуса заказа слишком жесткое или неверно реализовано. Проверьте, что условие срабатывает только если заказ существует и имеет нужный статус.

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

  • Не удаляйте полностью функционал редактирования, лучше просто скрывайте или делайте поля неактивными, чтобы избежать конфликтов с другими плагинами.
  • Добавьте проверку nonce и права пользователя при блокировке сохранения адреса.
  • Для производительности кешируйте ID последнего заказа, чтобы не выполнять запросы к базе на каждое сохранение.

Сравнение вариантов отключения редактирования адреса доставки

МетодОписаниеПлюсыМинусы
Удаление ссылки на редактированиеПросто скрыть кнопку «Изменить адрес»Легко реализуется, не ломает функционалПользователь может попытаться редактировать напрямую
Делаем поля неактивнымиДобавление атрибута disabled для полей адресаПользователь видит адрес, но не может изменитьЗависит от темы и кастомных шаблонов
Блокировка сохранения через хукОтмена сохранения при попытке изменения через серверГарантированная защита, работает независимо от интерфейсаМожет вызвать неудобства, если логика реализована некорректно
Как изменить размер изображений в WooCommerce без поддержки темы
07.03.2026
Как создать свой плагин WordPress с нуля: пошаговое руководство
02.11.2025
Как создать автоматический отчет о проблемах безопасности WordPress
21.03.2026
WooCommerce: как настроить правила разграничения доступа к страницам и категориям товаров
05.06.2026
Как создать собственный тип записей в WordPress с примерами кода
05.01.2026