Strona główna/Blog/Jak dodać local schema markup do swojej strony — kompletny przewodnik
SEO·10 min czytania·Zespół MiauSEO

Jak dodać local schema markup do swojej strony — kompletny przewodnik

Schema markup LocalBusiness to jeden z najskuteczniejszych sygnałów lokalnego SEO, który większość firm ignoruje. Pokażemy Ci jak go poprawnie wdrożyć w każdym środowisku — z gotowym kodem JSON-LD.

Jak dodać local schema markup do swojej strony — kompletny przewodnik

Czym jest schema markup i dlaczego local SEO tego potrzebuje

Schema markup (znany też jako dane strukturalne) to sposób na opisanie zawartości strony w języku zrozumiałym dla robotów Google, Bing i innych wyszukiwarek. Zamiast analizować tekst i zgadywać, czym jest Twoja firma, Google dostaje wprost: to jest firma lokalna, nazywa się tak i tak, ma ten adres, te godziny otwarcia i taki numer telefonu.

Dla local SEO schema markup LocalBusiness jest jednym z kluczowych sygnałów rankingowych. Pomaga Google powiązać Twoją stronę www z wizytówką Google Business Profile, rozumieć obszar geograficzny działalności i poprawnie wyświetlać informacje w wynikach wyszukiwania — łącznie z tzw. rich results: ocenami gwiazdkowymi, godzinami otwarcia czy adresem widocznym bezpośrednio w SERPach.

Co ważne: implementacja schema markup jest technicznie prosta, zajmuje 30–60 minut, a zdecydowana większość małych firm jej nie ma. To oznacza, że masz szansę zyskać przewagę nad konkurencją przy stosunkowo niewielkim nakładzie pracy.

Format JSON-LD — jedyna słuszna droga

Schema markup można implementować na trzy sposoby: JSON-LD, Microdata i RDFa.Google oficjalnie rekomenduje JSON-LD i ten format powinieneś stosować. Dlaczego?

  • JSON-LD dodaje się jako blok kodu w sekcji <head> — nie ingeruje w HTML strony
  • Jest znacznie łatwiejszy do pisania, aktualizowania i debugowania niż Microdata
  • Działa identycznie niezależnie od tego, jak wygląda struktura HTML Twojej strony
  • Google czyta go tak samo jak dane wbudowane w HTML, więc nie ma żadnego powodu, żeby używać Microdata

Typ LocalBusiness i jego podtypy — co wybrać

Schema.org definiuje typ LocalBusiness jako bazowy dla każdej fizycznej firmy lokalnej. Możesz używać go wprost, ale jeśli Twoja branża ma bardziej szczegółowy podtyp — zawsze używaj bardziej szczegółowego. Google wyżej ceni precyzję.

Najważniejsze podtypy i kiedy ich używać:

  • Dentist — gabinet stomatologiczny
  • MedicalBusiness → Physician — lekarz, klinika
  • LegalService → Attorney — kancelaria adwokacka, radca prawny
  • AccountingService — biuro rachunkowe
  • AutoRepair — warsztat samochodowy
  • BeautySalon — salon kosmetyczny, fryzjer
  • Restaurant / FoodEstablishment — restauracja, kawiarnia
  • Hotel / LodgingBusiness — hotel, pensjonat
  • RealEstateAgent — biuro nieruchomości
  • HomeAndConstructionBusiness — firma remontowa, budowlana
  • Store (i podtypy) — sklepy różnych branż
  • LocalBusiness — jeśli żaden z powyższych nie pasuje

Pełną listę podtypów znajdziesz na schema.org/LocalBusiness. Zasada jest prosta: zejdź jak najgłębiej w hierarchii typów — im bardziej precyzyjny typ, tym lepiej Google rozumie Twoją firmę.

Właściwości, które musisz uwzględnić

Schema.org definiuje dziesiątki właściwości dla LocalBusiness. Poniżej podział na obowiązkowe, zalecane i dodatkowe:

Obowiązkowe (bez nich schema nie ma sensu)

  • name — pełna nazwa firmy (identyczna jak w GBP i w każdym innym miejscu w sieci)
  • address — obiekt PostalAddress z ulicą, miastem, kodem pocztowym i kodem kraju
  • telephone — numer telefonu w formacie międzynarodowym: +48 123 456 789
  • url — adres strony głównej Twojej firmy

Zalecane (znacząco poprawiają sygnał lokalny)

  • @id — unikalny identyfikator URI dla tej lokalizacji, np. https://twojastrona.pl/#firma
  • geo — obiekt GeoCoordinates ze współrzędnymi geograficznymi (latitude i longitude)
  • openingHoursSpecification — godziny otwarcia dla każdego dnia tygodnia
  • image — URL zdjęcia firmy lub logo
  • priceRange — przedział cenowy w dolarach/złotówkach: $, $$, $$$
  • sameAs — tablica URLi do Twoich profili (Facebook, Google Maps, LinkedIn itp.)
  • email — adres e-mail kontaktowy
  • description — krótki opis firmy (10–200 znaków)

Dodatkowe (zaawansowane)

  • areaServed — obszar działalności firmy (gdy obsługujesz klientów poza swoją lokalizacją)
  • hasMap — link do Google Maps prowadzący do Twojej wizytówki
  • aggregateRating — ocena zbiorcza (patrz sekcja o pułapkach)
  • servesCuisine — tylko dla restauracji, typ kuchni
  • menu — tylko dla restauracji/kawiarni, link do menu
  • paymentAccepted — akceptowane metody płatności

Kompletny przykład JSON-LD dla LocalBusiness

Poniżej gotowy, kompletny kod do wklejenia. Zamień wartości na dane swojej firmy:

schema-lokalizacja.json
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "LocalBusiness",
  "@id": "https://twojastrona.pl/#lokalizacja",
  "name": "Nazwa Twojej Firmy",
  "url": "https://twojastrona.pl",
  "telephone": "+48 123 456 789",
  "email": "kontakt@twojastrona.pl",
  "description": "Krótki opis firmy — czym się zajmujesz, gdzie działasz.",
  "priceRange": "$$",
  "image": "https://twojastrona.pl/images/firma.jpg",
  "logo": {
    "@type": "ImageObject",
    "url": "https://twojastrona.pl/images/logo.png"
  },
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "ul. Główna 10",
    "addressLocality": "Warszawa",
    "postalCode": "00-001",
    "addressCountry": "PL"
  },
  "geo": {
    "@type": "GeoCoordinates",
    "latitude": 52.2297,
    "longitude": 21.0122
  },
  "openingHoursSpecification": [
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
      "opens": "09:00",
      "closes": "17:00"
    },
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": "Saturday",
      "opens": "10:00",
      "closes": "14:00"
    }
  ],
  "sameAs": [
    "https://www.facebook.com/twoja-firma",
    "https://www.instagram.com/twoja-firma",
    "https://g.co/kgs/XXXXX"
  ],
  "areaServed": {
    "@type": "City",
    "name": "Warszawa"
  }
}
</script>

Jak znaleźć współrzędne geograficzne (geo)

Właściwość geo ze współrzędnymi geograficznymi to jeden z najmocniejszych sygnałów lokalnych w schema — i najczęściej pomijany. Aby znaleźć dokładne współrzędne swojej lokalizacji:

  1. Otwórz Google Maps i wyszukaj swoją firmę lub adres
  2. Kliknij prawym przyciskiem myszy na pinezkę lokalizacji
  3. Skopiuj współrzędne (pierwsza liczba to latitude, druga to longitude)

Alternatywnie: wejdź na maps.google.com, ustaw mapę na swojej lokalizacji, a współrzędne pojawią się w pasku adresu URL po kliknięciu w punkt na mapie. Użyj co najmniej 4 miejsc po przecinku — im dokładniej, tym lepiej.

Implementacja w WordPress

WordPress oferuje kilka metod dodania schema markup. Od najprostszej do bardziej zaawansowanej:

Metoda 1 — Wtyczka (polecana dla większości)

Najwygodniejsza opcja bez pisania kodu. Najlepsze wtyczki do schema LocalBusiness:

  • Rank Math SEO — ma wbudowany kreator schema LocalBusiness z formularzem. Idź do Rank Math → Schema → dodaj LocalBusiness. Wypełnij pola. Wtyczka generuje JSON-LD automatycznie.
  • Yoast SEO (wersja Premium) — podobny kreator w zakładce Schema. Wersja darmowa dodaje tylko podstawowe dane organizacji.
  • Schema & Structured Data for WP — dedykowana wtyczka do schema, bezpłatna, z intuicyjnym interfejsem.

Metoda 2 — Ręczne dodanie przez functions.php

Jeśli chcesz pełną kontrolę bez wtyczki, dodaj poniższy kod do pliku functions.phpswojego motywu (lub do wtyczki niestandardowej):

functions.php
function miauseo_local_business_schema() {
  $schema = [
    '@context'  => 'https://schema.org',
    '@type'     => 'LocalBusiness',
    '@id'       => 'https://twojastrona.pl/#lokalizacja',
    'name'      => 'Nazwa Twojej Firmy',
    'url'       => 'https://twojastrona.pl',
    'telephone' => '+48 123 456 789',
    'address'   => [
      '@type'           => 'PostalAddress',
      'streetAddress'   => 'ul. Główna 10',
      'addressLocality' => 'Warszawa',
      'postalCode'      => '00-001',
      'addressCountry'  => 'PL',
    ],
    'geo' => [
      '@type'     => 'GeoCoordinates',
      'latitude'  => 52.2297,
      'longitude' => 21.0122,
    ],
  ];

  echo '<script type="application/ld+json">'
    . wp_json_encode( $schema, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT )
    . '</script>';
}
add_action( 'wp_head', 'miauseo_local_business_schema' );

Użyj wp_json_encode zamiast zwykłego json_encode — WordPress opakowuje go w dodatkowe zabezpieczenia i poprawnie koduje znaki Unicode (polskie litery).

Implementacja w Next.js / React

W aplikacjach React i Next.js najwygodniej dodać schema markup w komponencie layoutu — raz, globalnie, dla całej strony. W Next.js App Router (Next.js 13+) robi się to przez layout.tsx:

app/layout.tsx
const localBusinessSchema = {
  "@context": "https://schema.org",
  "@type": "LocalBusiness",
  "@id": "https://twojastrona.pl/#lokalizacja",
  "name": "Nazwa Twojej Firmy",
  "url": "https://twojastrona.pl",
  "telephone": "+48 123 456 789",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "ul. Główna 10",
    "addressLocality": "Warszawa",
    "postalCode": "00-001",
    "addressCountry": "PL"
  },
  "geo": {
    "@type": "GeoCoordinates",
    "latitude": 52.2297,
    "longitude": 21.0122
  },
  "openingHoursSpecification": [
    {
      "@type": "OpeningHoursSpecification",
      "dayOfWeek": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
      "opens": "09:00",
      "closes": "17:00"
    }
  ]
};

export default function RootLayout({ children }: { children: React.ReactNode }) {
  return (
    <html lang="pl">
      <head>
        <script
          type="application/ld+json"
          dangerouslySetInnerHTML={{
            __html: JSON.stringify(localBusinessSchema),
          }}
        />
      </head>
      <body>{children}</body>
    </html>
  );
}

Kilka ważnych zasad dla Next.js:

  • Zdefiniuj obiekt localBusinessSchema poza komponentem — nie w ciele funkcji. Dzięki temu nie jest on ponownie tworzony przy każdym renderowaniu.
  • Użyj JSON.stringify bez wcięć w produkcji — zmniejsza rozmiar HTML. W developmencie możesz dodać null, 2 dla czytelności.
  • Prop dangerouslySetInnerHTML jest tutaj bezpieczny — wstawiasz dane, które sam kontrolujesz, nie dane od użytkownika.
  • Jeśli masz wiele lokalizacji, stwórz osobny plik lib/schema.ts z tablicą obiektów schema i mapuj je w layout.

Implementacja w zwykłym HTML

Jeśli Twoja strona to statyczny HTML lub używasz dowolnego innego CMSu, po prostu wklej tag <script> bezpośrednio przed zamknięciem tagu </head>:

index.html
<!DOCTYPE html>
<html lang="pl">
<head>
  <meta charset="UTF-8">
  <title>Twoja Firma</title>

  <script type="application/ld+json">
  {
    "@context": "https://schema.org",
    "@type": "LocalBusiness",
    "@id": "https://twojastrona.pl/#lokalizacja",
    "name": "Nazwa Twojej Firmy",
    "telephone": "+48 123 456 789",
    "address": {
      "@type": "PostalAddress",
      "streetAddress": "ul. Główna 10",
      "addressLocality": "Warszawa",
      "postalCode": "00-001",
      "addressCountry": "PL"
    }
  }
  </script>

</head>
<body>
  ...
</body>
</html>

Jeśli używasz Google Tag Managera — nie dodawaj schema przez GTM. Google oficjalnie potwierdził, że renderowana przez JavaScript schema markup jest obsługiwana, ale crawlery indeksujące przetwarzają ją wolniej i mniej niezawodnie niż statyczny HTML. Zawsze wstawiaj JSON-LD bezpośrednio w kodzie strony.

Wiele lokalizacji — jak obsłużyć

Jeśli Twoja firma ma więcej niż jeden oddział, każda lokalizacja powinna miećosobny obiekt LocalBusiness z unikalnym @id i adresem. Możesz wstawić je jako tablicę JSON-LD w jednym tagu <script>lub jako osobne tagi — oba podejścia są poprawne:

wiele lokalizacji
<script type="application/ld+json">
[
  {
    "@context": "https://schema.org",
    "@type": "LocalBusiness",
    "@id": "https://twojastrona.pl/#warszawa",
    "name": "Twoja Firma — Warszawa",
    "address": {
      "@type": "PostalAddress",
      "streetAddress": "ul. Marszałkowska 1",
      "addressLocality": "Warszawa",
      "postalCode": "00-001",
      "addressCountry": "PL"
    },
    "telephone": "+48 111 222 333"
  },
  {
    "@context": "https://schema.org",
    "@type": "LocalBusiness",
    "@id": "https://twojastrona.pl/#krakow",
    "name": "Twoja Firma — Kraków",
    "address": {
      "@type": "PostalAddress",
      "streetAddress": "ul. Floriańska 10",
      "addressLocality": "Kraków",
      "postalCode": "31-001",
      "addressCountry": "PL"
    },
    "telephone": "+48 444 555 666"
  }
]
</script>

Najlepszą praktyką jest stworzenie dla każdej lokalizacji dedykowanej podstrony (/warszawa, /krakow) i umieszczenie odpowiedniego schema markup na tej konkretnej podstronie, a nie globalnie w całej witrynie. To wzmacnia sygnał lokalny dla każdego oddziału osobno.

Jak testować poprawność schema markup

Po wdrożeniu obowiązkowo przetestuj schema przed indeksowaniem. Masz do dyspozycji dwa narzędzia:

1. Google Rich Results Test

Narzędzie dostępne pod adresem search.google.com/test/rich-results. Wklej URL strony lub bezpośrednio kod HTML z JSON-LD. Narzędzie pokaże:

  • Czy schema została poprawnie odczytana
  • Jakie właściwości zostały wykryte
  • Czy kwalifikujesz się do rich results (np. oceny gwiazdkowe)
  • Ostrzeżenia o brakujących zalecanych właściwościach

2. Schema.org Validator

Dostępny pod adresem validator.schema.org. Bardziej szczegółowy niż narzędzie Google — sprawdza zgodność ze specyfikacją schema.org, a nie tylko z tym, co Google rozumie. Używaj go jako drugiego sprawdzenia po Rich Results Test.

Po wdrożeniu sprawdź też w Google Search Console → Udoskonalenia — po 1–2 tygodniach pojawi się raport o wykrytych danych strukturalnych i ewentualnych błędach na Twojej stronie.

Najczęstsze błędy przy implementacji LocalBusiness schema

Błąd 1 — Rozbieżność z danymi w GBP i na stronie (NAP)

To najpoważniejszy błąd. Nazwa, adres i numer telefonu w schema markup muszą byćdokładnie identyczne jak w Google Business Profile, w stopce strony i w każdym innym miejscu w internecie. Nawet drobna różnica (np. „ul. Główna 10" vs „Główna 10") to sygnał niespójności, który osłabia cały profil lokalny. Przeczytaj więcej o tym w artykule o NAP w wizytówce Google.

Błąd 2 — aggregateRating z fałszywymi danymi

Właściwość aggregateRating pozwala pokazać ocenę gwiazdkową bezpośrednio w wynikach wyszukiwania. Ale Google weryfikuje te dane — jeśli ocena w schema nie odpowiada rzeczywistym opiniom na stronie lub w GBP, ryzykujesz manualną karą i usunięciem rich results. Nie wpisuj fikcyjnych ocen. Jeśli chcesz używać aggregateRating, pobieraj dane dynamicznie ze swojego systemu opinii.

Błąd 3 — Schema tylko na stronie głównej

Wiele firm dodaje LocalBusiness schema wyłącznie na stronie głównej. Lepsze podejście: dodaj ją na każdej stronie serwisu (przez layout/szablon) oraz stwórz dedykowane strony dla każdej lokalizacji z osobnym schema markup.

Błąd 4 — Brak właściwości @id

Właściwość @id to unikalny identyfikator encji w grafie wiedzy Google. Bez niego Google trudniej powiązać Twoją schema z innymi sygnałami (wizytówka GBP, Wikidata, inne wzmianki w sieci). Zawsze dodawaj @id w formacie URL z kotwicą: https://twojastrona.pl/#firma.

Błąd 5 — Używanie zbyt ogólnego typu

Dentysta ze schemaTypem LocalBusiness zamiast Dentisttraci sygnał precyzji. Google traktuje bardziej szczegółowe typy jako mocniejszy sygnał trafności dla zapytań branżowych. Zawsze sprawdź schema.org/LocalBusiness czy istnieje bardziej precyzyjny podtyp.

Błąd 6 — Dodawanie schema przez Google Tag Manager

Jak wspomniano wyżej — GTM wstrzykuje skrypty po załadowaniu strony przez JavaScript. Crawlery Google indeksują takie dane, ale wolniej i mniej niezawodnie. Schema markup powinna być częścią statycznego HTML strony.

Jak schema markup realnie wpływa na local SEO

Warto mieć realistyczne oczekiwania. LocalBusiness schema nie jest magicznym przełącznikiem, który natychmiast wywinduje Cię na pierwszą pozycję w mapach. Jej wpływ jest pośredni, ale istotny:

  • Powiązanie strony www z wizytówką GBP — Google lepiej łączy sygnały z różnych źródeł, co wzmacnia autorytet lokalny
  • Rich results w wynikach — oceny gwiazdkowe, godziny otwarcia i adres w SERPach zwiększają CTR (klikalność), a CTR jest sygnałem rankingowym
  • Sygnał spójności NAP — schema potwierdza dane z GBP i innych cytowań, co wzmacnia zaufanie algorytmu
  • Knowledge Panel — kompletna schema schema pomaga Google budować lub wzbogacać panel wiedzy Twojej firmy
  • Voice search — asystenci głosowi (Google Assistant, Siri) korzystają ze schema markup przy odpowiadaniu na pytania lokalne

Czas na efekty: pierwsze zmiany w wynikach możesz zauważyć po 2–6 tygodniach od indeksowania — tyle potrzebuje Googlebot na przetworzenie nowych danych strukturalnych.

Podsumowanie — lista kontrolna wdrożenia

Zanim skończysz, przejdź przez checklistę:

  • ✓ Wybrałem najbardziej szczegółowy typ LocalBusiness pasujący do mojej branży
  • ✓ Dane NAP w schema są identyczne jak w GBP i na stronie
  • ✓ Dodałem właściwość @id z unikalnym URL
  • ✓ Dodałem współrzędne geograficzne (geo)
  • ✓ Wypełniłem godziny otwarcia (openingHoursSpecification)
  • ✓ Dodałem sameAs z linkami do profili społecznościowych i GBP
  • ✓ Przetestowałem schema w Google Rich Results Test — brak błędów
  • ✓ Schema jest w statycznym HTML, nie wstrzykiwana przez JavaScript/GTM

Schema markup LocalBusiness to jedna z prostszych technicznie optymalizacji SEO — i jedna z tych, które wiele firm nadal pomija. Wdrożenie zajmie Ci godzinę, a efekty widoczne będą przez lata. Żeby wyciągnąć maksimum z lokalnej widoczności, połącz schema markup z silnym profilem GBP:

Potrzebujesz pomocy z wizytówką Google?

Bezpłatna konsultacja — sprawdzę Twój profil i powiem co poprawić.

Umów rozmowę