Schema markup: dane strukturalne dla Google i AI — audyt notatnika i gotowe JSON-LD

WPIS #047 · 24.09.2026 · notatnik.mk · SEO · DANE STRUKTURALNE

TL;DR — Schema markup to warstwa danych, którą dokładasz do strony, żeby maszyna (Google, Bing, crawler modelu AI) wiedziała, co dokładnie ma przed sobą: artykuł, produkt, osobę, pytanie z odpowiedzią. Nie jest czynnikiem rankingowym i nie zastępuje treści, ale decyduje o tym, jak strona wygląda w wynikach i czy w ogóle zostanie poprawnie zrozumiana. W tym wpisie rozbieram schemę na części, robię audyt własnego notatnika (co siedzi w kodzie tej strony dziś) i zostawiam gotowe bloki JSON-LD do skopiowania.
Skąd te dane — audyt zrobiłem 24.09.2026 na żywej stronie mateuszkwiecien.pl: pobrałem kod strony głównej, wpisu, archiwum kategorii i stron statycznych, wyciągnąłem wszystkie bloki application/ld+json i policzyłem, co w nich jest. Liczby poniżej to stan tej witryny, a nie średnie z internetu. Wpływ schemy na ruch i klikalność w tej witrynie nie był jeszcze mierzony — to opisuję szczerze w sekcji o testach.
3bloki JSON-LD na jednym wpisie notatnika
6węzłów w grafie Yoast na stronie wpisu
1adres w sameAs autora (tylko własna domena)
0schemy Product — sklep nie jest jeszcze podpięty

Czym jest schema markup

Schema markup (dane strukturalne) to ustandaryzowany słownik schema.org, którym opisujesz elementy strony w sposób czytelny dla maszyn: „to jest artykuł, napisał go ten człowiek, opublikowano wtedy, obrazek okładki jest tu”. Człowiek widzi nagłówek i datę; robot bez schemy widzi tylko tekst i musi zgadywać. Ze schemą nie zgaduje.

Słownik powstał w 2011 roku jako wspólna inicjatywa Google, Microsoftu, Yahoo i Yandexa. Dziś ma kilkaset typów (Article, Product, Person, Event, Recipe, FAQPage…) i tysiące właściwości. Nie musisz znać wszystkich — na blogu i w małym sklepie używa się kilkunastu.

Ważne rozróżnienie, które często się miesza: dane strukturalne to informacja w kodzie. Rich results (rozszerzone wyniki) to to, co Google może z tej informacji zbudować w wynikach wyszukiwania: gwiazdki, cenę, okruszki nawigacyjne, rozwijane pytania. Dane strukturalne są warunkiem koniecznym, ale nie wystarczającym — Google sam decyduje, czy rozszerzony wynik pokaże.

Moja zasada: schema opisuje to, co na stronie naprawdę jest. Jeśli w kodzie deklaruję FAQ, użytkownik musi te pytania widzieć na stronie. Jeśli deklaruję ocenę 4,9 — muszą istnieć prawdziwe oceny. Wszystko inne to zaproszenie do ręcznej kary od Google.

JSON-LD, microdata, RDFa: trzy sposoby zapisu

Ten sam słownik można zapisać na trzy sposoby. Różnica jest czysto techniczna, ale w praktyce wybór jest jeden.

FormatGdzie leży w kodziePlusyMinusyWerdykt
JSON-LDosobny blok <script type="application/ld+json">, zwykle w <head> lub na końcu treścinie dotyka HTML-a, łatwo wygenerować z wtyczki lub szablonu, zalecany przez Googletrzeba pilnować, żeby zgadzał się z widoczną treściąużywaj tego
Microdataatrybuty itemscope, itemprop wprost na znacznikach HTMLdane siedzą przy treści, którą opisująbrudzi szablon, łatwo zepsuć przy zmianie motywutylko jeśli odziedziczysz po kimś
RDFaatrybuty vocab, typeof, property w HTMLstandard W3C, elastycznyrzadko wspierany przez wtyczki, mało przykładówpomiń

W WordPressie z Yoastem albo Rank Mathem JSON-LD dostajesz automatycznie. Cały ten wpis jest o tym, co wtyczka robi sama, czego nie robi i co dopisać ręcznie.

Które typy mają sens na blogu i w sklepie

Poniżej typy, które realnie spotkasz w małym e-commerce i na blogu eksperckim. Kolumna „rozszerzony wynik” mówi, czy Google dziś buduje z tego coś widocznego w wynikach — według dokumentacji Google Search Central (stan na wrzesień 2026, linki w źródłach).

TypGdzie go użyćRozszerzony wynik w GoogleUwagi
Article / BlogPostingkażdy wpis na blogutak — nagłówek, data, autor, obrazek w Top Stories i DiscoverYoast domyślnie daje Article; BlogPosting to podtyp, obie formy są poprawne
Product + Offerkarta produktu w sklepietak — cena, dostępność, oceny, wysyłka, zwrotynajważniejszy typ dla sklepu; WooCommerce + Yoast/Rank Math generują go automatycznie
BreadcrumbListwszystkie podstronytak — ścieżka zamiast surowego adresu URLmusi odpowiadać realnym okruszkom na stronie
Organizationstrona główna firmy / skleputak — panel wiedzy, logo, dane kontaktoweod 2024 Google czyta stąd też politykę zwrotów i pola kontaktowe
Personstrona główna marki osobistej, strona „o mnie”, autor wpisunie ma osobnego rozszerzonego wynikuale buduje encję autora — kluczowe dla E-E-A-T i dla modeli AI; wypełnij sameAs
FAQPagestrony z sekcją pytań i odpowiedziograniczone — od sierpnia 2023 Google pokazuje rozwijane FAQ głównie na stronach rządowych i medycznychnadal warto mieć dla Binga i dla parserów AI; nie licz na efekt wizualny w Google
HowToinstrukcje krok po krokunie — Google wycofał rozszerzony wynik HowTo we wrześniu 2023nie szkodzi, ale nic nie daje w Google; pomiń, chyba że pod Binga
VideoObjectstrony z osadzonym wideotak — miniatura, długość, kluczowe momentywymaga własnej miniatury i adresu pliku lub osadzenia
Eventwebinary, szkolenia, wydarzeniatak — data, miejsce, biletytylko dla wydarzeń z konkretną datą
LocalBusinessfirma z fizycznym adresemtak — godziny, adres, telefondla sklepu wysyłkowego bez punktu odbioru zwykle zbędne
Review / AggregateRatingprodukty, usługitak — gwiazdkitylko prawdziwe opinie; Google nie pokazuje gwiazdek dla ocen własnej organizacji
DefinedTermSetsłowniki, glosariuszenieużywam go na filarze słownika — porządkuje encje dla parserów

Wniosek dla sklepu: Product, Organization, BreadcrumbList. Wniosek dla bloga: Article, Person z sameAs, BreadcrumbList. Reszta to dodatki.

Audyt mojego notatnika: co siedzi w kodzie

Zamiast teoretyzować, pobrałem kod kilku stron tej witryny i wypisałem, jakie typy schemy się na nich znajdują. Stan z 24 września 2026.

AdresBloki JSON-LDTypy w grafieSkąd
strona główna /2WebPage, BreadcrumbList, WebSite, Person+Organization; drugi blok: rozszerzony PersonYoast + własny blok w widgecie HTML
wpis, np. o newsjackingu3Article, WebPage, ImageObject, BreadcrumbList, WebSite, Person+Organization; Person; FAQPage (5 pytań)Yoast + własny Person + FAQPage w treści wpisu
filar słownika3jak wyżej + FAQPage (10 pytań) + DefinedTermSetYoast + własne bloki
archiwum /category/seo/2CollectionPage, ImageObject, BreadcrumbList, WebSite, Person+Organization; PersonYoast + własny Person
/tematy/, /kontakt/2WebPage, BreadcrumbList, WebSite, Person+Organization; PersonYoast + własny Person

Co jest dobrze

  • Każdy wpis ma pełny węzeł Article z autorem, datami, obrazkiem, liczbą słów i sekcjami (kategoriami). Tego nie trzeba dopisywać ręcznie — Yoast robi to z pól wpisu.
  • Witryna jest w Yoaście skonfigurowana jako osoba, nie firma. Dla marki osobistej to właściwy wybór: graf ma jeden węzeł Person+Organization z tym samym identyfikatorem, a autor każdego wpisu wskazuje na niego przez @id.
  • Osobny blok Person z jobTitle, worksFor (organizacja kwiecien.academy) i knowsAbout — to warstwa, której Yoast nie generuje; dopisałem ją, żeby maszyna wiedziała, o czym ten człowiek pisze i gdzie pracuje.
  • Filar słownika ma DefinedTermSet, wpisy z sekcją FAQ mają FAQPage zgodny z widoczną treścią.

Co jest słabo

  • sameAs autora wskazuje tylko na własną domenę. Google i modele AI łączą encję osoby po profilach zewnętrznych (LinkedIn, YouTube, Wikipedia, profile branżowe). Dopóki tych profili nie ma, encja „Mateusz Kwiecień” wisi w próżni. To najważniejszy brak i jednocześnie taki, którego nie załatwi kod — trzeba mieć profile.
  • Person i Organization Yoasta to jeden węzeł, a kwiecien.academy jest osobnym bytem z własną domeną. Relacja jest zaznaczona w moim bloku przez worksFor, ale organizacja sklepu nie ma tu swojego pełnego opisu — jej graf powinien żyć na kwiecien.academy i tam zostanie rozbudowany.
  • FAQPage dodaję z nawyku, ale w Google od 2023 nie daje rozszerzonego wyniku na blogu takim jak ten. Zostawiam go dla Binga i parserów AI, bez oczekiwań co do wyglądu w Google.
  • Brak Product — logiczne, bo ten notatnik nic nie sprzedaje. Sklep ma to u siebie.
  • Dwa bloki Person (Yoasta i mój) opisują tę samą osobę pod różnymi identyfikatorami. Google sobie z tym radzi, ale czystsze byłoby podpięcie mojego bloku do @id Yoasta. Zapisuję do poprawy.

Gotowe bloki JSON-LD do skopiowania

Cztery bloki, które pokrywają 90% potrzeb bloga i sklepu. Podmień wartości w nawiasach kwadratowych. Każdy blok wklejasz jako <script type="application/ld+json">…</script> — w Yoaście i Rank Mathu przez pole „kod w nagłówku”, w Elementorze przez widget HTML, w treści wpisu po prostu w edytorze kodu.

1. Wpis na blogu (BlogPosting)

Jeśli masz Yoasta, ten blok już jest — nie duplikuj go. Wklej tylko wtedy, gdy twój motyw lub generator stron nie daje Article.

blogposting.jsonld
{
  "@context": "https://schema.org",
  "@type": "BlogPosting",
  "headline": "[tytuł wpisu, do 110 znaków]",
  "description": "[jedno zdanie o czym jest wpis]",
  "image": "[https://twojadomena.pl/okladka.jpg]",
  "datePublished": "[2026-09-24T10:00:00+02:00]",
  "dateModified": "[2026-09-24T10:00:00+02:00]",
  "author": { "@type": "Person", "name": "[Imię Nazwisko]", "url": "[https://twojadomena.pl/o-mnie/]" },
  "publisher": { "@type": "Organization", "name": "[nazwa marki]", "logo": { "@type": "ImageObject", "url": "[https://twojadomena.pl/logo.png]" } },
  "mainEntityOfPage": "[https://twojadomena.pl/adres-wpisu/]",
  "inLanguage": "pl-PL"
}

2. Autor / marka osobista (Person z sameAs)

To ten blok, którego u siebie mam za mało. Wpisz wszystkie profile, na których jesteś tą samą osobą — im więcej wiarygodnych, tym łatwiej maszynie skleić encję.

person.jsonld
{
  "@context": "https://schema.org",
  "@type": "Person",
  "@id": "https://twojadomena.pl/#person",
  "name": "[Imię Nazwisko]",
  "url": "https://twojadomena.pl/",
  "image": "[https://twojadomena.pl/zdjecie.jpg]",
  "jobTitle": "[czym się zajmujesz, jedno wyrażenie]",
  "description": "[dwa zdania o tobie — to samo, co w sekcji O mnie]",
  "worksFor": { "@type": "Organization", "name": "[nazwa firmy]", "url": "[https://firma.pl/]" },
  "knowsAbout": ["[temat 1]", "[temat 2]", "[temat 3]"],
  "sameAs": [
    "[https://www.linkedin.com/in/...]",
    "[https://www.youtube.com/@...]",
    "[https://www.instagram.com/...]"
  ]
}

3. Produkt w sklepie (Product + Offer)

WooCommerce z Yoastem lub Rank Mathem generuje to sam z pól produktu. Blok przydaje się, gdy sprzedajesz przez własny szablon albo chcesz sprawdzić, czego wtyczce brakuje (najczęściej: shippingDetails i hasMerchantReturnPolicy).

product.jsonld
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "[nazwa produktu]",
  "image": ["[https://sklep.pl/produkt-1.jpg]"],
  "description": "[opis produktu]",
  "sku": "[SKU]",
  "brand": { "@type": "Brand", "name": "[marka]" },
  "offers": {
    "@type": "Offer",
    "url": "[https://sklep.pl/produkt/]",
    "priceCurrency": "PLN",
    "price": "[19.00]",
    "availability": "https://schema.org/InStock",
    "itemCondition": "https://schema.org/NewCondition",
    "hasMerchantReturnPolicy": {
      "@type": "MerchantReturnPolicy",
      "applicableCountry": "PL",
      "returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
      "merchantReturnDays": 14,
      "returnMethod": "https://schema.org/ReturnByMail",
      "returnFees": "https://schema.org/FreeReturn"
    }
  }
}

Dla produktu cyfrowego (PDF do pobrania) pole zwrotów opisz zgodnie z regulaminem — przy treściach cyfrowych dostarczanych od razu prawo odstąpienia zwykle nie obowiązuje, więc returnPolicyCategory będzie MerchantReturnNotPermitted. Nie wpisuj „darmowy zwrot”, jeśli go nie ma.

4. Pytania i odpowiedzi (FAQPage)

Pytania muszą być widoczne na stronie dokładnie w tym brzmieniu. Pamiętaj: w Google od 2023 to głównie sygnał dla parserów, nie efekt wizualny.

faq.jsonld
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "[Pytanie 1?]",
      "acceptedAnswer": { "@type": "Answer", "text": "[Odpowiedź 1 — 2–4 zdania, bez linków sprzedażowych]" }
    },
    {
      "@type": "Question",
      "name": "[Pytanie 2?]",
      "acceptedAnswer": { "@type": "Answer", "text": "[Odpowiedź 2]" }
    }
  ]
}

Schema a widoczność w AI

Najczęstsze pytanie z ostatniego roku: „czy schema pomaga być cytowanym w ChatGPT, Perplexity, AI Overviews?”. Uczciwa odpowiedź: pośrednio i bez twardych dowodów.

  • Crawlery modeli (GPTBot, ClaudeBot, PerplexityBot, Google-Extended) pobierają HTML strony. JSON-LD jest w tym HTML-u, więc technicznie jest dostępny. Czy dany parser go używa — żaden dostawca nie potwierdza publicznie na poziomie szczegółów.
  • AI Overviews i tryb AI w Google opierają się na indeksie Google. Tam dane strukturalne działają jak zawsze: pomagają zrozumieć stronę i encje. Google wprost mówi, że schema nie jest czynnikiem rankingowym, ale ułatwia interpretację treści.
  • Największy praktyczny efekt daje spójność encji: to samo imię i nazwisko, ten sam opis, te same profile w sameAs na stronie, w Yoaście, w profilach społecznościowych. Model, który trzykrotnie widzi tę samą encję w tym samym kontekście, chętniej ją przypisuje do tematu.
  • Schema nie naprawi treści. Model cytuje strony, które odpowiadają na pytanie w pierwszych akapitach, mają definicje, tabele i listy. Dane strukturalne to tylko etykieta na tym pudełku.

Więcej o tym, jak strona ma być czytelna dla modeli, jest w słowniku GEO. Tutaj zostawiam jedną regułę: najpierw treść z definicją i strukturą, potem Person z sameAs, na końcu reszta schemy.

Jak sprawdzić, czy działa

  1. Test wyników z elementami rozszerzonymi (Rich Results Test) od Google — wklejasz adres, dostajesz listę wykrytych typów i błędów. Pokazuje tylko typy, z których Google buduje rozszerzone wyniki; Person albo DefinedTermSet tu nie zobaczysz i to jest normalne.
  2. Schema Markup Validator (validator.schema.org) — sprawdza składnię wszystkich typów, nie tylko tych „googlowych”. Tu widać pełny graf.
  3. Search Console → Ulepszenia — po kilku dniach od indeksacji pojawiają się raporty per typ (np. „Okruszki nawigacyjne”, „Produkty”) z liczbą poprawnych i błędnych stron. To jedyne miejsce, gdzie widzisz stan całej witryny, a nie jednej strony.
  4. Podgląd kodu — najprościej: źródło strony, szukaj ld+json. Jeśli blok jest, ale walidator go nie widzi, sprawdź, czy nie jest wstrzykiwany JavaScriptem po załadowaniu strony; część parserów nie wykonuje JS.

Błędy, które widuję najczęściej

BłądSkutekNaprawa
Dwie wtyczki generują schemę naraz (np. Yoast + wtyczka „FAQ schema”)zduplikowane węzły, sprzeczne dane, ostrzeżenia w Search Consolezostaw jedno źródło; w Yoaście wyłącz to, co dubluje inna wtyczka
Schema mówi co innego niż strona (ocena 5,0 bez opinii, FAQ bez widocznych pytań)ryzyko ręcznej kary za „dane strukturalne wprowadzające w błąd”opisuj tylko to, co użytkownik widzi
Brak image albo obrazek poniżej 1200 px szerokości w Articlewpis nie wchodzi do Discover, ostrzeżenie w raporcieokładka 1200×630 lub większa, jako obrazek wyróżniający
Product bez ceny, waluty lub dostępnościbrak rozszerzonego wyniku z cenąuzupełnij offers; sprawdź, czy wtyczka nie chowa ceny dla wariantów
Data publikacji w schemie inna niż na stronie (np. po backdatowaniu)Google traktuje daty jako niewiarygodnejedna data, wszędzie ta sama — sam to przerabiałem przy porządkach we wrześniu
Person bez sameAs albo z jednym adresemencja autora nieskonsolidowanadodaj profile zewnętrzne — mój punkt do zrobienia

Plan testu w tej witrynie

Tego kanału jeszcze nie mierzyłem. Zamiast zmyślać efekt, spisuję plan i wrócę z wynikiem.

  1. Podpiąć mój blok Person do identyfikatora Yoasta (jeden węzeł zamiast dwóch) i uzupełnić sameAs, gdy powstaną profile zewnętrzne.
  2. Zdjąć zrzut z Search Console → Ulepszenia i z raportu Skuteczność: liczba wyświetleń i kliknięć dla wpisów z FAQPage i bez — punkt odniesienia.
  3. Nic nie zmieniać w treści. Raz w tygodniu zapisywać te same liczby.
  4. Porównać. Jeśli różnica mieści się w zwykłej zmienności, napiszę, że FAQPage na tym blogu nic nie daje — i będzie to równie dobry wpis.

FAQ

Czy schema markup poprawia pozycje w Google?

Nie bezpośrednio. Google wielokrotnie potwierdzał, że dane strukturalne nie są czynnikiem rankingowym. Pomagają zrozumieć stronę i mogą dać rozszerzony wynik, który zwykle zbiera więcej kliknięć niż zwykły — to jest realny efekt, ale w klikalności, nie w pozycji.

Czy wystarczy wtyczka SEO, czy trzeba coś dopisywać ręcznie?

Yoast albo Rank Math pokrywają podstawę: Article, WebPage, BreadcrumbList, Organization lub Person, Product w WooCommerce. Ręcznie warto dopisać rozszerzony Person z sameAs, jobTitle i knowsAbout oraz typy specjalne (FAQPage, DefinedTermSet, VideoObject), jeśli treść ich wymaga.

Czy FAQPage jeszcze ma sens?

W Google rozszerzone FAQ pokazuje się od sierpnia 2023 głównie na stronach rządowych i medycznych. Blok nie szkodzi, jest czytany przez Binga i parsery, ale nie licz na rozwijane pytania w wynikach Google.

Gdzie wkleić JSON-LD w WordPressie?

Najprościej w treści wpisu w edytorze kodu (blok „Własny HTML” w Gutenbergu) albo w widgecie HTML Elementora. Blok może być w treści, nie musi być w <head> — Google czyta całą stronę.

Jak sprawdzić, czy Google widzi moją schemę?

Test wyników z elementami rozszerzonymi dla pojedynczej strony, Search Console → Ulepszenia dla całej witryny. Pełny graf, także typy bez rozszerzonych wyników, pokazuje validator.schema.org.

Źródła

Powiązane w notatniku: słownik SEO, słownik techniczny, GEO — widoczność w AI.

// tagi: #schema markup #dane strukturalne #JSON-LD #SEO #GEO #Yoast

— MK · wróć do notatnika

← wszystkie tematy notatnika

Wcześniej w notatniku

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *

Kto to pisze

Mateusz Kwiecień. Prowadzę z żoną sklep kwiecien.academy i testuję na nim reklamę online oraz SEO — za własne pieniądze. Ten notatnik to zapis tych testów: liczby, wnioski i błędy. Pomylę się — poprawiam wpis, nie kasuję.

Najnowsze wpisy

Kampania pali budżet?

Masz pytanie, którego nie ma w notatniku? Napisz — sprawdzę u siebie i dopiszę. Bez „szanowny specjalisto” i bez formularza z dwunastoma polami.