Замена meta title description

Динамическая замена мета-тегов в WordPress. Как менять Title и Description для разных городов и трафика

23.01.26
29.01.26

Динамическая замена мета-тегов в WordPress позволяет автоматически менять заголовки и описания страниц в зависимости от геолокации, источника перехода, устройства или времени суток. Это мощный инструмент для повышения релевантности страницы в глазах пользователей и поисковых систем, что ведет к увеличению CTR и конверсии. В этой статье разберем, как реализовать такой функционал с помощью кода и плагинов.

Зачем это нужно?

Простыми словами, динамические метатеги — это когда один URL может показать поисковику и пользователю разные title и description. Зачем это делать?

  1. Повышение релевантности для локального SEO. Пользователь из Москвы в поиске видит заголовок «Купить окна в Москве», а из Казани — «Купить окна в Казани». Шансы на клик резко возрастают.
  2. Учет источника трафика. Человек, пришедший из соцсети VK, может увидеть более неформальное описание с упоминанием сообщества, чем пользователь из Google.
  3. Адаптация под устройство. Можно акцентировать «мобильность» услуги в описании для смартфонов.
  4. Борьба за клик в топе. Динамический title позволяет тестировать и подставлять самые кликабельные варианты для разных аудиторий.

Основной метод это фильтры WordPress

Ядро WordPress предоставляет мощные фильтры wp_title и pre_get_document_title (для заголовка) и wp_head (для вывода произвольного мета-тега description т.к. в WordPress нет формирования этого мета-тега). Работать будем через них, добавляя код в файл functions.php вашей дочерней темы.

Меняем метатеги по геолокации (название города)

Самый востребованный кейс. Для определения города по IP можно использовать бесплатные API, например, Sypex Geo или ipinfo.io.

// В functions.php темы
add_filter( 'pre_get_document_title', 'change_meta_by_city', 20 );
add_filter( 'wp_head', 'change_description_by_city', 1 );

function get_user_city_by_ip() {
    $user_ip = $_SERVER['REMOTE_ADDR']; // Получаем IP пользователя
    // Используем API Sypex Geo
    $api_url = "http://api.sypexgeo.net/json/" . $user_ip;
    $response = wp_remote_get( $api_url );

    if ( is_array( $response ) && ! is_wp_error( $response ) ) {
        $data = json_decode( $response['body'], true );
        // Возвращаем название города на русском, если есть
        return $data['city']['name_ru'] ?? null;
    }
    return null;
}

function change_meta_by_city( $title ) {
    // Проверяем, что мы на главной или странице услуги (можно настроить под любые условия)
    if ( is_front_page() || is_page( 'okna' ) ) {
        $city = get_user_city_by_ip();

        if ( $city ) {
            // Динамически меняем заголовок
            $new_title = "Купить пластиковые окна в {$city} | 'Название вашей компании'";
            return $new_title;
        }
    }
    return $title;
}

function change_description_by_city() {
    if ( is_front_page() || is_page( 'okna' ) ) {
        $city = get_user_city_by_ip();

        if ( $city ) {
            $new_description = "✅ Установка окон и балконов в {$city}. ⭐ Гарантия 10 лет! ✅ Бесплатный замер. ☎ Звоните!";
            echo '<meta name="description" content="' . esc_attr( $new_description ) . '" />' . "\n";
        }
    }
}

Важное замечание: Определение города по IP — метод не идеально точный, но для SEO-задач его обычно достаточно. Чтобы не нагружать API при каждом заходе, стоит кешировать результат на 24 часа, например, через Transient API WordPress. Например, вот так:

function get_user_city_cached() {
    $user_ip = $_SERVER['REMOTE_ADDR'];
    $transient_key = 'user_city_' . md5( $user_ip );
    $city = get_transient( $transient_key ); // Пробуем взять из кеша

    if ( false === $city ) {
        // Если в кеше нет, идем в API
        $api_url = "http://api.sypexgeo.net/json/" . $user_ip;
        $response = wp_remote_get( $api_url, array( 'timeout' => 2 ) );

        if ( ! is_wp_error( $response ) && $response['response']['code'] == 200 ) {
            $data = json_decode( $response['body'], true );
            $city = $data['city'] ?? null;
            // Сохраняем результат в кеш на 24 часа
            set_transient( $transient_key, $city, DAY_IN_SECONDS );
        } else {
            $city = null; // Или город по умолчанию
            set_transient( $transient_key, $city, HOUR_IN_SECONDS ); // Кешируем ошибку ненадолго
        }
    }
    return $city;
}

Кроме того, во избежание задержек и сбоев при API-запросах к стороннем ресурсам вы можете скачать базу IP на свой сервер. На январь 2026 года такая БД весит 21МБ. При этом, конечно же вам придется самостоятельно беспокоиться о её актуальности.

Меняем метатеги для трафика из социальных сетей

Можно стимулировать переходы из соцсетей, добавляя в метаописание призывы к действию, релевантные конкретной платформе.

add_filter( 'wp_head', 'change_meta_for_social_traffic' );

function change_meta_for_social_traffic() {
    $referrer = $_SERVER['HTTP_REFERER'] ?? '';

    // Проверяем, пришел ли пользователь с популярных соцсетей
    if ( strpos( $referrer, 'vk.com' ) !== false ) {
        echo '<meta name="description" content="Читайте наш паблик ВКонтакте! Акции, закрытые скидки и полезные советы про окна. Подписывайтесь!" />' . "\n";
    } elseif ( strpos( $referrer, 'facebook.com' ) !== false || strpos( $referrer, 'instagram.com' ) !== false ) {
        echo '<meta name="description" content="▶ Like &amp; Share! Акция для подписчиков: скидка 15% на остекление балкона. Фото работ в нашем профиле." />' . "\n";
    }
}

Альтернатива без кода. Используем Плагины

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

  1. All in One SEO + аддоны. Плагин-монстр. Для наших задач потребуется установка дополнительного аддона для геолокационного SEO. Позволяет через интерфейс прописать шаблоны метатегов для разных городов, стран.
  2. Rank Math SEO. Более современный и гибкий конкурент. Имеет встроенную поддержку макросов и условий. Например, можно в редакторе для страницы прописать шаблон описания вида Купить окна в %geo_city%, и плагин сам подставит город (используя свою или внешнюю гео-базу).
  3. WP Meta SEO. Более легковесный плагин, который также позволяет управлять выводами через шорткоды и условия.

Мой вердикт: Для разовых и простых задач (город в title) достаточно чистого кода. Для масштабных проектов с сотнями региональных страниц и сложными правилами лучше использовать Rank Math — он экономит массу времени.

Технические нюансы и подводные камни

  1. Кеширование — главный враг динамики. Плагины кеширования (WP Rocket, W3 Total Cache) будут сохранять старую версию страницы (например, от пользователя из Рязани). Решение: использовать фрагментное кеширование (через Transient API).
  2. Не переусердствуйте с Cloaking. Подмена контента только для поисковых роботов считается черным SEO и может привести к санкциям. Ваш код должен менять метатеги для всех пользователей, включая роботов.
  3. Производительность. Каждый вызов внешнего API (геолокация) замедляет загрузку. Всегда используйте кеш и ставьте таймауты на запросы. Ну или скачивайте локальную Гео БД и поддерживайте её актуальность.
  4. Резервный вариант. В коде всегда должен быть предусмотрен вариант по умолчанию на случай, если API не ответил или город не определился. Придумайте какой-то нейтральный title. Например, «Купить пластиковые окна в России | ‘Название вашей компании'»

Итог

Динамическая замена мета-тегов — это практичный, рабочий инструмент, который перестал быть экзотикой. Начните с простого, добавьте в заголовок главной страницы название города для пользователей из двух-трех крупных регионов вашего присутствия. Используйте код из этой статьи и обязательно протестируйте работу с включенным кешированием. Результат в виде роста конверсии с органического поиска не заставит себя ждать.