Implementer strukturerte data (Schema.org) i Shoporama-temaet ditt
Komplett veiledning til JSON-LD-strukturerte data i et Shoporama-tema. Smarty-eksempler for Product, Store, BreadcrumbList og AggregateRating med riktige sikre metoder.
Strukturerte data (Schema.org) hjelper Google og andre søkemotorer med å forstå innholdet på sidene dine. For en nettbutikk er det spesielt viktig å merke opp produkter, butikkinformasjon, brødsmuler og produktanmeldelser, slik at du kan oppnå «rich snippets» i søkeresultatene med for eksempel pris, lagerstatus og stjernevurdering.
Tips: Shoporama legger automatisk til grunnleggende Schema.org-markering for produkter via våre innebygde SEO-funksjoner. Les om automatiske strukturerte data og SEO i Shoporama. Denne artikkelen er for deg som ønsker å lage eller utvide markeringen selv i temaet ditt.

Hva er strukturerte data?
Strukturerte data er en standardisert måte å beskrive sidens innhold på i et format som søkemotorer forstår. JSON-LD er det anbefalte formatet og plasseres i en <script type="application/ld+json">-tag. Det påvirker ikke sidens visuelle utseende, men gir søkemotorene strukturert informasjon som kan brukes til rich snippets.
De riktige safe-metodene på SafeProduct, SafeWebshop og SafeCompany
Før du lager din egen JSON-LD-markering, er det viktig å kjenne til de «safe»-metodene som faktisk finnes på objektene i et Shoporama-tema. Dette er de stabile metodene du kan bruke i Smarty.
På $product (SafeProduct):
- getName(), getDescription(), getOwnId(), getGtin(), getMpn(), getBrandName()
- getPrice(), getSalePrice(), getRealPrice(), getLowest30DayPrice()
- getStockCount() og getIsInStock()
- getImage() og getImages() returnerer SafeImage med getSrc($w, $h, $type)
- getAvgRating($no_round), getReviewCount(), getProductReviews($limit)
- getUrl() gir produktets relative sti
På $webshop (SafeWebshop):
- getName(), getDescription(), getCurrency(), getUrl(), getLogo()
- getCompany() returnerer SafeCompany
På $webshop->getCompany() (SafeCompany):
- getName(), getRegNr(), getEmail(), getPhone()
- getAddress(), getZipcode(), getCity(), getCountry()
Merk: Ikke bruk $product->getStock(), $product->getAverageRating(), $webshop->getCurrencyCode(), $webshop->getDomain(), $webshop->getEmail() eller $webshop->getPhone(). De finnes ikke som «safe»-metoder, og temaet ditt vil gi feil. Bruk i stedet getStockCount(), getAvgRating(), getCurrency(), getUrl() og getCompany()->getEmail()/getPhone().
Produkt-markup (Product)
Den viktigste typen for en nettbutikk er produktmarkering. Sett inn blokken i produktmalen din (vanligvis product/view.html):
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "<{$product->getName()|escape:'javascript'}>",
"description": "<{$product->getDescription()|strip_tags|escape:'javascript'}>",
"sku": "<{$product->getOwnId()|escape:'javascript'}>",
<{if $product->getGtin()}>
"gtin": "<{$product->getGtin()|escape:'javascript'}>",
<{/if}>
<{if $product->getMpn()}>
"mpn": "<{$product->getMpn()|escape:'javascript'}>",
<{/if}>
<{if $product->getBrandName()}>
"brand": {
"@type": "Brand",
"name": "<{$product->getBrandName()|escape:'javascript'}>"
},
<{/if}>
<{if $product->getImage()}>
"image": "<{$product->getImage()->getSrc(800, 800, 'fit')}>",
<{/if}>
"offers": {
"@type": "Offer",
"url": "<{$webshop->getUrl()}><{$product->getUrl()}>",
"price": "<{$product->getRealPrice()|string_format:"%.2f"}>",
"priceCurrency": "<{$webshop->getCurrency()}>",
"availability": "<{if $product->getStockCount() > 0}>https://schema.org/InStock<{else}>https://schema.org/OutOfStock<{/if}>"
}
}
</script>
Tre viktige punkter i eksemplet:
- Prisen hentes med getRealPrice(), slik at eventuelle salgspriser og rabatter inkluderes, og merverdiavgiften legges til.
- Valuta hentes med getCurrency() på $webshop (returnerer f.eks. «DKK» eller «EUR»).
- Lagerstatus bestemmes med getStockCount(). Du kan også bruke getIsInStock() hvis du vil tillate salg av produkter på lager med 0 på lager.
Tidligere pris (Omnibus-direktivet)
Hvis produktet er på tilbud, anbefaler Google å vise den laveste prisen de siste 30 dagene som referansepris. Bruk getLowest30DayPrice() for å hente den. Funksjonen returnerer null hvis det ikke finnes nok prishistorikk.
Produktanmeldelser (AggregateRating)
Hvis du bruker Shoporamas innebygde anmeldelsessystem, kan du legge til en gjennomsnittlig vurdering direkte i Product-markupen. Dette kan gi stjerner i Googles søkeresultater. Sett inn blokken inne i Product-objektet:
<{if $product->getReviewCount() > 0}>
,
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "<{$product->getAvgRating(true)|string_format:"%.1f"}>",
"reviewCount": "<{$product->getReviewCount()}>"
}
<{/if}>
Parameteren true til getAvgRating() gir et ikke-avrundet gjennomsnitt, noe Google foretrekker (f.eks. 4,3 i stedet for bare 4).
Butikkinformasjon (Store / LocalBusiness)
Du kan også markere selve nettbutikken, f.eks. i fotmalen din. Hent kontaktdata fra $webshop->getCompany(), slik at opplysningene du allerede har lagt inn under Firma, Firmainformasjon, inkluderes automatisk:
<{$company = $webshop->getCompany()}>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Store",
"name": "<{$webshop->getName()|escape:'javascript'}>",
"url": "<{$webshop->getUrl()}>"
<{if $company}>
,
<{if $company->getEmail()}>
"email": "<{$company->getEmail()|escape:'javascript'}>",
<{/if}>
<{if $company->getPhone()}>
"telephone": "<{$company->getPhone()|escape:'javascript'}>",
<{/if}>
"address": {
"@type": "PostalAddress",
"streetAddress": "<{$company->getAddress()|escape:'javascript'}>",
"postalCode": "<{$company->getZipcode()|escape:'javascript'}>",
"addressLocality": "<{$company->getCity()|escape:'javascript'}>",
"addressCountry": "<{$company->getCountry()|escape:'javascript'}>"
}
<{/if}>
<{if $webshop->getLogo()}>
,
"logo": "<{$webshop->getLogo()->getSrc(400, 400, 'fit')}>"
<{/if}>
}
</script>
Sørg for at firmaopplysningene er fylt ut riktig i admin under Firma, Firmaopplysninger. Hvis du har en fysisk butikk, kan du bruke LocalBusiness eller en mer spesifikk undertype (f.eks. ClothingStore) som @type.
Brødsmuler (BreadcrumbList)
På produkt- og kategorisider er det god SEO-praksis å markere brødsmuler. Eksempel for et produkt med hovedkategori:
<{if $product->getMainCategory()}>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "<{$webshop->getName()|escape:'javascript'}>",
"item": "<{$webshop->getUrl()}>"
},
{
"@type": "ListItem",
"position": 2,
"name": "<{$product->getMainCategory()->getName()|escape:'javascript'}>",
"item": "<{$webshop->getUrl()}><{$product->getMainCategory()->getUrl()}>"
},
{
"@type": "ListItem",
"position": 3,
"name": "<{$product->getName()|escape:'javascript'}>",
"item": "<{$webshop->getUrl()}><{$product->getUrl()}>"
}
]
}
</script>
<{/if}>
Test dine strukturerte data
Bruk verktøyene fra Google og Schema.org til å validere markeringen din før du går live:
- Rich Results Test sjekker om markeringen din gir rich snippets i Google
- Schema Markup Validator validerer JSON-LD-syntaksen
- I Google Search Console kan du se rapporter om produktene dine og rich results etter at sidene er indeksert
Tips: Hvis du allerede har aktivert automatisk strukturert data i Shoporama, må du passe på å unngå duplikater. Sjekk hva som allerede finnes på siden før du legger til din egen markering.
Ofte stilte spørsmål
Må jeg i det hele tatt kode JSON-LD selv?
Nei, ikke nødvendigvis. Shoporama har innebygd automatisk strukturert data for produkter, og det dekker det meste. Å kode selv er først og fremst relevant hvis du vil legge til flere felt eller bruke en mer spesifikk @type, for eksempel for hoteller, restauranter eller arrangementer.
Hvilke skjematyper kan jeg bruke i tillegg til Product?
I et Shoporama-tema kan du bygge alle Schema.org-typer som finnes som JSON-LD. De mest brukte for nettbutikker er Product, Offer, AggregateRating, Review, BreadcrumbList, Store, LocalBusiness, Organization, WebSite med SearchAction og FAQPage for faste FAQ-sider.
Hvorfor får jeg feilmeldinger i Rich Results Test?
De vanligste feilene er manglende felt (f.eks. «price» uten «priceCurrency»), feil formatering av tall eller anførselstegn som ødelegger JSON-syntaksen. Bruk alltid |escape:'javascript' på alle tekstverdier i Smarty.
Hvor lang tid tar det før jeg ser stjerner i Google?
Google må først gjennomsøke siden på nytt før den nye markeringen tas i bruk. Det kan ta alt fra noen få dager til et par uker. I Search Console kan du be om rask reindeksering av enkeltstående sider.
Påvirker dette rangeringene mine i Google?
Strukturerte data er ikke en direkte rangeringfaktor, men rich snippets med for eksempel pris og stjerner gjør søkeresultatet ditt mer synlig og kan øke klikkfrekvensen. På sikt bidrar det til å forbedre din samlede SEO.
Hvordan håndterer jeg merverdiavgift i prisfeltet?
Bruk getRealPrice(), som returnerer prisen inkl. moms. Det er prisen kunden møter i butikken, og den prisen Google forventer i Product-markup på en B2C-butikk. Hvis du skal vise pris ekskl. moms (B2B), bruk getPriceExVat() i stedet.
Må jeg ha anmeldelser før jeg viser AggregateRating?
Ja. Legg bare til AggregateRating hvis produktet faktisk har anmeldelser. Eksemplet ovenfor sjekker at getReviewCount() > 0, slik at markup ikke legges til produkter uten anmeldelser. Falske eller tomme vurderinger kan utløse en straff fra Google.
Hvor finner jeg bedriftsopplysningene mine til Store-markup?
Gå inn i admin under Bedrift, Bedriftsopplysninger. Dataene du fyller ut her blir tilgjengelige via $webshop->getCompany() i temaet ditt, slik at Store-blokken fylles ut automatisk.
Hvor skal JSON-LD plasseres på siden?
Du kan plassere den enten i <head> eller i <body>. Begge deler er gyldige ifølge Google. På produktsider er det vanlig å plassere den nederst i produktmalen.
Nettbutikken min selger på flere språk. Må jeg ha markering for hvert språk?
Ja, navn og beskrivelser i markeringen må gjenspeile den siden kunden ser. Siden $product->getName() og $product->getDescription() automatisk returnerer den oversatte teksten for det aktive språket, skjer dette helt automatisk når du bruker eksemplene her.
Trenger du hjelp med strukturerte data? Kontakt oss på support@shoporama.dk.
Relaterte artikler
SEO i Shoporama
Komplett guide til SEO-funksjonene i Shoporama - fra metatagger og områdekart til Google Shopping og AI Assistant.
Produktanmeldelser
Finn ut hvordan du bruker produktanmeldelser i Shoporama. Samle inn kundeanmeldelser automatisk, moderer dem og vis stjernevurderinger på...
Variabler i et Shoporama-tema
Oversikt over globale og sidespesifikke Smarty-variabler som er tilgjengelige i Shoporama-temaer.
Implementere sporing i et Shoporama-tema
Utviklerveiledning for sporing av e-handel i et Shoporama-tema: datalag, Google Tag Manager, tilpassede hendelser og korrekte produkt-ID-er med...
Blogg knyttet til butikken din
Komplett guide til bloggfunksjonen i Shoporama - opprett innlegg, planlegg publisering, lenk produkter, optimaliser for søkemotorer og bruk...
Prishistorikk og Omnibus-direktivet
Shoporama logger automatisk prisendringer og beregner riktig førpris i henhold til Omnibus-direktivet. Omnibus-direktivet (EU 2019/2161)....
Angi noindex på en side, et produkt eller en kategori
Veiledning for å angi noindex i Shoporama slik at søkemotorer ikke indekserer visse sider.
Relaterte funksjoner
Strukturerte data - automatisk Schema.org-oppmerking
Automatisk Schema.org-oppmerking for produkter, anmeldelser, brødsmuler og bedriftsinformasjon. Rich snippets i Google med stjerner og utmerkelser....
SEO i Shoporama - bli synlig i Google
Shoporama har innebygde SEO-funksjoner: rask hastighet, full kontroll over titler og metabeskrivelser, dynamiske tagger, automatiske...