Co to jest hreflang?

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-default dla 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łówek Link: <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 elementach xhtml:link, a plik deklaruje przestrzeń nazw xmlns: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-UK zamiast en-GB, sam kod kraju bez języka albo kod wymyślony przez motyw strony.
  • Więcej niż jeden x-default w 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.

Napisz do nas

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.

Napisz do nas

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
Przewijanie do góry