Hreflang to atrybut w znaczniku <link rel="alternate">, którym strona wskazuje wyszukiwarce swoje wersje w innych językach lub dla konkretnych krajów oraz ich adresy. Stosuje się go w witrynach z co najmniej dwiema wersjami językowymi, niezależnie od tego, czy stoją na osobnych domenach, w podkatalogach czy na subdomenach. Dzięki temu użytkownik szukający z Niemiec zobaczy wersję niemiecką, a ten z Polski – polską, zamiast tej, która ma silniejsze linki.
Jak działa hreflang?
Hreflang jest wskazówką dla Google, nie poleceniem. Robot czyta komplet znaczników na stronie, zestawia go z ich odpowiednikami pod wskazanymi adresami i buduje z nich grupę wersji tej samej treści. W wynikach wyszukiwania trafia potem do użytkownika ta wersja z grupy, która pasuje do jego języka i lokalizacji.
Atrybut nie podnosi pozycji, bo każda wersja językowa to osobny adres, który Google indeksuje i ocenia na podstawie własnych sygnałów; hreflang decyduje tylko o tym, która z nich pojawi się w wynikach. Różnicę między pobraniem strony przez robota a dodaniem jej do indeksu opisujemy we wpisie Crawlowanie a indeksowanie: czym się różnią?.
Grupa działa pod dwoma warunkami. Zwrotne odnośniki: gdy wersja polska wskazuje niemiecką, niemiecka musi wskazywać polską, inaczej Google ignoruje taki znacznik. I odnośnik do samej siebie (self-referencing): każda strona wymienia w swoim komplecie znaczników także własny adres, więc na każdej wersji stoi ten sam zestaw tagów.
Jak wygląda składnia hreflang?
Jeden znacznik odpowiada jednej wersji strony, łącznie z tą, na której się znajduje:
<link rel="alternate" hreflang="de" href="https://firma.de/" />
Znacznik ma trzy atrybuty: rel="alternate" mówi, że to alternatywna wersja bieżącej strony, hreflang podaje język i opcjonalnie kraj, a href pełny adres tej wersji z protokołem i domeną. Adres względny w rodzaju /de/ nie jest poprawny.
Wartości atrybutu hreflang mają trzy formy:
- Sam kod języka według normy ISO 639-1, dwie małe litery:
pl,de,en,fr. Taka forma wystarcza, gdy jedna wersja obsługuje wszystkich użytkowników danego języka. - Kod języka i kraju: język według ISO 639-1 i kraj według ISO 3166-1 alfa-2 po myślniku, np.
en-GB,en-US,de-AT,de-CH. Przydaje się, gdy treść w jednym języku istnieje osobno dla kilku rynków, bo różni się walutą, cenami lub dostawą. Sam kod kraju bez języka (GB,US) jest niedozwolony. - Wartość
x-defaultdla użytkowników, do których nie pasuje żadna z wersji; opisujemy ją w sekcji niżej.
Zgodnie z konwencją kod języka pisze się małymi literami, a kod kraju wielkimi. Wielka Brytania to en-GB, nie en-UK; sam kod uk oznacza w ISO 639-1 język ukraiński.
Gdzie umieścić hreflang?
Hreflang umieszcza się w jednym z trzech miejsc: w sekcji <head> strony HTML, w nagłówku HTTP odpowiedzi serwera albo w mapie witryny XML. Na jednej witrynie stosuje się jedną metodę, bo dwie równoległe deklaracje dla tego samego adresu łatwo się rozjeżdżają.
- Sekcja
<head>. To najczęstszy wariant, w którym znaczniki<link>wstawia szablon strony albo wtyczka wielojęzyczna. - Nagłówek HTTP. Ten sposób zostaje dla plików bez sekcji
<head>, na przykład dla PDF-ów. Serwer zwraca wtedy nagłówekLink: <https://firma.de/katalog.pdf>; rel="alternate"; hreflang="de", po jednym wpisie na wersję. - Mapa witryny XML. Każdy element
<url>wylicza wszystkie wersje adresu w elementachxhtml:link, a plik deklaruje przestrzeń nazwxmlns:xhtml="http://www.w3.org/1999/xhtml". Ten wariant nie dokłada nic do kodu strony, co ułatwia utrzymanie setek adresów w kilku językach.
<url>
<loc>https://firma.pl/</loc>
<xhtml:link rel="alternate" hreflang="pl" href="https://firma.pl/" />
<xhtml:link rel="alternate" hreflang="de" href="https://firma.de/" />
<xhtml:link rel="alternate" hreflang="en" href="https://firma.eu/" />
</url>
Przykład z wdrożenia: jeden z klientów Roseo, firma produkcyjna, ma trzy wersje językowe strony rozłożone na osobnych domenach i osobnych instalacjach WordPressa, a nie w podkatalogach jednej witryny. W sekcji <head> strony głównej każdej z nich stoi ten sam komplet czterech znaczników (domeny zmienione):
<link rel="alternate" hreflang="pl" href="https://firma.pl/" />
<link rel="alternate" hreflang="de" href="https://firma.de/" />
<link rel="alternate" hreflang="en" href="https://firma.eu/" />
<link rel="alternate" hreflang="x-default" href="https://firma.eu/" />
Zestaw jest identyczny na wersji polskiej, niemieckiej i angielskiej, więc zwrotne odnośniki i odnośnik do samej siebie są zachowane. Hreflang łączy tu trzy niezależne domeny, a nie katalogi /de/ i /en/ w obrębie jednej.
Czym jest x-default?
x-default to wartość specjalna atrybutu hreflang, która wskazuje adres dla użytkowników, których języka ani kraju nie obejmuje żadna z pozostałych wersji. W przykładzie wyżej ktoś szukający z Francji dostanie wersję angielską, bo strona nie ma francuskiej, a x-default prowadzi na domenę .eu.
Adres x-default prowadzi zwykle do strony wyboru języka albo do wersji międzynarodowej, najczęściej angielskiej. W grupie wersji jest tylko jeden x-default; Google nie wymaga go, ale zaleca.
Jak hreflang łączy się z tagiem canonical?
Hreflang i tag canonical działają obok siebie: hreflang łączy wersje językowe w grupę, a tag canonical wskazuje adres główny w obrębie jednej wersji. Każda wersja językowa dostaje tag canonical wskazujący ją samą. Jeśli hreflang prowadzi do adresu, którego canonical wskazuje inną stronę, Google pomija taki znacznik. Zasadę działania tego znacznika i sytuacje, w których go używać, opisujemy we wpisie Co to jest tag canonical?.
Jakie błędy w hreflang są najczęstsze?
Najczęstszy błąd to brak zwrotnego odnośnika, przez co Google ignoruje całą parę wersji. Pozostałe dotyczą wartości i adresów:
- Zły kod.
en-UKzamiasten-GB, sam kod kraju bez języka albo kod wymyślony przez motyw strony. - Więcej niż jeden
x-defaultw tej samej grupie wersji. - Adres względny w rodzaju
/de/zamiast pełnego, z protokołem i domeną. - Adres, który nie zwraca treści. Hreflang wskazujący stronę z kodem 404 albo przekierowanie nie tworzy grupy, a robot i tak wysyła żądania pod puste adresy; skutki dla dużych witryn opisujemy we wpisie Co to jest crawl budget?.
- Strona wykluczona z indeksu. Wersja ze znacznikiem noindex albo z tagiem canonical na inny adres nie może być częścią grupy.
- Tagi tylko na stronie głównej. Hreflang działa na poziomie pojedynczego adresu, więc każda podstrona z odpowiednikiem w innym języku potrzebuje własnego kompletu znaczników.
Masz stronę w kilku językach, a klienci z Niemiec widzą w Google polską wersję?
Napisz do nas, sprawdzimy hreflang na wszystkich wersjach i wskażemy adresy do poprawy w ramach pozycjonowania.
Jak sprawdzić hreflang na stronie?
Hreflang sprawdzasz w kodzie źródłowym strony, w mapie witryny albo crawlerem, który zweryfikuje zwrotne odnośniki w całej witrynie. Po samym wyglądzie strony w przeglądarce nie da się go rozpoznać.
Kod źródłowy
Skrót Ctrl+U (na Macu Cmd+Option+U) albo polecenie curl, a potem szukanie frazy hreflang= w sekcji <head>. Komplet znaczników ma zawierać bieżący adres.
Mapa witryny
Adres mapy znajdziesz w pliku robots.txt albo w ustawieniach wtyczki SEO, a w samej mapie szukaj elementów xhtml:link.
Crawler
Screaming Frog w zakładce Hreflang wypisuje adresy bez zwrotnych odnośników, z błędnymi kodami i te, które wskazują strony z kodem 404. To jedyny z tych sposobów, który obejmuje całą witrynę, a nie pojedynczą stronę.
Pozostałe pojęcia z SEO technicznego opisujemy na blogu Roseo.
Rozbudowujesz stronę o nową wersję językową?
Napisz do nas, sprawdzimy strukturę adresów i podpowiemy, jak oznaczyć wersje, żeby nie konkurowały ze sobą w Google.
FAQ
Nie. Hreflang decyduje, która wersja językowa pojawi się w wynikach dla danego użytkownika, a nie na której pozycji. Każda wersja zbiera własne linki i sygnały rankingowe.
Nie. Google rozpoznaje język strony po widocznej treści, nie po atrybucie <html lang="pl"> ani innych oznaczeniach w kodzie. Atrybut lang służy przeglądarkom i czytnikom ekranu, a hreflang wskazuje wyszukiwarce adresy pozostałych wersji.
Taka podstrona nie dostaje znacznika hreflang wskazującego brakującą wersję. Grupę tworzą tylko adresy, które istnieją i zwracają treść, więc komplet znaczników na każdej podstronie odpowiada jej realnym tłumaczeniom.
Tak, Polylang i WPML wstawiają znaczniki hreflang w sekcji <head> dla każdej przetłumaczonej strony i wpisu. Sposób wdrożenia zależy jednak od wtyczki. Po włączeniu tłumaczeń sprawdź więc w kodzie zwrotne odnośniki i ustawienie x-default, bo domyślnie może ono wskazywać inną wersję, niż chcesz pokazywać niedopasowanym użytkownikom.
Źródła
- Google Search Central, „Tell Google about localized versions of your page”: developers.google.com
- Google Search Central, „Managing multi-regional and multilingual sites”: developers.google.com
- ISO, „ISO 639 – kody języków”: iso.org
- ISO, „ISO 3166 – kody krajów”: iso.org
