Клиенту нужно было настроить hreflang на масштабе для сети из 7 отдельных сайтов WordPress на разных доменах (не multisite). Язык один (English), регионы разные: en-US, en-CA, en-GB, en-NZ, en-SG, en-AE, en-ZA + x-default.
На каждом сайте — до ~1 500 страниц, контент регулярно пополняется.
Основная сложность: страницы есть не на всех доменах одновременно. Если выводить “статичный” набор hreflang для каждой страницы, он быстро начинает ссылаться на 404/редиректы, появляются ошибки валидаторов и “сломанные” кластеры с отсутствующими обратными ссылками (return tags).
Цель проекта: настроить корректный hreflang в <head> без ручной привязки страниц, чтобы система оставалась стабильной при добавлении новых страниц и при работе кэша/CDN.
Сделал лёгкое кастомное решение на WordPress в виде отдельного плагина, которое автоматизирует hreflang для страниц по шаблону /store/{slug}/.
Что реализовано:
Настроена строгая карта домен → locale: en-US, en-CA, en-GB, en-NZ, en-SG, en-AE, en-ZA и x-default (fallback на основной домен).
Важный нюанс: для основного домена выводится en-US и отдельно x-default (как fallback).
Главный принцип: hreflang выводится только для тех доменов, где страница реально существует (HTTP 200) — без “угадывания” и без ссылок на 404/редиректы.
Как определялось “существует ли slug на другом домене”:
Вместо медленных кросс-доменных проверок при каждом просмотре страницы, использовал store-sitemap каждого сайта как источник правды.
Из sitemap собирается список доступных /store/{slug}/ и кэшируется по доменам.
Добавил инструмент для безопасного обновления кэша (sync) по кнопке — можно запускать в любой момент.
Внедрение:
Старт на staging, затем пилот только на разделе /store/.
После проверки — раскатка на остальные домены, контроль отсутствия дублей hreflang от других плагинов/настроек, очистка кэшей.
Корректный блок <link rel="alternate" hreflang="…"> выводится в <head> на страницах /store/{slug}/ по всем доменам.
Hreflang формируется только для реально существующих страниц, поэтому нет ссылок на 404/редиректы.
Проверка краулером показала стабильную картину:
0 non-200 hreflang URLs
0 Missing Return Links (после полной раскатки и очистки кэша)
Настроен удобный процесс сопровождения: при добавлении новых страниц достаточно обновить sitemap-кэш (без ручной привязки страниц).