Modelowane listy odbiorców nie zawierają konkretnych osób, tylko prawdopodobieństwa. Wyjaśniam, jak powstają, gdzie ich szukać w panelu i jak czytać ich raporty.
Zdecydowana większość audytów technicznych, które robię, kończy się tym samym wnioskiem o danych strukturalnych: znaczniki są, walidator nie krzyczy, a mimo to wyciągnięcie z nich sensownego obrazu firmy wymaga zgadywania. Na jednej podstronie są trzy niezależne bloki JSON-LD, które nie wiedzą o sobie nawzajem. Nazwa firmy występuje w czterech wariantach. Adres jest raz w znaczniku, raz w stopce i te dwie wersje się różnią.
Dawniej to nie miało większego znaczenia. Znacznik służył do jednej rzeczy: żeby dostać wynik rozszerzony. Jeśli gwiazdki się wyświetliły, robota była skończona. Dziś ten sam znacznik jest czytany przez systemy, które nie mają zamiaru pokazywać gwiazdek — mają zbudować z niego zdanie w odpowiedzi.
Ten tekst jest o warstwie technicznej: jak fizycznie ułożyć dane, żeby maszyna nie musiała ich rekonstruować. O tym, które typy warto oznaczać, piszę osobno — tutaj zakładam, że wybór typów już masz i chodzi o jakość samej implementacji.
Rozbijmy to na coś sprawdzalnego, bo samo hasło niewiele znaczy.
Dane są odczytywalne natychmiast, kiedy trafiają do odbiorcy w pierwszej odpowiedzi serwera, bez konieczności uruchamiania czegokolwiek. To jest cała definicja i jednocześnie największy problem współczesnych wdrożeń: bardzo dużo znaczników jest dokładanych po stronie klienta, przez skrypt lub przez menedżera tagów.
Googlebot renderuje strony i taki znacznik zwykle zobaczy — z opóźnieniem, ale zobaczy. Kłopot jest w tym, że Googlebot przestał być jedynym odbiorcą. Crawlery, które zasilają odpowiedzi generatywne, bardzo różnią się między sobą tym, na ile potrafią i chcą wykonywać JavaScript. Część po prostu pobiera dokument. Jeżeli Twoje dane strukturalne żyją w skrypcie, dla części odbiorców one nie istnieją.
Stąd pierwsza reguła, którą stosuję bez wyjątków: JSON-LD wychodzi z serwera razem z HTML-em. Wstrzykiwanie znaczników przez menedżera tagów traktuję jako rozwiązanie awaryjne na czas, gdy dział IT nie ma wolnych rąk, a nie jako architekturę. Sprawdzenie jest banalne — podglądam źródło strony bez renderowania i patrzę, czy blok tam jest.
Typowa strona sklepu ma dziś kilka osobnych bloków JSON-LD: jeden od motywu, jeden od wtyczki SEO, jeden od wtyczki opinii, czasem jeszcze jeden dorzucony ręcznie. Każdy jest formalnie poprawny. Razem nie tworzą żadnej całości.
Maszyna dostaje wtedy zbiór niepowiązanych obiektów i musi sama zgadnąć, że firma z jednego bloku i sprzedawca z drugiego to ta sama organizacja. Czasem zgadnie. Częściej po prostu potraktuje je jako niezależne byty i skorzysta z tego, który wygląda kompletniej.
Rozwiązaniem jest jeden blok z tablicą powiązanych obiektów i jawnymi identyfikatorami. Każdy obiekt dostaje własny, stały identyfikator w postaci adresu URL z fragmentem, a pozostałe obiekty odwołują się do niego przez ten identyfikator, zamiast powtarzać jego zawartość. Organizacja jest opisana raz, w jednym miejscu w serwisie, i wszystko inne na nią wskazuje.
Dwie zasady, których pilnuję przy porządkowaniu:
Sam opis w znaczniku mówi, jak firma się nazywa. Nie mówi, o którą z pięciu firm o podobnej nazwie chodzi. To rozstrzyga dopiero powiązanie z identyfikatorami, które istnieją poza Twoim serwisem.
Praktycznie oznacza to uzupełnienie właściwości wskazujących na zewnętrzne profile i rejestry: oficjalne konta w serwisach społecznościowych, wpisy w bazach wiedzy, numery rejestrowe, identyfikator w rejestrze przedsiębiorców. Nie chodzi o długość listy, a o to, żeby prowadziła do miejsc, w których dane są takie same jak u Ciebie.
Najczęstszy błąd w tej warstwie jest przyziemny: rozjazd między znacznikiem a resztą świata. Znacznik podaje nazwę w wersji rejestrowej, wizytówka firmy w Google w wersji handlowej, faktura w trzeciej. Dla człowieka to oczywiste, że to jedna firma. Dla systemu, który buduje obraz podmiotu z wielu źródeł, to trzy słabe sygnały zamiast jednego mocnego. Ujednolicenie nazwy i adresu w całej infrastrukturze daje więcej niż dopisanie kolejnych pól.
To reguła, która obowiązywała od zawsze, ale konsekwencje jej łamania są dziś inne.
Kiedy znacznik służył tylko do wyniku rozszerzonego, rozjazd między nim a treścią kończył się utratą wyróżnienia w wynikach. Teraz dane z znacznika mogą trafić do odpowiedzi, którą użytkownik czyta zamiast strony. Jeśli oznaczona cena różni się od ceny na stronie, użytkownik zobaczy jedną, a zapłaci drugą — i to nie jest problem SEO, tylko problem obsługi klienta.
Dlatego przy każdym wdrożeniu sprawdzam trzy pary: cenę i dostępność w znaczniku wobec karty produktu, ocenę i liczbę opinii wobec tego, co widać w sekcji opinii, oraz dane kontaktowe wobec stopki. W sklepach z częstą zmianą cen dokładam jeszcze pytanie o to, kiedy znacznik jest generowany — jeżeli strona produktu jest agresywnie cache’owana, a ceny zmieniają się kilka razy dziennie, rozjazd jest kwestią czasu.
Kilka rzeczy, które poprawiam w niemal każdym audycie i które nic nie kosztują.
Jednorazowa weryfikacja przy wdrożeniu nie wystarcza, bo znaczniki psują się przy okazji zmian, które z nimi formalnie nie mają nic wspólnego: aktualizacji wtyczki, podmiany szablonu, migracji cennika.
Mój minimalny zestaw wygląda tak. Test wyników z elementami rozszerzonymi i walidator Schema.org na kilku reprezentatywnych szablonach podstron, nie na stronie głównej. Raport elementów rozszerzonych w Search Console przeglądany co miesiąc pod kątem nagłych skoków liczby błędów. Pobranie surowego dokumentu bez renderowania, żeby potwierdzić, że dane są w odpowiedzi serwera. I proste porównanie kilku pól ze znacznika z tym, co pokazuje strona.
Na koniec zastrzeżenie, bo wokół danych strukturalnych narosło sporo nadziei.
Znaczniki są opisem treści, nie jej zamiennikiem. Nie sprawią, że słaba strona zostanie potraktowana jako wiarygodne źródło, i nie są czynnikiem, który samodzielnie podnosi pozycje. Dają coś innego, co jest w tej chwili wartościowe: zmniejszają liczbę miejsc, w których maszyna musi się domyślać. Mniej domysłów to mniejsze ryzyko, że o Twojej firmie powstanie zdanie, którego byś nie podpisał.
Dlatego układam to w tej kolejności: najpierw spójność danych o firmie i produkcie w całym serwisie, potem jeden porządny graf zamiast kilku wysepek, a dopiero na końcu poszerzanie listy oznaczanych typów. Odwrotna kolejność to najczęstszy sposób, żeby mieć dużo znaczników i niewiele z nich.
Używamy plików cookies, aby ułatwić Ci nawigację oraz wykonywanie określonych funkcji. Szczegółowe informacje o wszystkich plikach cookies znajdziesz w każdej kategorii zgody poniżej.
Pliki cookies oznaczone jako "Niezbędne" są przechowywane w Twojej przeglądarce, ponieważ są one kluczowe dla zapewnienia podstawowych funkcji strony.
Używamy również plików cookies firm trzecich, które pomagają nam analizować, w jaki sposób korzystasz z tej strony, zapamiętują Twoje preferencje oraz dostarczają treści i reklamy odpowiednie dla Ciebie. Te pliki cookies będą przechowywane w Twojej przeglądarce tylko za Twoją uprzednią zgodą.
Możesz zdecydować, czy chcesz włączyć lub wyłączyć niektóre bądź wszystkie te pliki cookies, jednak wyłączenie niektórych z nich może wpłynąć na Twoje doświadczenia podczas przeglądania strony.
| Cookie | Czas przechowywania | Opis |
|---|---|---|
| __cf_bm | 13 minutes | Cloudflare bot management — distinguishes humans from bots. |
| rc::* | Persistent | Google reCAPTCHA — localStorage holding anti-bot challenge state. |
| Cookie | Czas przechowywania | Opis |
|---|---|---|
| wpEmojiSettingsSupports | Session | WordPress — sessionStorage flag caching whether the browser can render emoji (feature detection). |
| ytidb* | Persistent | YouTube — IndexedDB storing playback/search state for embedded videos. |
| Cookie | Czas przechowywania | Opis |
|---|---|---|
| _ga_* | 400 days | Google Analytics 4 — persists session state per property. |
| _ga | 400 days | Google Analytics — distinguishes unique users via a client id. |
| Cookie | Czas przechowywania | Opis |
|---|---|---|
| NID | 183 days | Google — stores preferences for personalized ads. |
| fr | 90 days | Meta — encrypted Facebook id and browser id for ads. |
| _gcl_au | 90 days | Google AdSense/Ads — experiments with advertising efficiency (conversion linker). |
| Cookie | Czas przechowywania | Opis |
|---|---|---|
| __Secure-YNID | 180 days | |
| YSC | Session | |
| __Secure-ROLLOUT_TOKEN | 180 days | |
| VISITOR_INFO1_LIVE | 180 days | |
| VISITOR_PRIVACY_METADATA | 180 days | |
| datr | 400 days | |
| sb | 400 days | |
| wd | 7 days |