{"id":30205,"date":"2026-05-12T11:31:00","date_gmt":"2026-05-12T10:31:00","guid":{"rendered":"https:\/\/www.web-systems.pl\/hreflang-multilingual-website-language-versions\/"},"modified":"2026-09-25T08:09:09","modified_gmt":"2026-09-25T07:09:09","slug":"hreflang-multilingual-website-language-versions","status":"publish","type":"post","link":"https:\/\/www.web-systems.pl\/en\/hreflang-multilingual-website-language-versions\/","title":{"rendered":"Hreflang on a Multilingual Website: How to Point Google to Language Versions"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><strong>Hreflang<\/strong> to adnotacja, kt\u00f3ra m\u00f3wi Google, \u017ce kilka adres\u00f3w URL to wersje j\u0119zykowe tej samej tre\u015bci. Na tej podstawie wyszukiwarka decyduje, kt\u00f3ry adres pokaza\u0107 u\u017cytkownikowi z danego j\u0119zyka albo kraju. Znasz to? Klient z Niemiec wpisuje nazw\u0119 Twojej firmy i l\u0105duje na polskiej stronie zamiast na niemieckiej. Zwykle oznacza to, \u017ce tych oznacze\u0144 brakuje albo co\u015b w nich jest \u017ale. Ni\u017cej opisuj\u0119, jak dzia\u0142a hreflang, trzy sposoby jego dodania, do czego s\u0142u\u017cy x-default, jak sprawdzi\u0107 wdro\u017cenie i jakie b\u0142\u0119dy zdarzaj\u0105 si\u0119 najcz\u0119\u015bciej.<\/p>\n\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_86 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of contents<\/p>\n<span class=\"ez-toc-title-toggle\"><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.web-systems.pl\/en\/hreflang-multilingual-website-language-versions\/#Czym_jest_hreflang_i_co_naprawde_robi_w_Google\" >Czym jest hreflang i co naprawd\u0119 robi w Google?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.web-systems.pl\/en\/hreflang-multilingual-website-language-versions\/#Jak_dodac_hreflang_znaczniki_w_head_naglowki_HTTP_czy_mapa_witryny\" >Jak doda\u0107 hreflang: znaczniki w head, nag\u0142\u00f3wki HTTP czy mapa witryny?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.web-systems.pl\/en\/hreflang-multilingual-website-language-versions\/#Zasady_poprawnego_zestawu_wersji_jezykowych_strony_w_Google\" >Zasady poprawnego zestawu wersji j\u0119zykowych strony w Google<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.web-systems.pl\/en\/hreflang-multilingual-website-language-versions\/#Do_czego_sluzy_x-default_hreflang\" >Do czego s\u0142u\u017cy x-default hreflang?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.web-systems.pl\/en\/hreflang-multilingual-website-language-versions\/#Hreflang_w_WordPressie_co_robi_wtyczka_a_co_musisz_sprawdzic\" >Hreflang w WordPressie: co robi wtyczka, a co musisz sprawdzi\u0107<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.web-systems.pl\/en\/hreflang-multilingual-website-language-versions\/#Najczestsze_bledy_hreflang_i_jak_je_wylapac\" >Najcz\u0119stsze b\u0142\u0119dy hreflang i jak je wy\u0142apa\u0107<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.web-systems.pl\/en\/hreflang-multilingual-website-language-versions\/#Najczestsze_pytania\" >Najcz\u0119stsze pytania<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/www.web-systems.pl\/en\/hreflang-multilingual-website-language-versions\/#Czy_hreflang_poprawia_pozycje_strony_w_Google\" >Czy hreflang poprawia pozycje strony w Google?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/www.web-systems.pl\/en\/hreflang-multilingual-website-language-versions\/#Czy_musze_uzywac_x-default\" >Czy musz\u0119 u\u017cywa\u0107 x-default?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/www.web-systems.pl\/en\/hreflang-multilingual-website-language-versions\/#Czy_wystarczy_atrybut_lang_w_znaczniku_html\" >Czy wystarczy atrybut lang w znaczniku html?<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Czym_jest_hreflang_i_co_naprawde_robi_w_Google\"><\/span>Czym jest hreflang i co naprawd\u0119 robi w Google?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n<p class=\"wp-block-paragraph\">Hreflang pokazuje Google zlokalizowane odpowiedniki strony, \u017ceby w wynikach wyszukiwania pojawi\u0142 si\u0119 adres w j\u0119zyku u\u017cytkownika. I tyle. Nie s\u0142u\u017cy do wykrywania j\u0119zyka (to cz\u0119sty mit). Wed\u0142ug <a href=\"https:\/\/developers.google.com\/search\/docs\/specialty\/international\/localized-versions\" rel=\"nofollow noopener\" target=\"_blank\">dokumentacji Google o wersjach zlokalizowanych<\/a> wyszukiwarka nie korzysta do tego ani z hreflang, ani z atrybutu HTML lang, tylko z w\u0142asnych algorytm\u00f3w. Oznaczenie po prostu kieruje w\u0142a\u015bciw\u0105 wersj\u0119 do w\u0142a\u015bciwego odbiorcy. Kiedy go potrzebujesz? Gdy j\u0119zyki albo regiony maj\u0105 osobne adresy URL, np. <em>\/de\/<\/em> i <em>\/en\/<\/em>, albo oddzielne domeny.<\/p>\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Jak_dodac_hreflang_znaczniki_w_head_naglowki_HTTP_czy_mapa_witryny\"><\/span>Jak doda\u0107 hreflang: znaczniki w head, nag\u0142\u00f3wki HTTP czy mapa witryny?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n<p class=\"wp-block-paragraph\">Google przyjmuje trzy metody: znaczniki link w sekcji head, nag\u0142\u00f3wek HTTP Link albo map\u0119 witryny XML. Wybierz jedn\u0105, t\u0119, kt\u00f3ra pasuje do Twojej strony. Mieszanie nic nie daje. Znaczniki musz\u0105 siedzie\u0107 w poprawnie zbudowanej sekcji head, wi\u0119c je\u015bli masz w\u0105tpliwo\u015bci, wklej wyrenderowany kod strony do walidatora HTML. Nie \u0142\u0105cz te\u017c hreflang z innymi atrybutami, np. media, w jednym znaczniku link. A nag\u0142\u00f3wek HTTP? Przydaje si\u0119 przy plikach PDF i innych dokumentach, kt\u00f3re nie s\u0105 HTML. Ka\u017cda wersja zwraca w nim dok\u0142adnie ten sam zestaw.<\/p>\n\n<pre><code>&lt;link rel=\"alternate\" hreflang=\"pl\" href=\"https:\/\/example.com\/pl\/\" \/&gt;\n&lt;link rel=\"alternate\" hreflang=\"en\" href=\"https:\/\/example.com\/en\/\" \/&gt;\n&lt;link rel=\"alternate\" hreflang=\"de\" href=\"https:\/\/example.com\/de\/\" \/&gt;<\/code><\/pre>\n\n<h2><span class=\"ez-toc-section\" id=\"Zasady_poprawnego_zestawu_wersji_jezykowych_strony_w_Google\"><\/span>Zasady poprawnego zestawu wersji j\u0119zykowych strony w Google<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p class=\"wp-block-paragraph\">Ka\u017cda wersja strony wymienia pe\u0142nymi adresami URL wszystkie warianty, \u0142\u0105cznie z sam\u0105 sob\u0105. Brzmi banalnie, a w\u0142a\u015bnie tu sypie si\u0119 najwi\u0119cej wdro\u017ce\u0144. W praktyce polecam tak\u0105 kolejno\u015b\u0107:<\/p>\n\n<ol class=\"wp-block-list\">\n<li>Spisz wszystkie warianty danej podstrony.<\/li>\n<li>Przypisz dwuliterowe kody j\u0119zyka wed\u0142ug normy ISO, a je\u015bli trzeba, dodaj region, np. <em>de-AT<\/em> dla Austrii.<\/li>\n<li>U\u017cyj pe\u0142nych, kanonicznych adres\u00f3w z protoko\u0142em.<\/li>\n<li>Dodaj odno\u015bnik strony do samej siebie.<\/li>\n<li>Zadbaj o wzajemno\u015b\u0107: ten sam zestaw musi by\u0107 na ka\u017cdej wersji.<\/li>\n<li>Dodaj x-default dla pozosta\u0142ych u\u017cytkownik\u00f3w.<\/li>\n<\/ol>\n\n<p class=\"wp-block-paragraph\">Osobna historia to podobna tre\u015b\u0107 w tym samym j\u0119zyku pod r\u00f3\u017cnymi adresami, np. example.de\/ i example.com\/de\/. Tu <a href=\"https:\/\/developers.google.com\/search\/docs\/specialty\/international\/managing-multi-regional-sites\" rel=\"nofollow noopener\" target=\"_blank\">poradnik Google o witrynach wieloregionalnych<\/a> zaleca wybra\u0107 wersj\u0119 preferowan\u0105 i po\u0142\u0105czy\u0107 rel=canonical z hreflang. Efekt? U\u017cytkownik dostaje adres pasuj\u0105cy do swojego j\u0119zyka lub regionu.<\/p>\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Do_czego_sluzy_x-default_hreflang\"><\/span>Do czego s\u0142u\u017cy x-default hreflang?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n<p class=\"wp-block-paragraph\">Warto\u015b\u0107 x-default wskazuje stron\u0119 zapasow\u0105 dla u\u017cytkownik\u00f3w, kt\u00f3rych j\u0119zyka nie obs\u0142ugujesz. Najbardziej przydaje si\u0119 przy stronie wyboru j\u0119zyka albo przy stronie g\u0142\u00f3wnej, kt\u00f3ra sama przekierowuje odwiedzaj\u0105cych. Wdro\u017cenie jest proste: obok pozosta\u0142ych dodajesz jeszcze jeden znacznik link z <em>hreflang=&#8221;x-default&#8221;<\/em>. Ma on wskazywa\u0107 adres, na kt\u00f3ry powinien trafi\u0107 kto\u015b m\u00f3wi\u0105cy w j\u0119zyku spoza Twojej listy. Przyk\u0142ad z praktyki: strona g\u0142\u00f3wna web-systems.pl ma oznaczenia pl, en, de oraz x-default, a generuje je WPML.<\/p>\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Hreflang_w_WordPressie_co_robi_wtyczka_a_co_musisz_sprawdzic\"><\/span>Hreflang w WordPressie: co robi wtyczka, a co musisz sprawdzi\u0107<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n<p class=\"wp-block-paragraph\">Wtyczki wieloj\u0119zyczne, takie jak WPML, generuj\u0105 hreflang automatycznie. Ale tylko dla stron z po\u0142\u0105czonymi t\u0142umaczeniami. Je\u015bli kto\u015b utworzy\u0142 niemieck\u0105 wersj\u0119 jako osobn\u0105 stron\u0119, bez powi\u0105zania z polsk\u0105, wtyczka nie uzna ich za odpowiedniki. I taka podstrona zostaje bez adnotacji, a Ty nawet o tym nie wiesz. Dlatego po dodaniu tre\u015bci zajrzyj w kod kilku najwa\u017cniejszych adres\u00f3w, to pi\u0119\u0107 minut roboty. Je\u015bli dopiero wybierasz narz\u0119dzie, por\u00f3wnaj dost\u0119pne <a href=\"https:\/\/www.web-systems.pl\/jak-stworzyc-wielojezyczna-strone-wordpress-najlepsze-wtyczki-do-tlumaczen\/\">wtyczki do t\u0142umacze\u0144 WordPressa<\/a>. Przy nowym serwisie struktur\u0119 j\u0119zykow\u0105 najlepiej zaplanowa\u0107 ju\u017c wtedy, gdy zamawiasz <a href=\"https:\/\/www.web-systems.pl\/tworzenie-stron-www\/\">tworzenie stron internetowych dla firm<\/a>. P\u00f3\u017aniej przerabia si\u0119 j\u0105 du\u017co trudniej.<\/p>\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Najczestsze_bledy_hreflang_i_jak_je_wylapac\"><\/span>Najcz\u0119stsze b\u0142\u0119dy hreflang i jak je wy\u0142apa\u0107<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n<p class=\"wp-block-paragraph\">Wi\u0119kszo\u015b\u0107 problem\u00f3w bierze si\u0119 z braku wzajemno\u015bci, z\u0142ych kod\u00f3w j\u0119zyka i adres\u00f3w, kt\u00f3re przekierowuj\u0105 albo maj\u0105 inny canonical. Lista grzech\u00f3w wygl\u0105da mniej wi\u0119cej tak:<\/p>\n\n<ul class=\"wp-block-list\">\n<li>brak linku zwrotnego z jednej z wersji,<\/li>\n<li>kod kraju zamiast j\u0119zyka, np. <em>uk<\/em> dla Wielkiej Brytanii zamiast <em>en-GB<\/em>,<\/li>\n<li>hreflang wskazuj\u0105cy adres z przekierowaniem lub z noindex,<\/li>\n<li>canonical wskazuj\u0105cy inn\u0105 wersj\u0119 j\u0119zykow\u0105,<\/li>\n<li>znaczniki poza sekcj\u0105 head, np. wstrzykni\u0119te do body,<\/li>\n<li>adresy wzgl\u0119dne zamiast pe\u0142nych.<\/li>\n<\/ul>\n\n<p class=\"wp-block-paragraph\">Do kontroli w zupe\u0142no\u015bci wystarcz\u0105 podgl\u0105d \u017ar\u00f3d\u0142a wyrenderowanej strony i walidator HTML. Przy du\u017cej liczbie podstron pomagaj\u0105 zewn\u0119trzne narz\u0119dzia do debugowania hreflang. Tylko uwaga: Google zaznacza, \u017ce ich nie utrzymuje ani nie sprawdza. W rozbudowanym serwisie moim zdaniem lepiej zleci\u0107 <a href=\"https:\/\/www.web-systems.pl\/audyty-seo\/\">audyt SEO strony wieloj\u0119zycznej<\/a>, ni\u017c klika\u0107 to r\u0119cznie tygodniami.<\/p>\n\n<p class=\"wp-block-paragraph\">Od czego zacz\u0105\u0107? Od listy wariant\u00f3w strony g\u0142\u00f3wnej i najwa\u017cniejszych podstron. Potem sprawd\u017a w kodzie, czy ka\u017cda z nich wymienia wszystkie wersje i x-default. Dobrze wdro\u017cony hreflang robi jedn\u0105 prost\u0105 rzecz: klient z Niemiec widzi w Google stron\u0119 niemieck\u0105, a klient z Polski polsk\u0105. Je\u015bli wolisz odda\u0107 to w r\u0119ce specjalist\u00f3w, rozwa\u017c <a href=\"https:\/\/www.web-systems.pl\/pozycjonowanie-stron\/\">profesjonalne pozycjonowanie stron<\/a>.<\/p>\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Najczestsze_pytania\"><\/span>Najcz\u0119stsze pytania<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<div id=\"rank-math-faq\" class=\"rank-math-block\">\n<div class=\"rank-math-list \">\n<div id=\"faq-question-1790308570460-0\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \"><span class=\"ez-toc-section\" id=\"Czy_hreflang_poprawia_pozycje_strony_w_Google\"><\/span>Czy hreflang poprawia pozycje strony w Google?<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Nie, hreflang nie s\u0142u\u017cy do poprawiania pozycji. Pomaga Google pokaza\u0107 u\u017cytkownikowi w\u0142a\u015bciw\u0105 wersj\u0119 j\u0119zykow\u0105 tej samej tre\u015bci. Dzi\u0119ki temu odwiedzaj\u0105cy od razu trafia na stron\u0119 w swoim j\u0119zyku.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1790308570460-1\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \"><span class=\"ez-toc-section\" id=\"Czy_musze_uzywac_x-default\"><\/span>Czy musz\u0119 u\u017cywa\u0107 x-default?<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>X-default nie jest obowi\u0105zkowy. Ale je\u015bli masz stron\u0119 wyboru j\u0119zyka albo stron\u0119 g\u0142\u00f3wn\u0105 z automatycznym przekierowaniem, to go dodaj. U\u017cytkownicy, kt\u00f3rych j\u0119zyka nie obs\u0142ugujesz, trafi\u0105 wtedy na stron\u0119 zapasow\u0105.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1790308570460-2\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \"><span class=\"ez-toc-section\" id=\"Czy_wystarczy_atrybut_lang_w_znaczniku_html\"><\/span>Czy wystarczy atrybut lang w znaczniku html?<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Nie wystarczy. Google nie u\u017cywa atrybutu lang ani do wskazywania wersji j\u0119zykowych, ani do rozpoznawania j\u0119zyka strony. \u017beby po\u0142\u0105czy\u0107 odpowiedniki, potrzebujesz hreflang w sekcji head, w nag\u0142\u00f3wku HTTP albo w mapie witryny.<\/p>\n\n<\/div>\n<\/div>\n<\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>Hreflang to adnotacja, kt\u00f3ra m\u00f3wi Google, \u017ce kilka adres\u00f3w URL to wersje j\u0119zykowe tej samej tre\u015bci. Na tej podstawie wyszukiwarka decyduje, kt\u00f3ry adres pokaza\u0107 u\u017cytkownikowi z danego j\u0119zyka albo kraju. Znasz to? Klient z Niemiec wpisuje nazw\u0119 Twojej firmy i l\u0105duje na polskiej stronie zamiast na niemieckiej. Zwykle oznacza to, \u017ce tych oznacze\u0144 brakuje albo [&hellip;]<\/p>\n","protected":false},"author":9,"featured_media":30183,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[822],"tags":[],"class_list":["post-30205","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-seo-sem-en"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.web-systems.pl\/en\/wp-json\/wp\/v2\/posts\/30205","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.web-systems.pl\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.web-systems.pl\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.web-systems.pl\/en\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/www.web-systems.pl\/en\/wp-json\/wp\/v2\/comments?post=30205"}],"version-history":[{"count":3,"href":"https:\/\/www.web-systems.pl\/en\/wp-json\/wp\/v2\/posts\/30205\/revisions"}],"predecessor-version":[{"id":30254,"href":"https:\/\/www.web-systems.pl\/en\/wp-json\/wp\/v2\/posts\/30205\/revisions\/30254"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.web-systems.pl\/en\/wp-json\/wp\/v2\/media\/30183"}],"wp:attachment":[{"href":"https:\/\/www.web-systems.pl\/en\/wp-json\/wp\/v2\/media?parent=30205"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.web-systems.pl\/en\/wp-json\/wp\/v2\/categories?post=30205"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.web-systems.pl\/en\/wp-json\/wp\/v2\/tags?post=30205"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}