Strukturyzowane dane Schema.org dla produktów — pełny przewodnik z przykładami
Szczegółowy przewodnik po strukturyzowanym oznaczaniu Schema.org dla sklepów internetowych: JSON-LD, obowiązkowe pola, przykłady, walidacja, częste błędy i zalecenia. Wszystko, czego potrzebujesz do rozszerzonych fragmentów produktów w wynikach wyszukiwania.
📖 Spis treści
- Czym jest Schema.org i dlaczego jest potrzebne
- Jaki format oznaczania użyć
- Pola obowiązkowe dla karty produktu
- Pełna lista zalecanych pól
- Prosty przykład JSON-LD (minimum)
- Pełne oznaczanie produktu (GTIN, brand, SKU, oceny, opinie)
- Produkty wariantowe (rozmiar/kolor)
- BreadcrumbList (okruszki nawigacyjne)
- Oceny produktów (aggregateRating)
- Opinie klientów (review)
- Narzędzia sprawdzania i walidacji
- Best practices i zalecenia
- Częste błędy i jak je naprawić
- Szablon do dynamicznego wstawiania
- Często zadawane pytania (FAQ)
1. Czym jest Schema.org i dlaczego jest potrzebne
Schema.org — to słownik (schemat niezależny od dostawcy) dla strukturyzowanych danych, wspierany przez główne wyszukiwarki (Google, Yandex, Bing, Yahoo). Oznaczanie pomaga wyszukiwarkom prawidłowo zrozumieć zawartość karty produktu i może prowadzić do rozszerzonych fragmentów (cena, dostępność, ocena, opinie, zdjęcia), a także prawidłowego wyświetlania w mediach społecznościowych przez Open Graph i Twitter Cards.
Strukturyzowane dane to ustandaryzowany format przekazywania informacji o stronie i jej zawartości. Wyszukiwarki używają tych danych do poprawy wyników wyszukiwania: fragmenty produktowe z ceną i dostępnością, oceny gwiazdkowe, okruszki nawigacyjne i wiele innych.
Oficjalne linki:
2. Jaki format oznaczania użyć
Google zaleca JSON-LD (JavaScript Object Notation for Linked Data). Ten format nie ingeruje w DOM, łatwo go wstawić serwerowo i dynamicznie generować z danych BD. JSON-LD to blok <script> z typem application/ld+json, umieszczany w <head> lub <body> strony.
Istniejące formaty oznaczania:
- JSON-LD (zalecany) — osobny blok skryptu, nie wpływa na układ
- Microdata — atrybuty w tagach HTML (itemscope, itemtype, itemprop)
- RDFa — rozszerzone atrybuty do łączenia danych
Dla sklepu internetowego wybierz JSON-LD — to najbardziej elastyczny i wspierany format.
3. Pola obowiązkowe dla poprawnej karty produktu
Minimalny zestaw pól niezbędny do poprawnego przetwarzania przez Google i wyświetlania rozszerzonego fragmentu:
- name — nazwa produktu
- image — co najmniej jeden obraz (URL)
- description — krótki opis (1-2 zdania)
- offers.price — cena (liczba, bez symbolu waluty)
- offers.priceCurrency — waluta (ISO 4217, np. UAH, USD, EUR)
- offers.availability — dostępność (pełny URL z schema.org, np.
https://schema.org/InStock) - offers.url — URL strony produktu (kanoniczny)
4. Pełna lista zalecanych pól
- sku — SKU (wewnętrzny kod produktu)
- mpn — manufacturer part number (kod producenta)
- gtin8 / gtin12 / gtin13 / gtin14 — kod kreskowy (GTIN-8, GTIN-12, GTIN-13, GTIN-14)
- brand — marka (obiekt Brand z polem name)
- category — kategoria produktu
- color, material, size, weight — cechy fizyczne
- aggregateRating — zbiorcza ocena (AggregateRating)
- review — opinie (tablica Review)
- itemCondition — stan produktu (NewCondition, UsedCondition itp.)
- additionalProperty — dowolne właściwości (PropertyValue)
- shippingDetails / OfferShippingDetails — warunki i koszt dostawy
- seller — organizacja sprzedawcy (Organization)
- offers.priceValidUntil — data ważności ceny
5. Prosty działający przykład JSON-LD (minimum)
Podstawowy przykład oznaczania produktu z obowiązkowymi polami:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Wireless Headphones X100",
"image": "https://site.com/images/headphones-x100.jpg",
"description": "Bezprzewodowe słuchawki z redukcją szumów.",
"offers": {
"@type": "Offer",
"url": "https://site.com/product/headphones-x100",
"priceCurrency": "UAH",
"price": "2499",
"availability": "https://schema.org/InStock"
}
}
</script>
Ważne: price wysyłaj jako liczbę lub ciąg cyfr (bez symbolu waluty). availability używaj pełnego URL z schema.org (np. https://schema.org/InStock).
6. Pełne oznaczanie produktu (GTIN, brand, SKU, oceny, opinie)
Poniżej — rozszerzone oznaczanie z wieloma polami: GTIN, marka, SKU, wiele obrazów, aggregateRating, review, additionalProperty, shippingDetails, seller. To najbardziej kompletny przykład, który można dostosować do dowolnego sklepu internetowego.
<script type="application/ld+json">
{
"@context": "https://schema.org/",
"@type": "Product",
"name": "Xiaomi Mi Band 7",
"image": [
"https://site.com/upload/mi-band-7-1.webp",
"https://site.com/upload/mi-band-7-2.webp"
],
"description": "Fitness opaska z ekranem AMOLED i pulsometrem.",
"sku": "MI-BAND-7-BLACK",
"mpn": "MB7-2025",
"gtin13": "6954176850021",
"brand": {
"@type": "Brand",
"name": "Xiaomi"
},
"additionalProperty": [
{
"@type": "PropertyValue",
"name": "Kolor",
"value": "Czarny"
},
{
"@type": "PropertyValue",
"name": "Materiał",
"value": "Silikon, metal"
}
],
"offers": {
"@type": "Offer",
"url": "https://site.com/product/mi-band-7/",
"priceCurrency": "UAH",
"price": "1499",
"priceValidUntil": "2026-12-31",
"availability": "https://schema.org/InStock",
"itemCondition": "https://schema.org/NewCondition",
"seller": {
"@type": "Organization",
"name": "BooStore.pro"
},
"shippingDetails": {
"@type": "OfferShippingDetails",
"shippingRate": {
"@type": "MonetaryAmount",
"value": "50"
}
}
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.8",
"reviewCount": "238"
},
"review": [
{
"@type": "Review",
"author": "Olena",
"datePublished": "2025-02-10",
"reviewBody": "Świetna opaska, działa stabilnie!",
"reviewRating": {
"@type": "Rating",
"ratingValue": "5"
}
}
]
}
</script>
W tym przykładzie pokazano: podstawowe informacje o produkcie, cechy przez additionalProperty, szczegółowe informacje o ofercie (cena, waluta, dostępność, stan, sprzedawca, dostawa), oceny i opinie.
Typ Product — główny typ Schema.org do opisu produktu. Zawiera nazwę, opis, obrazy, atrybuty (marka, GTIN, SKU) oraz zagnieżdżone typy Offer, AggregateRating, Review.
Typ Offer — opis oferty handlowej: cena, waluta, dostępność, stan, warunki dostawy, sprzedawca.
Typ AggregateRating — zbiorcza ocena produktu na podstawie wszystkich opinii.
Typ Review — pojedyncza opinia klienta z autorem, datą, tekstem i oceną.
Typ BreadcrumbList — łańcuch nawigacyjny (okruszki), pokazujący ścieżkę od strony głównej do bieżącego produktu.
7. Produkty wariantowe (rozmiar/kolor) — podejścia
Są dwa popularne podejścia do oznaczania produktów z wariantami (kolor, rozmiar, materiał):
- Jeden Product + tablica offers — jeśli wszystkie warianty są na jednej stronie. Każdy Offer zawiera własną cenę, dostępność i atrybuty wariantu.
- Wiele Product — jeśli każdy wariant ma osobną stronę/URL.
Przykład: Product z dwoma Offer (różne kolory, jedna strona):
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "T-shirt Classic",
"image": ["https://site.com/img/tshirt-red.jpg"],
"description": "Klasyczny t-shirt z bawełny",
"sku": "TSHIRT-001",
"brand": {"@type": "Brand", "name": "BrandCo"},
"offers": [
{
"@type": "Offer",
"sku": "TSHIRT-001-RED",
"price": "599",
"priceCurrency": "UAH",
"availability": "https://schema.org/InStock",
"itemCondition": "https://schema.org/NewCondition"
},
{
"@type": "Offer",
"sku": "TSHIRT-001-BLUE",
"price": "599",
"priceCurrency": "UAH",
"availability": "https://schema.org/OutOfStock",
"itemCondition": "https://schema.org/NewCondition"
}
]
}
</script>
Przy użyciu tablicy offers każdy element musi zawierać własny @type ("Offer"), cenę, walutę i status dostępności.
8. BreadcrumbList (okruszki nawigacyjne) — nawigacja
Okruszki nawigacyjne pomagają wyszukiwarkom pokazać strukturę strony we fragmencie i poprawiają nawigację użytkownika. Zaleca się umieszczanie BreadcrumbList na każdej stronie produktu razem z Product.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Strona główna",
"item": "https://site.com/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Kategoria: Opaski",
"item": "https://site.com/category/bracelets"
},
{
"@type": "ListItem",
"position": 3,
"name": "Xiaomi Mi Band 7",
"item": "https://site.com/product/mi-band-7/"
}
]
}
</script>
Każdy element tablicy itemListElement to obiekt typu ListItem z polami position (numer kolejny), name (nazwa) i item (URL).
9. Oceny produktów (aggregateRating)
Oceny pozwalają wyświetlać średnią ocenę produktu i liczbę opinii w rozszerzonym fragmencie. Zwiększa to zaufanie użytkowników i CTR z wyników wyszukiwania.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Wireless Headphones X100",
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.7",
"reviewCount": "154"
}
}
</script>
Zalecenie: ratingValue — liczba z separatorem dziesiętnym (np. 4.7), reviewCount — liczba całkowita. Nie podawaj fałszywych ocen — Google może nałożyć sankcje.
Dodatkowo można podać bestRating (maksymalna ocena, domyślnie 5) i worstRating (minimalna ocena, domyślnie 1).
10. Opinie klientów (review)
Opinie pozwalają szczegółowo opisywać zdanie użytkowników o produkcie, w tym autora, datę publikacji, tekst i ocenę. Każda opinia to osobny obiekt Review w tablicy.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Wireless Headphones X100",
"review": [
{
"@type": "Review",
"author": "Olena",
"datePublished": "2025-05-10",
"reviewBody": "Bardzo wygodne słuchawki, świetny dźwięk!",
"reviewRating": {
"@type": "Rating",
"ratingValue": "5"
}
},
{
"@type": "Review",
"author": "Ihor",
"datePublished": "2025-05-12",
"reviewBody": "Dobre, ale trochę nieporęczne.",
"reviewRating": {
"@type": "Rating",
"ratingValue": "4"
}
}
]
}
</script>
Każda opinia zawiera autora (author), datę publikacji (datePublished), tekst (reviewBody) i ocenę (reviewRating). Można dodawać dowolną liczbę opinii, ale tylko prawdziwych.
11. Narzędzia sprawdzania i walidacji
- Google Rich Results Test — szybko pokazuje błędy i ostrzeżenia dla rich snippets. Pozwala sprawdzić URL lub wkleić kod ręcznie.
- Schema.org Validator — szczegółowa walidacja schematu od konsorcjum Schema.org.
- Google Search Console — w sekcji „Ulepszenia" → „Produkty" można śledzić błędy po publikacji.
- Yandex Webmaster — podobne narzędzie do sprawdzania danych strukturyzowanych.
12. Best practices i zalecenia
- Generuj JSON-LD na serwerze z BD — cena, dostępność, SKU, obrazy powinny być zsynchronizowane z treścią strony.
- Nie używaj testowych ani fałszywych danych w produkcji.
- Jeśli pokazujesz wiele cen (promocje, rabaty), używaj
priceValidUntili podawaj aktualną cenę woffers.price. - Podawaj
priceCurrencyw formacie ISO 4217 (UAH, USD, EUR, RUB). - Nie twórz konfliktowego oznaczania — cena w JSON-LD musi zgadzać się z widoczną ceną na stronie.
- Dla sklepów międzynarodowych podawaj locale, adres sprzedawcy i shippingDetails.
- Używaj
BreadcrumbListiProductrazem — to poprawia nawigację w wynikach. - Dodawaj co najmniej jeden obraz z poprawnym URL (dostępnym do indeksacji).
- Regularnie sprawdzaj oznaczanie przez Google Rich Results Test i Search Console.
- Więcej o poprawie SEO strony przeczytasz w artykule: Jak poprawić SEO strony — przewodnik.
- Do konfiguracji analityki i śledzenia eCommerce użyj materiału: Konfiguracja GA4 i analityki eCommerce.
13. Częste błędy i jak je naprawić
- Błąd: price zawiera symbol waluty (
2499 грн) — naprawa: przechowuj i wyświetlaj tylko cyfry, walutę podawaj wpriceCurrency. - Błąd: brak image lub uszkodzony link — naprawa: dodaj co najmniej 1 poprawny dostępny URL obrazu.
- Błąd: niepasujące URL — naprawa: używaj URL dokładnie bieżącej strony produktu w
offers.url. - Błąd: tablica review lub aggregateRating zawiera fałszywe dane — naprawa: pokazuj tylko prawdziwe opinie i oceny.
- Błąd: nieprawidłowy format availability — naprawa: używaj pełnego URL typu
https://schema.org/InStock. - Błąd: duplikowanie oznaczania (wiele bloków JSON-LD z konfliktowymi danymi) — naprawa: połącz wszystko w jeden blok.
- Błąd: brak breadcrumb na stronach produktów — naprawa: dodaj BreadcrumbList dla poprawy nawigacji w wynikach.
14. Szablon do dynamicznego wstawiania (PHP/Twig/Smarty)
Poniżej — szablon, w którym zmienne są zastępowane przez serwer. Podstaw swoje wartości zamiast %VAR%.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "%PRODUCT_NAME%",
"image": [%IMAGE_LIST%],
"description": "%SHORT_DESCRIPTION%",
"sku": "%SKU%",
"brand": {"@type": "Brand", "name": "%BRAND%"},
"offers": {
"@type": "Offer",
"url": "%PRODUCT_URL%",
"priceCurrency": "%CURRENCY%",
"price": "%PRICE%",
"priceValidUntil": "%PRICE_VALID_UNTIL%",
"availability": "%AVAILABILITY%"
}
}
</script>
❓ Często zadawane pytania (FAQ)
Czym jest Schema.org i jakie korzyści daje sklepowi internetowemu?
Schema.org — to słownik danych strukturyzowanych, wspierany przez Google, Yandex, Bing i Yahoo. Oznaczanie pomaga wyszukiwarkom rozumieć treść stron i wyświetlać rozszerzone fragmenty (cena, dostępność, ocena, opinie). Zwiększa to CTR z wyszukiwania i poprawia widoczność produktów.
Jaki format oznaczania najlepiej stosować?
Google zaleca JSON-LD. Nie wpływa na układ, łatwo generuje się go serwerowo, obsługuje wszystkie typy Schema.org i nie koliduje z oznaczeniem HTML. Microdata i RDFa uważane są za przestarzałe podejścia dla nowych projektów.
Czy trzeba dodawać wszystkie pola z przewodnika?
Nie. Do poprawnego rozszerzonego fragmentu wystarczy obowiązkowe minimum: name, image, description, offers.price, offers.priceCurrency, offers.availability, offers.url. Wszystkie pozostałe pola są zalecane i rozszerzają możliwości wyświetlania.
Czy można używać Schema.org dla produktów z wariantami (kolor, rozmiar)?
Tak. Jeśli warianty są na jednej stronie — użyj tablicy offers. Jeśli na różnych — utwórz osobny Product dla każdego wariantu. W obu przypadkach Google poprawnie przetwarza oznaczanie.
Jak sprawdzić, czy oznaczanie na mojej stronie działa poprawnie?
Użyj Google Rich Results Test (search.google.com/test/rich-results) — wklej URL lub kod oznaczania. Po publikacji śledź błędy w Google Search Console w sekcji „Ulepszenia" → „Produkty".
Czy trzeba dodawać oznaczanie ręcznie, jeśli strona jest na BooStore.pro?
Nie. BooStore.pro zawiera już wszystkie podstawowe mikrodane (Product, Offer, Price, Availability, BreadcrumbList, ImageObject, AggregateRating, Review). Dodatkowe pola (GTIN, MPN, brand) można dodać w razie potrzeby przez ustawienia platformy.