Yandex Metrika
sanches.free 2 просмотра

Геолокация по 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 дней гарантии