Диагностика проблемы: почему важно запретить изменение адреса доставки
В стандартном WooCommerce покупатель может изменить адрес доставки даже после оформления заказа, что приводит к ошибкам в логистике и дополнительным затратам для магазина. Особенно критично это для магазинов с доставкой курьером или в регионы с ограниченной логистикой.
Чтобы предотвратить такие ситуации, необходимо запретить изменение адреса доставки после оформления заказа.
Как проверить, разрешено ли изменение адреса доставки
- Авторизуйтесь в аккаунте пользователя.
- Перейдите в «Мои заказы» (My Account > Orders).
- Откройте детали любого заказа.
- Проверьте, доступна ли кнопка «Редактировать адрес доставки» или возможность изменения полей адреса.
Если изменение возможно, значит, стандартного ограничения нет.
Пошаговое решение: запрет изменения адреса доставки после оформления заказа
1. Запрет редактирования адреса доставки на странице заказа
Добавим код, который скроет форму редактирования адреса доставки в личном кабинете WooCommerce после оформления заказа.
add_filter('woocommerce_my_account_edit_address_enabled', function($enabled, $load_address) {
if ($load_address === 'shipping') {
// Проверяем, есть ли заказы с этим адресом
$user_id = get_current_user_id();
$orders = wc_get_orders(array(
'customer_id' => $user_id,
'limit' => 1,
'orderby' => 'date',
'order' => 'DESC',
));
if (!empty($orders)) {
// Если есть хотя бы один заказ, отключаем редактирование
return false;
}
}
return $enabled;
}, 10, 2);Этот фильтр отключает возможность редактирования адреса доставки, если у пользователя есть хотя бы один заказ.
2. Запрет изменения адреса доставки при редактировании заказа в админке
Чтобы защитить данные от изменения администратора или менеджера, можно добавить проверку и блокировку изменений адреса доставки в админке:
add_action('woocommerce_before_order_object_save', function($order) {
if (!$order->get_id()) {
return; // Новый заказ
}
$original_order = wc_get_order($order->get_id());
if (!$original_order) {
return;
}
// Сравниваем адреса доставки
if ($order->get_shipping_address_1() !== $original_order->get_shipping_address_1() ||
$order->get_shipping_city() !== $original_order->get_shipping_city() ||
$order->get_shipping_postcode() !== $original_order->get_shipping_postcode() ||
$order->get_shipping_country() !== $original_order->get_shipping_country() ||
$order->get_shipping_state() !== $original_order->get_shipping_state()) {
// Возвращаем старый адрес
$order->set_shipping_address_1($original_order->get_shipping_address_1());
$order->set_shipping_city($original_order->get_shipping_city());
$order->set_shipping_postcode($original_order->get_shipping_postcode());
$order->set_shipping_country($original_order->get_shipping_country());
$order->set_shipping_state($original_order->get_shipping_state());
// Можно добавить сообщение в админку
wc_add_notice('Изменение адреса доставки после оформления заказа запрещено.', 'error');
}
});Проверка результата после внедрения
- Авторизуйтесь под пользователем с оформленными заказами и проверьте, что форма редактирования адреса доставки недоступна или заблокирована.
- В панели администратора попробуйте изменить адрес доставки существующего заказа — изменения должны не сохраниться.
- Оформите новый заказ с новым пользователем — для него редактирование адреса доставки должно быть доступно (если нужно).
Частые ошибки и как их исправить
- Редактирование адреса всё ещё доступно: Проверьте правильность добавления кода, очистите кеш сайта и браузера.
- Код блокирует редактирование для всех пользователей, даже без заказов: Убедитесь, что условие проверки заказов корректно и возвращает false только при наличии заказов.
- Сообщение об ошибке в админке не отображается: В WooCommerce для вывода ошибок в админке используйте
add_action('admin_notices', ...)вместоwc_add_notice.
Практические советы по безопасности и производительности
- Оборачивайте кастомный код в дочерней теме или в собственном плагине, чтобы избежать потери при обновлениях.
- Используйте
wc_get_ordersс параметромlimit, чтобы не нагружать базу лишними запросами. - Тестируйте изменения на staging-сайте перед внедрением на продакшн.
Сравнение способов запрета изменения адреса доставки
| Метод | Преимущества | Недостатки |
|---|---|---|
| Отключение редактирования в личном кабинете (фильтр) | Простая реализация, блокирует пользовательский интерфейс | Не защищает от изменения в админке |
| Блокировка изменений в админке (хук сохранения заказа) | Защищает от изменений со стороны администратора | Сложнее в реализации, требует тестирования |
| Использование плагинов безопасности/редактирования заказов | Готовые решения с поддержкой и интерфейсом | Может влиять на производительность, лицензии |