Диагностика проблемы: зачем и когда отключать редактирование адреса доставки
В 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);Этот код прерывает сохранение, если у пользователя уже есть заказы со статусом «обрабатывается» или «завершён».
Проверка результата после внедрения
- Оформите новый заказ с любым адресом доставки.
- Перейдите в личный кабинет – «Мои заказы» и откройте подробности заказа.
- Убедитесь, что кнопка «Изменить адрес доставки» отсутствует.
- Попробуйте вручную перейти по ссылке редактирования адреса доставки – доступ должен быть заблокирован или поля должны быть неактивны.
- Попытка сохранить новый адрес через форму должна завершиться ошибкой.
Частые ошибки и как их исправить
- Адрес все еще можно изменить через личный кабинет
Причина: не удалена кнопка редактирования или тема перезаписывает шаблоны. Решение: проверьте шаблонmyaccount/form-edit-address.phpв теме и отключите ссылку там. - Пользователь может изменить адрес через REST API или кастомные формы
Причина: не обработан хук сохранения адреса. Решение: добавьте проверку вwoocommerce_customer_save_address, как показано выше. - Ошибка при сохранении адреса появляется всегда
Причина: условие для проверки статуса заказа слишком жесткое или неверно реализовано. Проверьте, что условие срабатывает только если заказ существует и имеет нужный статус.
Практические советы по безопасности и производительности
- Не удаляйте полностью функционал редактирования, лучше просто скрывайте или делайте поля неактивными, чтобы избежать конфликтов с другими плагинами.
- Добавьте проверку nonce и права пользователя при блокировке сохранения адреса.
- Для производительности кешируйте ID последнего заказа, чтобы не выполнять запросы к базе на каждое сохранение.
Сравнение вариантов отключения редактирования адреса доставки
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Удаление ссылки на редактирование | Просто скрыть кнопку «Изменить адрес» | Легко реализуется, не ломает функционал | Пользователь может попытаться редактировать напрямую |
| Делаем поля неактивными | Добавление атрибута disabled для полей адреса | Пользователь видит адрес, но не может изменить | Зависит от темы и кастомных шаблонов |
| Блокировка сохранения через хук | Отмена сохранения при попытке изменения через сервер | Гарантированная защита, работает независимо от интерфейса | Может вызвать неудобства, если логика реализована некорректно |