Dane strukturalne w Shopify: co działa, co trzeba dodać ręcznie

Dane strukturalne na Shopify: co dostajesz, a czego nie

Shopify chwali się, że “generuje dane strukturalne automatycznie”. Technicznie to prawda. Praktycznie to trochę tak, jakby ktoś powiedział, że samochód “ma silnik”. Ma. Tyle że brakuje skrzyni biegów, układu hamulcowego i kilku innych drobiazgów.

Domyślne motywy Shopify generują podstawowy zestaw znaczników Schema.org. Wystarczy to, żeby w dokumentacji zaznaczyć “tak, mamy dane strukturalne”. Nie wystarczy, żeby Twoje produkty wyświetlały się w Google z gwiazdkami, breadcrumbsami i ceną. Do tego potrzeba ręcznej pracy w Liquid albo odpowiedniej aplikacji.

W tym artykule wyjaśniam, co Shopify generuje samo, czego brakuje i jak uzupełnić te braki kodem lub aplikacjami. Jeśli prowadzisz sklep na Shopify i chcesz, żeby Twoje produkty wyświetlały się w Google z gwiazdkami, ceną, dostępnością i breadcrumbs, ten artykuł jest dla Ciebie.

Co Shopify generuje automatycznie

Zanim zaczniesz cokolwiek dodawać, warto wiedzieć, co już masz. Zakres automatycznie generowanych danych strukturalnych zależy od motywu, ale większość oficjalnych motywów Shopify (Dawn, Refresh, Sense) dostarcza dwa podstawowe typy.

Product

Domyślny znacznik Product w motywach Shopify zawiera:

  • name (nazwa produktu)
  • image (główne zdjęcie)
  • description (opis produktu)
  • brand (producent, jeśli ustawiony w metafields)
  • offers z price, priceCurrency i availability

To solidna baza. Google może na jej podstawie wyświetlić cenę i dostępność w wynikach wyszukiwania. Problem pojawia się przy produktach z wariantami. Domyślny markup zwykle opisuje tylko jeden wariant (najczęściej pierwszy lub najtańszy), zamiast uwzględniać pełen zakres cen i dostępności.

Organization

Na stronie głównej Shopify generuje podstawowy znacznik Organization z nazwą sklepu, logo i adresem URL. To minimalna informacja, która pozwala Google poprawnie zidentyfikować Twoją firmę w Knowledge Panel, ale brakuje w niej danych kontaktowych, profili społecznościowych i lokalizacji.

WebSite z SearchAction

Niektóre nowsze motywy dodają znacznik WebSite z SearchAction, który umożliwia wyświetlenie pola wyszukiwania bezpośrednio w wynikach Google (sitelinks search box). To miły dodatek, ale działa tylko dla sklepów z wystarczającym autorytetem domeny.

Czego Shopify nie generuje (a powinien)

Lista brakujących typów danych strukturalnych jest dłuższa niż lista tego, co dostajesz automatycznie. Oto najważniejsze braki.

Shopify wyświetla breadcrumbs wizualnie (Home > Kolekcja > Produkt), ale wiele motywów nie generuje odpowiadającego im znacznika BreadcrumbList w JSON-LD. Bez tego Google nie wyświetli ścieżki nawigacyjnej w wynikach wyszukiwania. To strata, bo breadcrumbs w SERP poprawiają CTR i pomagają użytkownikom zrozumieć kontekst strony przed kliknięciem.

FAQPage

Jeśli Twoje strony produktowe lub kolekcje zawierają sekcje pytań i odpowiedzi, Google może wyświetlić je jako rozszerzone wyniki (FAQ rich results). Ale potrzebuje do tego znacznika FAQPage. Shopify nie generuje go automatycznie, nawet jeśli masz na stronie sekcję FAQ w formacie pytanie-odpowiedź.

AggregateRating

Shopify nie ma natywnego systemu recenzji. Jeśli używasz aplikacji do zbierania opinii (Judge.me, Stamped, Loox), to aplikacja odpowiada za dodanie znacznika AggregateRating. Problem: nie każda aplikacja robi to poprawnie. Część dodaje osobny blok JSON-LD z oceną, zamiast zintegrować go z istniejącym znacznikiem Product. Google widzi wtedy dwa oddzielne znaczniki i nie zawsze poprawnie je łączy.

Szczegółowy Product z wariantami

Domyślny markup Product w Shopify traktuje produkt jako jedną ofertę. W rzeczywistości wiele produktów ma warianty (rozmiary, kolory, konfiguracje), z których każdy ma inną cenę, SKU i dostępność. Zgodnie z wytycznymi Google, każdy wariant powinien być opisany jako osobny obiekt Offer wewnątrz Product. Bez tego Google nie wie, że Twoja koszulka jest dostępna w rozmiarach S-XL w cenach od 89 do 129 zł.

CollectionPage i ItemList

Strony kolekcji (kategorii) w Shopify wyświetlają listę produktów, ale nie generują znacznika CollectionPage ani ItemList. Google może wykorzystać ItemList do wyświetlenia karuzeli produktów bezpośrednio w wynikach wyszukiwania. Bez tego znacznika tracisz tę szansę.

Article / BlogPosting

Wpisy blogowe na Shopify nie mają automatycznego znacznika Article ani BlogPosting. Dla sklepów, które inwestują w content marketing, to oznacza, że Google nie widzi ich artykułów jako pełnoprawnych treści redakcyjnych z datą publikacji, autorem i obrazem.

Jak dodać brakujące dane strukturalne w Liquid

Dane strukturalne w Shopify dodajesz jako bloki JSON-LD w szablonach Liquid. Najlepsze miejsce to plik theme.liquid (globalny wrapper) lub dedykowane snippety inkludowane w odpowiednich szablonach.

Ten snippet dodaje breadcrumbs ze ścieżką Strona główna > Kolekcja > Produkt. Umieść go w szablonie produktowym (np. sections/main-product.liquid) lub w globalnym theme.liquid z warunkiem na typ szablonu.

breadcrumb-schema.liquid
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

{% if template contains 'product' %}
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "position": 1,
      "name": "Strona główna",
      "item": "{{ shop.url }}"
    }{% if collection %},
    {
      "@type": "ListItem",
      "position": 2,
      "name": "{{ collection.title | escape }}",
      "item": "{{ shop.url }}{{ collection.url }}"
    },
    {
      "@type": "ListItem",
      "position": 3,
      "name": "{{ product.title | escape }}"
    }
    {% else %},
    {
      "@type": "ListItem",
      "position": 2,
      "name": "{{ product.title | escape }}"
    }
    {% endif %}
  ]
}
</script>
{% endif %}

Zwróć uwagę na dwa szczegóły. Po pierwsze, ostatni element breadcrumb nie ma pola item z URL-em, bo reprezentuje bieżącą stronę (zgodnie z wytycznymi Google). Po drugie, filtr | escape zabezpiecza przed znakami specjalnymi w nazwach produktów, które mogłyby zepsuć JSON.

Product z wariantami i Offers

Domyślny markup Product w Shopify opisuje zwykle jeden wariant. Poniższy snippet generuje kompletny znacznik z wieloma ofertami:

product-variants-schema.liquid
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

{% if template contains 'product' %}
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "{{ product.title | escape }}",
  "image": [
    {% for image in product.images %}
      "https:{{ image | image_url: width: 1200 }}"{% unless forloop.last %},{% endunless %}
    {% endfor %}
  ],
  "description": {{ product.description | strip_html | strip_newlines | json }},
  {% if product.vendor != blank %}
  "brand": {
    "@type": "Brand",
    "name": "{{ product.vendor | escape }}"
  },
  {% endif %}
  "sku": "{{ product.selected_or_first_available_variant.sku | escape }}",
  {% if product.metafields.reviews.rating.value != blank %}
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "{{ product.metafields.reviews.rating.value }}",
    "reviewCount": "{{ product.metafields.reviews.rating_count.value }}"
  },
  {% endif %}
  "offers": [
    {% for variant in product.variants %}
    {
      "@type": "Offer",
      "url": "{{ shop.url }}{{ variant.url }}",
      "priceCurrency": "{{ cart.currency.iso_code }}",
      "price": "{{ variant.price | money_without_currency | remove: ' ' }}",
      "availability": "{% if variant.available %}https://schema.org/InStock{% else %}https://schema.org/OutOfStock{% endif %}",
      "sku": "{{ variant.sku | escape }}",
      "name": "{{ variant.title | escape }}"
    }{% unless forloop.last %},{% endunless %}
    {% endfor %}
  ]
}
</script>
{% endif %}

Jeśli używasz tego snippetu, musisz usunąć domyślny znacznik Product, który generuje Twój motyw. W przeciwnym razie Google zobaczy dwa znaczniki Product na jednej stronie i może je źle zinterpretować. W większości motywów domyślny markup znajdziesz w pliku snippets/product-schema.liquid lub bezpośrednio w sections/main-product.liquid.

FAQPage z metafields

Zamiast hardkodować pytania i odpowiedzi w szablonie, lepiej zarządzać nimi z poziomu panelu Shopify przez metafields. Stwórz definicję metafield typu JSON dla produktu lub strony, a następnie wygeneruj znacznik dynamicznie:

faq-schema.liquid
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22

{% assign faq_data = product.metafields.custom.faq.value %}
{% if faq_data != blank %}
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {% for item in faq_data %}
    {
      "@type": "Question",
      "name": {{ item.question | json }},
      "acceptedAnswer": {
        "@type": "Answer",
        "text": {{ item.answer | json }}
      }
    }{% unless forloop.last %},{% endunless %}
    {% endfor %}
  ]
}
</script>
{% endif %}

To podejście wymaga skonfigurowania metafield o kluczu custom.faq z typem JSON list. Każdy element listy to obiekt z polami question i answer. Dzięki temu możesz dodawać i edytować pytania FAQ bezpośrednio w panelu Shopify, bez dotykania kodu motywu.

Article dla wpisów blogowych

article-schema.liquid
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

{% if template contains 'article' %}
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Article",
  "headline": {{ article.title | json }},
  "image": "{% if article.image %}https:{{ article.image | image_url: width: 1200 }}{% endif %}",
  "datePublished": "{{ article.published_at | date: '%Y-%m-%dT%H:%M:%S%z' }}",
  "dateModified": "{{ article.updated_at | date: '%Y-%m-%dT%H:%M:%S%z' }}",
  "author": {
    "@type": "Person",
    "name": "{{ article.author }}"
  },
  "publisher": {
    "@type": "Organization",
    "name": "{{ shop.name | escape }}",
    "logo": {
      "@type": "ImageObject",
      "url": "https:{{ 'logo.png' | asset_url }}"
    }
  },
  "description": {{ article.excerpt_or_content | strip_html | truncate: 160 | json }}
}
</script>
{% endif %}

Ważna uwaga: nie duplikuj znaczników

To najczęstszy błąd, jaki widuję. I jednocześnie najłatwiejszy do popełnienia. Motyw generuje swój znacznik Product, właściciel sklepu dodaje drugi z tutorialu na YouTube, aplikacja recenzji dorzuca trzeci. Google widzi trzy konkurujące ze sobą bloki JSON-LD i robi jedyną logiczną rzecz: ignoruje wszystkie.

Robiłem audyt sklepu, który miał cztery bloki Product na jednej stronie. Cztery. Motyw, aplikacja SEO, aplikacja recenzji i ręcznie wklejony snippet z czyjegoś bloga. Rich Results Test świecił się na czerwono jak choinka.

Zanim dodasz jakikolwiek nowy snippet, sprawdź:

  • co generuje Twój motyw (poszukaj application/ld+json w kodzie źródłowym strony)
  • co generują zainstalowane aplikacje (szczególnie aplikacje recenzji, SEO i danych strukturalnych)
  • czy nowy snippet nie pokrywa się z istniejącymi

Zasada jest prosta: jeden typ znacznika na jednej stronie. Jeśli motyw generuje Product, nie dodawaj drugiego Product. Zamiast tego zmodyfikuj istniejący snippet motywu, żeby zawierał brakujące pola.

Aplikacje do danych strukturalnych na Shopify

Nie każdy chce (lub potrafi) edytować szablony Liquid. Aplikacje z Shopify App Store potrafią dodać brakujące dane strukturalne bez ingerencji w kod. Trzy, które warto rozważyć:

Smart SEO

Smart SEO automatycznie generuje znaczniki JSON-LD dla produktów, kolekcji i artykułów blogowych. Główna zaleta: konfiguracja w jednym miejscu, bez edycji kodu. Aplikacja pozwala wybrać, które typy danych strukturalnych mają być generowane, i automatycznie uzupełnia pola na podstawie danych z Shopify. Obsługuje Product, BreadcrumbList, Organization, Article i FAQPage. Wadą jest mniejsza kontrola nad szczegółami znacznika w porównaniu z ręczną implementacją w Liquid.

Schema Plus SEO

Bardziej zaawansowana aplikacja, która pozwala na konfigurację per typ strony i per produkt. Generuje kompletne znaczniki Product z wariantami, AggregateRating (integracja z popularnymi aplikacjami recenzji), BreadcrumbList i FAQPage. Daje też podgląd generowanego JSON-LD, co ułatwia debugowanie.

JSON-LD for SEO (by Little Stream Software)

Najstarsza i najdojrzalsza aplikacja w tej kategorii. Obsługuje ponad 20 typów danych strukturalnych, w tym Product, BreadcrumbList, FAQPage, HowTo, Recipe, LocalBusiness i wiele innych. Automatycznie integruje się z popularnymi aplikacjami recenzji (Judge.me, Stamped, Loox, Yotpo) i dodaje AggregateRating do znacznika Product bez duplikacji.

Kiedy aplikacja, a kiedy Liquid

Aplikacja ma sens, gdy:

  • nie masz dewelopera, który zna Liquid
  • chcesz szybko dodać podstawowe dane strukturalne bez ryzyka błędów w kodzie
  • potrzebujesz integracji z wieloma aplikacjami (recenzje, FAQ, przepisy)

Ręczna implementacja w Liquid ma sens, gdy:

  • potrzebujesz pełnej kontroli nad generowanym znacznikiem
  • Twój sklep ma niestandardową architekturę, której aplikacja nie obsługuje
  • chcesz uniknąć dodatkowych skryptów i zapytań HTTP, które generują aplikacje

Testowanie i walidacja

Po dodaniu danych strukturalnych (bez względu na metodę) musisz je przetestować. Dwa narzędzia, których potrzebujesz:

Google Rich Results Test

Wklej URL swojej strony na search.google.com/test/rich-results. Narzędzie pokaże, które typy danych strukturalnych wykryło, czy są poprawne i czy kwalifikują się do rozszerzonych wyników. To jedyne narzędzie, które mówi Ci, czy Google faktycznie wykorzysta Twoje dane strukturalne.

Testuj osobno:

  • stronę produktu (czy Product zawiera cenę, dostępność, warianty)
  • stronę kolekcji (czy BreadcrumbList jest poprawny)
  • wpis blogowy (czy Article zawiera datę, autora, obraz)
  • stronę z FAQ (czy FAQPage zawiera wszystkie pytania)

Schema Markup Validator

Narzędzie od Schema.org (validator.schema.org) sprawdza poprawność składniową JSON-LD. Nie mówi Ci, czy Google wyświetli rozszerzone wyniki, ale wykryje błędy w strukturze JSON, brakujące wymagane pola i niepoprawne typy danych. Przydatne do debugowania, gdy Rich Results Test zgłasza błędy, ale nie podaje szczegółów.

Regularna kontrola w Search Console

Po wdrożeniu danych strukturalnych dodaj stronę do Google Search Console i monitoruj raport “Ulepszenia” (Enhancements). Google pokazuje tam status danych strukturalnych per typ: ile stron ma poprawne znaczniki, ile ma błędy, ile ma ostrzeżenia. Reaguj na błędy natychmiast, bo Google ignoruje dane strukturalne ze stronami, na których wykryje niepoprawności.

Typowe błędy przy wdrażaniu

Kilka problemów, które widzę regularnie w sklepach Shopify:

  • zduplikowane znaczniki Product - motyw generuje swój, aplikacja recenzji dodaje kolejny, właściciel wkleił trzeci z tutorialu; Google widzi trzy i nie wie, który jest poprawny
  • brakujący availability - znacznik Product bez informacji, czy produkt jest w magazynie; Google wymaga tego pola do wyświetlenia rozszerzonych wyników produktowych
  • hardkodowane ceny w JSON-LD - zamiast dynamicznego {{ variant.price }} ktoś wpisał stałą cenę, która nie aktualizuje się ze zmianą ceny produktu
  • niepoprawny format ceny - Shopify zwraca ceny w groszach (np. 9900 zamiast 99.00) w niektórych kontekstach; filtr | money_without_currency rozwiązuje ten problem, ale nie każdy o tym wie
  • brak filtra escape w nazwach - produkt z cudzysłowem w nazwie (np. Koszulka “Premium”) łamie składnię JSON; filtr | json lub | escape to naprawia

Czy dane strukturalne wpływają na pozycje

Wprost? Nie. Google mówi to jasno w swojej dokumentacji: dane strukturalne nie są czynnikiem rankingowym. Dodanie znacznika Product nie przesunie Twojego produktu z pozycji 15 na pozycję 5. Da się? Nie da się. Tyle w temacie.

Ale dane strukturalne wpływają na wygląd Twojego wyniku w SERP. Produkt z gwiazdkami ocen, ceną “od 89 zł” i informacją “W magazynie” zajmuje więcej miejsca i przyciąga więcej uwagi niż goły link. Wyższy CTR to więcej ruchu. Więcej ruchu przy dobrej jakości strony to pozytywny sygnał dla Google. To pośredni, ale realny wpływ.

Dla sklepów na Shopify, które konkurują z marketplace’ami (Allegro, Amazon) w wynikach wyszukiwania, rozszerzone wyniki to jedno z niewielu narzędzi wyrównywania szans. Gdy użytkownik widzi Twój produkt z pełnymi danymi obok wyniku Allegro, prawdopodobieństwo kliknięcia w Twój wynik rośnie.

Więcej o tym, jak budować widoczność organiczną na Shopify, znajdziesz na naszej stronie usługi SEO dla Shopify. Jeśli interesuje Cię szerszy kontekst ograniczeń platformy, przeczytaj artykuł o ograniczeniach SEO na Shopify i sposobach ich obejścia.

FAQ

Czy Shopify automatycznie dodaje dane strukturalne do produktów?

Tak, ale w ograniczonym zakresie. Domyślne motywy generują podstawowy znacznik Product z nazwą, ceną i dostępnością. Brakuje w nim zwykle wariantów jako osobnych ofert, breadcrumbs, FAQ, ocen zbiorczych i szczegółowych informacji o marce. Te elementy trzeba dodać ręcznie w Liquid lub za pomocą aplikacji.

Czy aplikacja do danych strukturalnych może kolidować z motywem?

Tak, i to jest częsty problem. Jeśli motyw generuje własny znacznik Product, a aplikacja dodaje kolejny, Google widzi dwa znaczniki tego samego typu na jednej stronie. Przed instalacją aplikacji sprawdź, jakie dane strukturalne generuje Twój motyw (View Page Source > szukaj application/ld+json), i wyłącz znaczniki motywu, które aplikacja będzie zastępować.

Jak sprawdzić, czy moje dane strukturalne działają poprawnie?

Użyj Google Rich Results Test (search.google.com/test/rich-results) - wklej URL dowolnej strony produktowej i sprawdź, czy narzędzie wykrywa typ Product z wszystkimi wymaganymi polami. Dodatkowo monitoruj raport “Ulepszenia” w Google Search Console, który pokazuje status danych strukturalnych dla całego sklepu, a nie tylko dla pojedynczej strony.

Czy warto dodawać FAQPage do stron produktowych?

Tak, pod warunkiem że FAQ dotyczy tego konkretnego produktu, a nie jest kopią identycznych pytań na każdej stronie. Google jasno mówi, że treści FAQ muszą być widoczne na stronie dla użytkownika (nie ukryte w kodzie) i nie mogą się powtarzać masowo na wielu stronach. Dobrze przygotowany FAQ na stronie produktu odpowiada na realne pytania kupujących i jednocześnie kwalifikuje się do rozszerzonych wyników w Google.

Ile czasu zajmuje, zanim Google wyświetli rozszerzone wyniki po dodaniu danych strukturalnych?

Od kilku dni do kilku tygodni, w zależności od częstotliwości crawlowania Twojego sklepu. Po dodaniu znaczników wymuś ponowne indeksowanie strony w Google Search Console (Inspection > Request Indexing). Następnie monitoruj raport “Ulepszenia”, żeby zobaczyć, czy Google rozpoznał nowe dane strukturalne. Pojawienie się rozszerzonych wyników w SERP może zająć dodatkowe dni po zaindeksowaniu, bo Google testuje różne formaty wyświetlania.

Chcesz sprawdzić dane strukturalne w Shopify?

Przejrzymy motyw, aplikacje i JSON-LD, a potem wskażemy, co blokuje rich results i indeksację produktów.

Gotowy na strategiczne partnerstwo w marketingu cyfrowym?

Porozmawiajmy o Twoich wyzwaniach i celach. Opracujemy dopasowaną strategię i plan działania, które przyniosą mierzalne rezultaty dla Twojego e-commerce lub instytucji.