Геолокация по IP в Битрикс D7: GeoIp\Manager и заказ
Зачем нужен GeoIp в D7
Ядро умеет определять страну и город посетителя по IP — это используется в оформлении заказа и доступно разработчикам через Bitrix\Main\Service\GeoIp. Настройка обработчиков: Настройки → Геолокация (MaxMind, Sypex Geo, расширение GeoIP).
Базовый сценарий
use Bitrix\Main\Service\GeoIp;
$clientIp = GeoIp\Manager::getRealIp();
$result = GeoIp\Manager::getDataResult($clientIp, 'ru');
if ($result && $result->isSuccess()) {
$geo = $result->getGeoData();
$city = $geo->cityName;
$region = $geo->regionName;
}Третий аргумент getDataResult — список нужных полей. Если обработчик не отдаёт, например, zipCode, менеджер переключится на другой доступный handler.
Чтобы реже ходить во внешние API, перед запросом можно включить cookie:
GeoIp\Manager::useCookieToStoreInfo(true);
$result = GeoIp\Manager::getDataResult($clientIp, 'ru', ['cityName', 'countryCode']);Учитывайте лимит размера cookie (~4 КБ) — для тяжёлых структур лучше кешировать в Redis или сессии.
Свой обработчик
Добавление через событие main::onMainGeoIpHandlersBuildList — класс-наследник GeoIp\Base с методами getTitle, getDescription, getData. Примеры смотрите в bitrix/modules/main/lib/service/geoip/.
Связка с Sale
Для подстановки местоположения в заказ:
\Bitrix\Sale\Location\GeoIp::getLocationId($ip, $lang)getLocationCode()— символьный кодgetZipCode()— индекс, если handler его вернул
На старых версиях sale проверьте баг с Manager::getData() (актуально для 17.0.17) — обновление модуля sale обычно решает проблему в sale.order.ajax.
Итог
Для витрины: getRealIp() + getDataResult(). Для checkout — классы Sale\Location\GeoIp. Ключи Sypex/MaxMind храните в настройках сайта, не в коде репозитория.
Не хотите копаться сами?
Починю за 1-3 дня. Без предоплаты — оплата по результату.
15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии