Динамическая замена мета-тегов в WordPress позволяет автоматически менять заголовки и описания страниц в зависимости от геолокации, источника перехода, устройства или времени суток. Это мощный инструмент для повышения релевантности страницы в глазах пользователей и поисковых систем, что ведет к увеличению CTR и конверсии. В этой статье разберем, как реализовать такой функционал с помощью кода и плагинов.
Зачем это нужно?
Простыми словами, динамические метатеги — это когда один URL может показать поисковику и пользователю разные title и description. Зачем это делать?
- Повышение релевантности для локального SEO. Пользователь из Москвы в поиске видит заголовок «Купить окна в Москве», а из Казани — «Купить окна в Казани». Шансы на клик резко возрастают.
- Учет источника трафика. Человек, пришедший из соцсети VK, может увидеть более неформальное описание с упоминанием сообщества, чем пользователь из Google.
- Адаптация под устройство. Можно акцентировать «мобильность» услуги в описании для смартфонов.
- Борьба за клик в топе. Динамический
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 & Share! Акция для подписчиков: скидка 15% на остекление балкона. Фото работ в нашем профиле." />' . "\n";
}
}
Альтернатива без кода. Используем Плагины
Если не хотите копаться в коде, обратите внимание на эти плагины. Они дают гибкость, но добавляют нагрузку.
- All in One SEO + аддоны. Плагин-монстр. Для наших задач потребуется установка дополнительного аддона для геолокационного SEO. Позволяет через интерфейс прописать шаблоны метатегов для разных городов, стран.
- Rank Math SEO. Более современный и гибкий конкурент. Имеет встроенную поддержку макросов и условий. Например, можно в редакторе для страницы прописать шаблон описания вида
Купить окна в %geo_city%, и плагин сам подставит город (используя свою или внешнюю гео-базу). - WP Meta SEO. Более легковесный плагин, который также позволяет управлять выводами через шорткоды и условия.
Мой вердикт: Для разовых и простых задач (город в title) достаточно чистого кода. Для масштабных проектов с сотнями региональных страниц и сложными правилами лучше использовать Rank Math — он экономит массу времени.
Технические нюансы и подводные камни
- Кеширование — главный враг динамики. Плагины кеширования (WP Rocket, W3 Total Cache) будут сохранять старую версию страницы (например, от пользователя из Рязани). Решение: использовать фрагментное кеширование (через Transient API).
- Не переусердствуйте с Cloaking. Подмена контента только для поисковых роботов считается черным SEO и может привести к санкциям. Ваш код должен менять метатеги для всех пользователей, включая роботов.
- Производительность. Каждый вызов внешнего API (геолокация) замедляет загрузку. Всегда используйте кеш и ставьте таймауты на запросы. Ну или скачивайте локальную Гео БД и поддерживайте её актуальность.
- Резервный вариант. В коде всегда должен быть предусмотрен вариант по умолчанию на случай, если API не ответил или город не определился. Придумайте какой-то нейтральный title. Например, «Купить пластиковые окна в России | ‘Название вашей компании'»
Итог
Динамическая замена мета-тегов — это практичный, рабочий инструмент, который перестал быть экзотикой. Начните с простого, добавьте в заголовок главной страницы название города для пользователей из двух-трех крупных регионов вашего присутствия. Используйте код из этой статьи и обязательно протестируйте работу с включенным кешированием. Результат в виде роста конверсии с органического поиска не заставит себя ждать.