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

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

В стандартной функциональности WooCommerce покупатель может изменить адрес доставки, если заказ находится в статусе, позволяющем редактирование (например, «обрабатывается»). В некоторых бизнес-сценариях, особенно при физической доставке с логистическими партнерами, изменение адреса после оформления заказа недопустимо и приводит к ошибкам в доставке и дополнительным затратам.

Как понять, что у вас эта проблема?

  • Покупатели сообщают о путанице с адресами доставки.
  • Логистические службы получают неверные адреса после подтверждения заказа.
  • Вы заметили, что в аккаунтах клиентов в разделе заказов можно менять адрес доставки после оформления.

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

Реализуем запрет на изменение адреса доставки после статуса «в ожидании оплаты» или «оплачен». Сделаем это через блокировку полей адреса доставки в личном кабинете и на странице редактирования заказа в админке (если нужно).

1. Запрет изменения адреса доставки в личном кабинете

Добавьте следующий код в functions.php вашей темы или в отдельный плагин:

add_filter('woocommerce_customer_get_shipping', 'disable_shipping_address_edit', 10, 2);
function disable_shipping_address_edit($shipping, $customer) {
    if (!is_admin() && is_account_page()) {
        $order_ids = wc_get_orders(array(
            'customer' => get_current_user_id(),
            'limit' => 1,
            'orderby' => 'date',
            'order' => 'DESC',
        ));
        if (!empty($order_ids)) {
            $order = $order_ids[0];
            $status = $order->get_status();
            // Блокируем, если статус заказа не 'pending' или 'failed'
            if (!in_array($status, array('pending', 'failed'))) {
                // Возвращаем прежний адрес доставки без возможности изменения
                return $shipping;
            }
        }
    }
    return $shipping;
}

Этот фильтр не даёт изменить адрес доставки через форму личного кабинета, если есть оплаченный или в процессе заказа.

2. Запрет изменения адреса доставки при редактировании заказа в админке

Если вы хотите ограничить изменение адреса доставки и в админпанели WooCommerce, добавьте следующий код:

add_action('woocommerce_admin_order_data_after_shipping_address', 'disable_admin_shipping_address_edit', 10, 1);
function disable_admin_shipping_address_edit($order) {
    $status = $order->get_status();
    if (!in_array($status, array('pending', 'failed'))) {
        echo '<style>
            #shipping_address_1, #shipping_address_2, #shipping_city, #shipping_postcode, #shipping_country, #shipping_state {
                pointer-events: none !important;
                background-color: #eee !important;
            }
        </style>';
        echo '<p><em>Изменение адреса доставки запрещено для этого статуса заказа.</em></p>';
    }
}

Как проверить, что решение сработало

  • Создайте тестовый заказ с любым статусом, например «Ожидает оплаты» (pending).
  • В личном кабинете попробуйте отредактировать адрес доставки — поле должно быть доступно.
  • Измените статус заказа на «В обработке» (processing) или «Выполнен» (completed).
  • Попробуйте снова изменить адрес доставки в личном кабинете — поля должны быть заблокированы или недоступны для редактирования.
  • В админке откройте заказ и убедитесь, что поля адреса доставки заблокированы для редактирования при статусах, отличных от pending/failed.

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

  • Адрес всё равно можно изменить в личном кабинете
    Проверьте, что код добавлен корректно и активен. Убедитесь, что вы тестируете под учётной записью покупателя с заказом нужного статуса. Также проверьте, нет ли конфликтов с другими плагинами, которые могут перезаписывать поведение адреса доставки.
  • Поля в админке не блокируются
    Проверьте, что CSS применился — убедитесь, что селекторы полей соответствуют вашей версии WooCommerce. В новых версиях классы и id полей могут изменяться.
  • Клиенты жалуются, что нельзя изменить адрес, хотя заказ ещё не оплачен
    Проверьте условие статуса заказа в коде: статус для разблокировки должен быть только 'pending' и 'failed'. Можно дополнительно проверить другие статусы, если у вас кастомные.

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

  • Не используйте JavaScript для блокировки полей — это легко обойти. Лучше блокировать на уровне PHP и формы.
  • Минимизируйте количество запросов в базе при проверке статуса заказов, кэшируйте данные, если возможна нагрузка.
  • Если у вас большой магазин, где у пользователя много заказов, уточните в коде, какой конкретно заказ блокирует возможность изменения (например, последний или конкретный по условию).
  • Регулярно проверяйте совместимость кода с обновлениями WooCommerce и WordPress.

Сравнение методов блокировки адреса доставки

МетодГде применяетсяПлюсыМинусы
PHP-фильтр и блокировка формыЛичный кабинет, фронтендНадежная блокировка, трудно обойтиНужно учитывать все места редактирования
CSS и JS-блокировкаАдминкаПростая реализацияМожно отключить в браузере, не надежно
Плагины с расширенной логикойФронтенд и админкаПолный контроль, дополнительные опцииНагрузка, стоимость, возможные конфликты

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Как отключить Emoji в WordPress для ускорения сайта
15.02.2026
Как удалить неиспользуемые виджеты WordPress: практическое руководство
28.12.2025
Как автоматически удалять старые черновики в WordPress
11.04.2026
Как добавить и сохранить кастомное поле пользователя при регистрации в WordPress
26.02.2026
Как использовать фильтр pre_get_posts для изменения запросов WordPress
06.02.2026
×
WordPress
прокачай свой сайт!

-20% на премиум темы и плагины

Сделай апгрейд сайта ⋙