Подробная инструкция по внедрению динамического выбора города с выводом в URL

  1. Подготовьте список городов с падежами

    В начало index.php (или отдельный PHP-файл, который потом подключите через require_once) создайте массив городов с названиями в разных падежах:

    
    $cities = [
        'kzn' => [
            'name'   => 'Казань',
            'imen'   => 'Казань', // именительный
            'rodit'  => 'Казани', // родительный
            'dat'    => 'Казани', // дательный
            'vin'    => 'Казань', // винительный
            'tvorit' => 'Казанью',// творительный
            'predl'  => 'Казани', // предложный
        ],
        // ... другие города
    ];
            

    Совет: если городов много, храните массив в отдельном файле /local/include/cities.php и подключайте через require_once в начале index.php.

  2. Добавьте обработку города в URL в .htaccess

    Для поддержки адресов вида /kzn/, /msk/ и т.д., отредактируйте .htaccess в корне сайта (до правила /bitrix/urlrewrite.php) и добавьте строку:

    
    RewriteRule ^([a-z]{3})/?$ /index.php?CITY_CODE=$1 [L,QSA]
            

    Это правило передаст трехбуквенный алиас (например, kzn, msk, spb) как параметр CITY_CODE в index.php. Для городов с другим алиасом измените регулярку.

  3. Определите выбранный город в PHP-коде

    В самом начале index.php (до подключения header.php) напишите:

    
    $cityCode = $_GET['CITY_CODE'] ?? null;
    // Можно добавить автодетект по IP, куки или сессию
    
    if ($cityCode && isset($cities[$cityCode])) {
        $currentCity = $cities[$cityCode];
        // Запоминаем город в сессии или куки
        $_SESSION['USER_CITY'] = $currentCity['name'];
        setcookie('USER_CITY', $currentCity['name'], time() + 3600 * 24 * 30, '/');
    } else {
        // Город по умолчанию
        $currentCity = $cities['kzn'];
        $cityCode = 'kzn';
    }
            

    Если пользователь выбирает город через попап, сохраняйте его выбор и читайте значение из куки или сессии.

  4. Динамически подставляйте город в тайтл, description и контент

    После подключения header.php используйте:

    
    $APPLICATION->SetTitle('Разработка сайтов на Битриксе в ' . $currentCity['predl']);
    $APPLICATION->SetPageProperty('description', 'Создание сайтов на Битриксе в ' . $currentCity['rodit'] . ' — профессионально и под ключ.');
            

    Для вывода города в тексте сайта:

    
    <?php echo 'Разработка сайтов на Битриксе в ' . $currentCity['predl']; ?>
            

    Если используете в include-файле, добавьте global $currentCity, $cityCode; в начале файла.

  5. Используйте динамические изображения и контент под город

    Если хотите менять картинку или контент:

    
    <img src="/local/images/cities/<?= $cityCode ?>.jpg" alt="<?= $currentCity['imen'] ?>">
            

    Картинки должны быть заранее загружены в /local/images/cities/ и названы по коду города.

  6. Добавьте попап для ручного выбора города (опционально)

    Реализуйте попап (например, /local/include/city_popup.php) и JS, который отправляет выбранный город и делает редирект на нужный алиас:

    
    // После выбора города:
    window.location.href = '/' + selectedCityCode + '/';
            
  7. Проверьте работу на всех этапах
    • Откройте /, /kzn/, /msk/ — контент должен меняться.
    • Проверьте работу попапа и смену города.
    • Убедитесь, что в <title> и description подставляется правильный город.
    • Проверьте подстановку города в тексте и картинках.
    • Проверьте, что после смены города выбор сохраняется (куки/сессия).

Возможные улучшения

  • Автоматическое определение города по IP (через SypexGeo/SxGeo).
  • Централизованный контроллер (/local/tools/detect_city.php) для работы с выбором города.
  • Для SEO избегайте дублей страниц — при смене города делайте 301 редирект на нужный URL.
  • Если городов много, добавьте поиск и быстрый выбор в попапе.

Пример вывода города


<?php
echo 'Доставка осуществляется по ' . $currentCity['rodit'];
?>