Налаштування автовизначення міста користувача 1С-Бітрікс
Автовизначення міста потрібне, коли сайт працює в кількох регіонах: потрібно підставити правильне місто в шапці, показати актуальні ціни та наявність, запропонувати найближчий магазин. У Бітріксі це вирішується через вбудовані механізми геолокації або зовнішні геобази.
Вбудований модуль геолокації Бітрікса
Бітрікс постачається з модулем sale (інтернет-магазин), який включає геолокацію. Налаштування: Магазин → Налаштування → Геолокація.
Модуль використовує базу GeoIP (MaxMind GeoLite2 або платні версії). Файл бази підключається в налаштуваннях сайту. За IP користувача визначаються країна, регіон, місто.
Отримання міста програмно:
$ip = \Bitrix\Main\Context::getCurrent()->getRequest()->getRemoteAddress();
// Вбудований визначник Бітрікса
$location = \Bitrix\Sale\Location\GeoIp\Manager::getLocationByIp($ip, LANGUAGE_ID);
// $location['CITY_NAME'] — назва міста
// $location['REGION_NAME'] — назва регіону
// $location['COUNTRY_NAME'] — назва країни
Якщо потрібна лише країна та місто без прив'язки до модуля sale:
\Bitrix\Main\Loader::includeModule('sale');
$geo = \Bitrix\Sale\Location\GeoIp\Manager::getInfo($ip, 'uk');
Зберігання вибраного міста в сесії
Визначене (або вибране вручну) місто зберігаєте в сесії:
// Запис
$_SESSION['USER_CITY'] = [
'ID' => $cityId,
'NAME' => $cityName,
'CODE' => $cityCode,
];
// Читання в шаблоні
$currentCity = $_SESSION['USER_CITY'] ?? null;
Для авторизованих користувачів — додатково зберігаєте в профілі користувача через CUser::Update() з кастомним полем UF_CITY.
JavaScript-визначення через браузер
Якщо користувач дозволив доступ до геолокації — можна визначити точніше через Geolocation API браузера, а потім перетворити координати на місто (reverse geocoding):
navigator.geolocation.getCurrentPosition(async (pos) => {
const resp = await fetch('/local/ajax/detect-city.php', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
lat: pos.coords.latitude,
lng: pos.coords.longitude,
}),
});
const data = await resp.json();
if (data.city) showCityConfirmDialog(data.city);
});
Для reverse geocoding на стороні сервера використовуєте API Яндекс.Геокодера або DaData:
// Яндекс Геокодер
$url = "https://geocode-maps.yandex.ru/1.x/?apikey={$key}&format=json"
. "&geocode={$lng},{$lat}&kind=locality&results=1&lang=uk_UA";
$response = json_decode(file_get_contents($url), true);
$city = $response['response']['GeoObjectCollection']['featureMember'][0]
['GeoObject']['name'] ?? null;
Підтвердження міста користувачем
Автовизначення — це припущення, не факт. Завжди показуйте спливаючу плашку «Ваше місто — Київ?» з кнопками «Так, вірно» / «Вибрати інше». Без підтвердження в деяких сценаріях (особливо з VPN) місто буде визначено неправильно, і користувач побачить неактуальні дані.
Плашку показуєте при першому відвідуванні через перевірку $_SESSION['CITY_CONFIRMED']. Після підтвердження або вибору — ставите прапорець і більше не показуєте.
Зв'язок міста з розділами каталогу та цінами
Якщо у вас мультирегіональний сайт, місто пов'язується з:
- Сайтом Бітрікса (multisite) — різні домени для різних міст
- Розділами інфоблоку — ціни з властивостей із регіональними цінами
-
Ціновими групами
b_catalog_price_type— для кожного міста своя група цін
| Етап | Час |
|---|---|
| Налаштування GeoIP-бази | 1–2 год |
| Логіка визначення та зберігання міста | 3–4 год |
| Браузерна геолокація + reverse geocoding | 3–5 год |
| UI-плашка підтвердження міста | 2–3 год |
| Прив'язка до цін / контенту | 4–8 год |







