I 2013 betydde det å legge til et Google-kart å lime inn en <iframe> fra maps.google.com. Enkelt, raskt, gratis. I 2026 er Google Maps en avansert Skyplattform som krever API-nøkler, en tilkoblet faktureringskonto, sporer brukerdata og er underlagt strenge personvernreguleringer (GDPR).
Hvis du bare limer inn en iframe, gjør du ikke bare det feil - du utsetter deg for alvorlige økonomiske og juridiske konsekvenser. En usikret API-nøkkel kan bli stjålet av boter og generere tusenvis av dollar i gebyrer i løpet av timer. Feil implementering med hensyn til GDPR kan føre til administrative bøter. Og en dårlig optimalisert kart kan ødelegge Core Web Vitals-resultatene dine og senke rangeringen i søk.
Denne guiden er en omfattende kunnskapskilde for WordPress-utviklere som ønsker å implementere Google Maps profesjonelt. Vi dekker ikke bare teknisk integrasjon, men også API-sikkerhet, ytelsesoptimalisering, regulatorisk samsvar og påvirkning på lokal SEO. Uansett om du velger en ferdig plugin eller egendefinert implementasjon - finner du alt du trenger her.
Google Maps og lokal SEO for WordPress i 2026
I generativt søk- og AI Overviews-æraen har lokal SEO blitt enda viktigere. Google Maps er ikke bare et visuelt element på nettstedet - det er en bro som kobler virksomheten din til Google-økosystemet.
Hvordan påvirker Google Maps synligheten i lokale søk
Google Maps er en integrert del av Google Local Pack - de tre resultatene som vises over organiske søkeresultater for lokale spørringer.
Konsistens i data mellom WordPress-siden din og Google Maps er kritisk:
- NAP-konsistens (Name, Address, Phone) - nøyaktig de samme dataene på nettstedet, i kartet og i Google-profilen
- Strukturerte Schema.org-data - LocalBusiness-markeringer styrker signalene til Google
- Innbygget kart - bekrefter fysisk plassering og øker tilliten
Utfordringer ved integrering av Google Maps i 2026
I 2026 står utviklere overfor nye utfordringer:
- Core Web Vitals - Google Maps laster som standard ~2MB JavaScript, noe som kan ødelegge LCP- og INP-resultater
- Privacy-First Web - GDPR, ePrivacy Directive og nye forskrifter krever eksplisitt samtykke for å laste kart
- API-kostnader - Siden mars 2025 har hver SKU sin egen gratis månedlige terskel i stedet for en felles kreditt, og bruken må overvåkes
- Mobile-First - kartet må fungere på små skjermer og med berøring, så det må være responsivt
Hvordan Maps Embed API skiller seg fra en kopiert iframe
Det finnes to typer iframe. Kodebiten du kopierer fra “Del”-dialogen på google.com/maps, har verken API-nøkkel eller avtale, så det står ikke noe prosjekt, ingen kvote og ingen bruksrapport bak den. Maps Embed API er den dokumenterte versjonen av samme idé: en iframe der src peker til https://www.google.com/maps/embed/v1/MAP_MODE?key=YOUR_API_KEY&PARAMETERS, og modusen er én av place, view, directions, streetview eller search.
Googles side om bruk og fakturering sier at Maps Embed API “er gratis å bruke med ubegrensede forespørsler” (egen oversettelse), og at det ikke finnes grenser per sekund eller per dag. Hver forespørsel krever likevel en API-nøkkel, så nøkkelbegrensningene som beskrives lenger ned, gjelder også her. Innebygde kart støttes ikke under 200 px i noen av retningene, og Google ber om et referrerpolicy-attributt på iframen, slik at nettleseren sender domenet ditt som Referer-header. Uten det avviser en nøkkel som er begrenset til nettstedet ditt, forespørselen.
<iframe
width="600" height="450" style="border:0" loading="lazy"
referrerpolicy="no-referrer-when-downgrade"
src="https://www.google.com/maps/embed/v1/place?key=YOUR_API_KEY&q=YOUR_ADDRESS">
</iframe>Embed API passer for en kontaktside med én adresse. Det gir ingen faktureringsrisiko og ingen JavaScript å skrive, og med loading="lazy" på iframen holdes kartet utenfor den første sidelastingen. Personvernspørsmålet forsvinner likevel ikke. Iframen laster fortsatt innhold fra Googles servere i den besøkendes nettleser, så samtykkereglene i GDPR-delene av denne guiden gjelder like mye for den som for JavaScript API. Når du trenger egne markører, clustering, egen styling eller samspill med resten av siden, er Maps JavaScript API riktig verktøy.
Slik får du Google Maps API-nøkkel
Før du legger til et kart i WordPress, må du konfigurere Google Maps Platform. Dette er en flertrinnsprosess som krever oppmerksomhet på detaljer.
Trinn 1: Opprette prosjekt i Google Cloud Console
- Gå til Google Cloud Console
- Klikk prosjektvelgeren (øverste bjelke) og velg “New Project”
- Gi prosjektet et navn (f.eks. “WordPress Maps - DinBedrift”)
- Velg organisasjon (valgfritt) og plassering
- Klikk “Create”
Viktig: Prosjektet bør ha et beskrivende navn - dette gjør administrasjonen enklere når du har flere prosjekter.
Trinn 2: Aktivere nødvendige API-er
Google Maps Platform består av mange separate API-er. For et typisk WordPress-nettsted trenger du:
| API | Formål | Gratis terskel per måned (modellen fra mars 2025) |
|---|---|---|
| Maps JavaScript API | Interaktive kart på nettstedet | 10 000 kartinnlastinger (Dynamic Maps, Essentials) |
| Geocoding API | Konvertere adresser til koordinater | 10 000 hendelser (Essentials) |
| Places API | Autocomplete-adresser, stedsdetaljer | Legacy, nye prosjekter bruker Places API (New), se prissiden |
| Static Maps API | Statiske kartbilder | 10 000 hendelser (Essentials) |
Prisene over terskelen endrer seg og står på Googles prisside.
For å aktivere API-er:
- I Cloud Console, gå til “APIs & Services” og velg “Library”
- Søk etter “Maps JavaScript API”
- Klikk “Enable”
- Gjenta for andre nødvendige API-er
Trinn 3: Konfigurere fakturering og budsjettgrenser
Maps JavaScript API krever en faktureringskonto, også om du aldri går over gratisterskelen.
Konfigurere fakturering:
- Gå til “Billing” og velg “Manage billing accounts”
- Opprett en ny faktureringskonto eller velg en eksisterende
- Legg til betalingsmetode (kredittkort)
- Koble kontoen til prosjektet
Eldre veiledninger, også tidligere versjoner av denne, nevner en månedlig kreditt på 200 USD. Den modellen finnes ikke lenger. Ifølge Googles side om faktureringsendringene i mars 2025 (lest 2026-10-14) har Google “erstattet den månedlige kreditten på 200 USD med en gratis månedlig bruksterskel for hver Core Services-SKU” (egen oversettelse). Hver SKU hører til en kategori (Essentials, Pro eller Enterprise), og gratisterskelen varierer med kategorien.
På den gjeldende prissiden ligger SKU-ene et typisk WordPress-nettsted bruker, i Essentials: Dynamic Maps (én kartinnlasting i Maps JavaScript API), Static Maps og Geocoding har hver en gratis grense på 10 000 fakturerbare hendelser per måned, og Embed-SKU-en er oppført som ubegrenset. De fleste Pro-SKU-er har en grense på 5 000, de fleste Enterprise-SKU-er 1 000. Tersklene telles per SKU, så et nettsted som laster et dynamisk kart og i tillegg geokoder adresser, bruker to separate gratisterskler. Prisene over grensen endrer seg over tid, så les dem på prissiden og ikke i et blogginnlegg.
Budsjett og kvoter: To kontroller beskytter deg mot en uventet faktura. Et budsjett i Cloud Billing sender varsler når forbruket når terskler du har satt, men det stopper ikke API-et. En kvote under “APIs & Services” begrenser antall forespørsler per minutt eller per dag, og forespørsler over den feiler. Googles beste praksis for API-sikkerhet anbefaler kvotegrenser per minutt og per bruker for prosjekter på klientsiden. Sett kvoten over den reelle topptrafikken din, fordi også ekte besøkende får feil når den er nådd.
Den samme siden fra mars 2025 ga tre tjenester Legacy-status: Places API, Directions API og Distance Matrix API. Legacy-tjenester får ingen nye funksjoner, og siden om eldre produkter sier at de “ikke er tilgjengelige i nye Cloud-prosjekter” (egen oversettelse). Et prosjekt som opprettes i dag, må bruke Places API (New) og Routes API, så kodeeksempler som kaller google.maps.places.Autocomplete eller DirectionsService, kan feile i et nytt prosjekt selv om de fortsatt kjører i gamle.
Trinn 4: Generere og sikre API-nøkkel
API-nøkkelen er det viktigste sikkerhetselementet. En usikret nøkkel kan bli stjålet og brukt av tredjeparter, noe som genererer kostnader.
Generere nøkkel:
- Gå til “APIs & Services” og velg “Credentials”
- Klikk “Create credentials” og velg “API key”
- Kopier den genererte nøkkelen
Konfigurere begrensninger (obligatorisk!):
- Application restrictions - velg “HTTP referrers (web sites)”
- Legg til domenene dine:
https://dittnettsted.no/* - API restrictions - velg “Restrict key”
- Merk bare de API-ene du bruker (f.eks. Maps JavaScript API, Geocoding API)
Tilleggssikkerhet:
- IP-begrensninger - hvis du bruker en proxy-server, kan du begrense nøkkelen til spesifikke IP-er
- Quota limits - sett daglige spørringsgrenser i “Quotas”
Hvordan sikre Google Maps API-nøkkelen i WordPress
API-nøkkelsikkerhet er ikke bare et økonomisk spørsmål - det er beskyttelse av firmaets omdømme.
Slik begrenser du API-nøkkelen til domenet (HTTP-henvisninger)
HTTP-henvisninger lar deg begrense nøkkelbruk til spesifikke domener. Dette er den viktigste sikkerhetsmekanismen.
Korrekte henvisningsmønstre:
*.dittnettsted.no/* # Alle underdomener
https://dittnettsted.no/* # Spesifikt domene med HTTPSUnngå:
- Ikke bruk
*(wildcard) uten domene - dette tillater bruk av nøkkelen fra hvilken som helst side - Ikke legg til
http://utenhttps://- krev krypterte tilkoblinger - Ikke glem underdomener med www
Slik overvåker du bruken av Google Maps API-nøkkelen
Regelmessig overvåking lar deg oppdage uautorisert bruk før det genererer høye kostnader.
I Cloud Console:
- Gå til “APIs & Services” og velg “Dashboard”
- Analyser bruksgrafer
- Se etter plutselige økninger
Konfigurere varsler:
- Sett varsler for uvanlige bruksmønstre
- Aktiver e-postvarsler for alle endringer i prosjektet
Hva gjør du hvis Google Maps API-nøkkelen lekker
I tilfelle mistanke om tyveri av nøkkelen:
Umiddelbar rotasjon:
- Gå til “Credentials”
- Klikk rotasjonsikonet ved nøkkelen
- En ny nøkkel vil bli generert
Analysere logger:
- Sjekk “Metrics” i Cloud Console
- Identifiser kilden til uautorisert trafikk
Styrke sikkerheten:
- Legg til tilleggs IP-begrensninger
- Reduser quota-grenser
Google Maps og GDPR i WordPress
Google Maps behandler personopplysninger (IP, plassering, atferd). I henhold til GDPR må du innhente samtykke før du laster skriptet.
Rettslig grunnlag for Google Maps etter GDPR
To separate regelsett møtes på en side med et Google-kart. ePrivacy-direktivet (2002/58/EF, artikkel 5(3)) krever samtykke før informasjon lagres på eller leses fra den besøkendes enhet, med mindre det er strengt nødvendig for en tjeneste den besøkende uttrykkelig har bedt om. GDPR regulerer deretter selve personopplysningene, og det begynner med IP-adressen som hver forespørsel til Googles servere eksponerer.
Rollen til nettstedseieren ble avklart av EU-domstolen i Fashion ID (C-40/17), avgjort 29. juli 2019. Saken gjaldt en Facebook “Like”-knapp, men begrunnelsen dekker alt innebygd tredjepartsinnhold: nettstedsoperatøren kan være felles behandlingsansvarlig for innsamlingen og overføringen av de besøkendes data til tredjeparten, men ikke for det tredjeparten gjør med dataene etterpå. Der samtykke er det rettslige grunnlaget, må operatøren innhente det for disse operasjonene og informere de besøkende når dataene samles inn.
Googles egen avtale peker samme vei. I Google Maps Platform Terms of Service avtaler Google og kunden Controller-Controller Data Protection Terms, så Google opptrer som en selvstendig behandlingsansvarlig for dataene de besøkende sender til Google, ikke som din databehandler. Vilkårene forplikter deg også til å følge personvernlovgivningen “for tjenester som lagrer og leser informasjonskapsler på sluttbrukernes enheter” (egen oversettelse). Ligger adressen til faktureringskontoen din i EØS, gjelder de egne EEA Terms of Service for bruken din. For overføringer til USA vedtok EU-kommisjonen beslutningen om tilstrekkelig beskyttelsesnivå for EU-U.S. Data Privacy Framework 10. juli 2023. Den dekker overføringer til amerikanske selskaper som er sertifisert under rammeverket.
I praksis betyr det at kartet lastes etter samtykke eller etter et klikk på en tydelig merket plassholder, at personvernerklæringen nevner Google som mottaker og lenker til Googles personvernerklæring, og at samtykkeverktøyet fører opp kartet under kategorien som blokkerer det. Dette er generell informasjon og ikke juridisk rådgivning. Personvernombudet eller advokaten din avgjør det rettslige grunnlaget for ditt nettsted.
Nødvendige elementer i personvernerklæringen:
- Informasjon om bruk av Google Maps Platform
- Formål med behandling (vise kart, plassering)
- Rettslig grunnlag (brukerens samtykke)
- Lenke til Googles personvernerklæring
Slik håndterer du cookie-samtykke for Google Maps
De mest populære samtykkeløsningene for WordPress:
1. Cookiebot (Usercentrics):
// Lytte etter markedsføringssamtykke
window.addEventListener('CookiebotOnAccept', function() {
if (Cookiebot.consent.marketing) {
loadGoogleMaps();
}
});2. Complianz:
// Integrasjon med Complianz
document.addEventListener('cmplzConsentCategoryChange', function(event) {
if (event.detail.marketing) {
loadGoogleMaps();
}
});3. Egendefinert implementering:
// Sjekk localStorage
function checkConsent() {
const consent = localStorage.getItem('cookie_consent');
return consent && JSON.parse(consent).marketing === true;
}Slik blokkerer du Google Maps til samtykke er gitt
HTML-struktur før samtykke:
<div id="map-container" class="map-placeholder">
<div class="map-consent-overlay">
<p>Google Maps vil vises her</p>
<p>Google behandler personopplysninger i henhold til <a href="/nb/personvernerkl-ring/">personvernerklæringen</a></p>
<button onclick="acceptMarketingAndLoadMap()">
Godta og vis kart
</button>
</div>
</div>Laste kart etter samtykke:
function loadGoogleMaps() {
// Skjul overlay
document.querySelector('.map-consent-overlay').style.display = 'none';
// Dynamisk lasting av skript
const script = document.createElement('script');
script.src = `https://maps.googleapis.com/maps/api/js?key=${API_KEY}&callback=initMap`;
script.async = true;
script.defer = true;
document.head.appendChild(script);
}Geolokalisering og GDPR
Hvis du bruker brukerens geolokalisering (knappen “Min plassering”):
- Tilleggssamtykke kreves - vilkårene for Google Maps Platform krever uttrykkelig, forhåndsgitt og tilbakekallbart samtykke før posisjonen hentes
- Browser API - bruk
navigator.geolocationmed feilhåndtering - Fallback - tilby alltid manuell inntasting av plassering
function getUserLocation() {
if (!navigator.geolocation) {
console.log('Geolokalisering støttes ikke');
return;
}
navigator.geolocation.getCurrentPosition(
position => {
const { latitude, longitude } = position.coords;
centerMap(latitude, longitude);
},
error => {
console.error('Geolokaliseringsfeil:', error);
// Fallback til standardplassering
}
);
}Google Maps og Core Web Vitals i WordPress
Google Maps kan betydelig redusere Core Web Vitals-resultater. Her er optimaliseringsstrategier.
Hvordan påvirker Google Maps Core Web Vitals
| Beregning | Hva Maps API påvirker | Målgrense |
|---|---|---|
| LCP | Skript og kartfliser konkurrerer med hovedinnholdet om nettverket | < 2.5s |
| INP | JavaScript-kjøring på hovedtråden forsinker svar på klikk | < 200ms |
| TBT | Lange oppgaver når kartet initialiseres | < 200ms |
| CLS | En beholder uten fast høyde forskyver layouten når kartet vises | < 0.1 |
Strategi 1: Lazy loading med Intersection Observer
Ikke last kartet før det er synlig i viewport:
const mapContainer = document.getElementById('map-container');
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
loadGoogleMaps();
observer.unobserve(entry.target);
}
});
}, {
rootMargin: '100px', // Last litt før det vises
threshold: 0.1
});
observer.observe(mapContainer);Strategi 2: Fasade-mønsteret
I stedet for å laste kartet umiddelbart, vis et statisk bilde:
<div class="map-facade" onclick="loadRealMap()">
<img src="/images/map-static.avif"
alt="Kart over plassering - klikk for å laste interaktivt kart"
loading="lazy"
width="800"
height="450">
<button class="load-map-btn">
🗺️ Last interaktivt kart
</button>
</div>Generere statisk bilde: Bruk Static Maps API for å generere et bilde som vil være plassholder:
https://maps.googleapis.com/maps/api/staticmap?
center=59.9139,10.7522
&zoom=15
&size=800x450
&markers=color:red|59.9139,10.7522
&key=DIN_API_NØKKELStrategi 3: Async/Defer og prioritering
<!-- Dårlig: blokkerende lasting -->
<script src="https://maps.googleapis.com/maps/api/js?key=..."></script>
<!-- Bra: ikke-blokkerende -->
<script async defer
src="https://maps.googleapis.com/maps/api/js?key=...&callback=initMap">
</script>Strategi 4: Preconnect og DNS Prefetch
Fremskynd tilkobling til Google-servere:
<head>
<link rel="preconnect" href="https://maps.googleapis.com">
<link rel="preconnect" href="https://maps.gstatic.com" crossorigin>
<link rel="dns-prefetch" href="https://maps.googleapis.com">
</head>Strategi 5: Optimalisering av markører og elementer
Begrens antall elementer på kartet:
const mapOptions = {
disableDefaultUI: true, // Skjul standardkontroller
zoomControl: true, // Vis bare zoom
mapTypeControl: false,
streetViewControl: false,
fullscreenControl: false,
gestureHandling: 'cooperative' // Bedre UX på mobile
};Alternativer til Google Maps i WordPress
Google Maps er ikke alltid det beste valget. Vurder alternativer:
Sammenligning av Google Maps, OpenStreetMap, Mapbox og HERE
| Løsning | Pris | Personvern | Ytelse | Funksjonalitet |
|---|---|---|---|---|
| Google Maps | Gratis terskel per SKU, se prissiden | Krever samtykke | ~2MB | Full |
| OpenStreetMap + Leaflet | Gratis | Privat | ~150KB | Grunnleggende |
| Mapbox | 50,000 hendelser/mnd. gratis | Krever samtykke | ~300KB | Avansert |
| HERE Maps | Freemium | Krever samtykke | ~400KB | Avansert |
| Apple Maps | Gratis (kun Apple) | Privat | Variabel | Begrenset |
OpenStreetMap + Leaflet
Beste gratis alternativ:
<!-- Leaflet CSS -->
<link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/leaflet.css" />
<!-- Leaflet JS -->
<script src="https://unpkg.com/[email protected]/dist/leaflet.js"></script>
<div id="osm-map" style="height: 400px;"></div>
<script>
const map = L.map('osm-map').setView([59.9139, 10.7522], 15);
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© OpenStreetMap contributors'
}).addTo(map);
L.marker([59.9139, 10.7522]).addTo(map)
.bindPopup('Vår plassering')
.openPopup();
</script>Fordeler:
- 100% gratis
- Ingen API-nøkler
- Privat - krever ikke GDPR-samtykke
- Lettvektig (~150KB)
Ulemper:
- Mindre nøyaktige data
- Ingen Street View
- Begrensede premium-funksjoner
Mapbox
Avansert alternativ med bedre ytelse:
mapboxgl.accessToken = 'DIN_MAPBOX_TOKEN';
const map = new mapboxgl.Map({
container: 'map',
style: 'mapbox://styles/mapbox/streets-v12',
center: [10.7522, 59.9139],
zoom: 15
});
new mapboxgl.Marker()
.setLngLat([10.7522, 59.9139])
.addTo(map);Fordeler:
- Bedre ytelse enn Google
- Avanserte visuelle stiler
- Godt API for utviklere
Ulemper:
- Krever GDPR-samtykke
- Betalt etter overskridelse av grensen
- Mindre gjenkjennelig for brukere
Når bør du velge et alternativ til Google Maps
- OSM + Leaflet: Enkle kart, begrenset budsjett, personvern-prioritet
- Mapbox: Avanserte stiler, bedre ytelse, mobilapper
- Google Maps: Full funksjonalitet, Street View, integrasjon med Google-økosystemet
Slik endrer du stil på Google Maps
Standardutseendet til Google Maps passer kanskje ikke merkevaren din. Du kan tilpasse stiler på flere måter.
Slik styler du kartet med Map ID i Cloud Console
Moderne måte å administrere stiler på:
- Gå til Google Cloud Console og velg “Map Styles”
- Klikk “Create style”
- Bruk visuell redigerer eller importer JSON
- Koble stilen til et Map ID
- Bruk Map ID i koden:
const map = new google.maps.Map(document.getElementById('map'), {
center: { lat: 59.9139, lng: 10.7522 },
zoom: 15,
mapId: 'DITT_MAP_ID' // Her angir du Map ID
});Fordeler med Map ID-er:
- Oppdater stil uten kodeendringer
- Flere stiler for ulike sider
- Versjonskontroll av stiler
Styling av kartet med JSON (eldre metode)
For eldre implementeringer eller avansert kontroll:
const mapStyles = [
{
featureType: 'poi.business',
stylers: [{ visibility: 'off' }] // Skjul konkurrentenes bedrifter
},
{
featureType: 'transit',
elementType: 'labels.icon',
stylers: [{ visibility: 'off' }] // Skjul transportikoner
},
{
featureType: 'water',
elementType: 'geometry',
stylers: [{ color: '#e9e9e9' }] // Tilpass vannfarge
},
{
featureType: 'landscape',
elementType: 'geometry',
stylers: [{ color: '#f5f5f5' }] // Tilpass bakgrunnsfarge
}
];
const map = new google.maps.Map(document.getElementById('map'), {
center: { lat: 59.9139, lng: 10.7522 },
zoom: 15,
styles: mapStyles
});Mørkt tema på Google Maps og merkevarefarger
Eksempel på Dark Mode-stil:
const darkModeStyles = [
{ elementType: 'geometry', stylers: [{ color: '#242f3e' }] },
{ elementType: 'labels.text.stroke', stylers: [{ color: '#242f3e' }] },
{ elementType: 'labels.text.fill', stylers: [{ color: '#746855' }] },
{
featureType: 'administrative.locality',
elementType: 'labels.text.fill',
stylers: [{ color: '#d59563' }]
},
{
featureType: 'poi',
elementType: 'labels.text.fill',
stylers: [{ color: '#d59563' }]
},
{
featureType: 'road',
elementType: 'geometry',
stylers: [{ color: '#38414e' }]
}
];Slik endrer du markørikonet i Google Maps
Erstatt standardnålene med dine egne:
const marker = new google.maps.Marker({
position: { lat: 59.9139, lng: 10.7522 },
map: map,
icon: {
url: '/images/custom-marker.svg',
scaledSize: new google.maps.Size(40, 40),
origin: new google.maps.Point(0, 0),
anchor: new google.maps.Point(20, 40)
},
title: 'Vårt hovedkontor'
});Tips for markører:
- Bruk SVG-format for skalerbarhet
- Optimaliser størrelse (anbefalt 40x40px)
- Legg til
titlefor tilgjengelighet - Forbered @2x-versjon for Retina-skjermer
Merk at Googles oversikt over avviklinger har oppført google.maps.Marker som foreldet siden februar 2024, med google.maps.marker.AdvancedMarkerElement som erstatning. Eksemplene her bruker den gamle klassen, som fortsatt fungerer, men nye funksjoner kommer bare i avanserte markører, og de krever en map ID.
Flere markører og clustering i Google Maps
For nettsteder med mange plasseringer (butikkjeder, kontorer) trenger du avansert markørhåndtering.
Slik legger du til flere markører på Google Maps
const locations = [
{ lat: 59.9139, lng: 10.7522, title: 'Hovedkontor' },
{ lat: 59.9160, lng: 10.7550, title: 'Avdeling sentrum' },
{ lat: 59.9110, lng: 10.7480, title: 'Lager' }
];
const markers = locations.map(location => {
return new google.maps.Marker({
position: { lat: location.lat, lng: location.lng },
map: map,
title: location.title
});
});Gruppering av markører (Marker Clustering)
Når det er mange markører, bruk MarkerClusterer-biblioteket:
<script src="https://unpkg.com/@googlemaps/markerclusterer/dist/index.min.js"></script>import { MarkerClusterer } from '@googlemaps/markerclusterer';
// Opprett markører
const markers = locations.map(location => {
return new google.maps.Marker({
position: { lat: location.lat, lng: location.lng }
});
});
// Legg til clustering
const clusterer = new MarkerClusterer({
map,
markers,
renderer: {
render: ({ count, position }) => {
return new google.maps.Marker({
position,
label: { text: String(count), color: 'white' },
icon: {
path: google.maps.SymbolPath.CIRCLE,
scale: 20,
fillColor: '#4285F4',
fillOpacity: 0.9,
strokeWeight: 2,
strokeColor: '#ffffff'
}
});
}
}
});Infovinduer for markører (Info Windows)
Legg til informasjon om plassering:
const infoWindow = new google.maps.InfoWindow();
markers.forEach(marker => {
marker.addListener('click', () => {
const content = `
<div class="map-info-window">
<h3>${marker.title}</h3>
<p>Adresse: Eksempelgate 123</p>
<a href="https://www.google.com/maps/dir/?api=1&destination=${marker.position.lat()},${marker.position.lng()}"
target="_blank">Få veibeskrivelse</a>
</div>
`;
infoWindow.setContent(content);
infoWindow.open(map, marker);
});
});Slik filtrerer du markører etter kategori
For avanserte bruksområder (f.eks. filtrer butikker etter kategori):
function filterMarkers(category) {
markers.forEach(marker => {
const isVisible = category === 'all' || marker.category === category;
marker.setVisible(isVisible);
});
// Oppdater clustering
clusterer.clearMarkers();
const visibleMarkers = markers.filter(m => m.getVisible());
clusterer.addMarkers(visibleMarkers);
}
// Bruk
document.getElementById('filter-restaurants').addEventListener('click', () => {
filterMarkers('restaurant');
});Stedssøk, veibeskrivelse og Street View i Google Maps
Google Maps tilbyr mange interaktive funksjoner som kan berike brukeropplevelsen.
Stedssøk (Places Autocomplete)
Legg til autocomplete i adressefelt:
<input type="text" id="address-input" placeholder="Skriv inn adresse...">const autocomplete = new google.maps.places.Autocomplete(
document.getElementById('address-input'),
{
types: ['address'],
componentRestrictions: { country: 'no' } // Begrens til Norge
}
);
autocomplete.addListener('place_changed', () => {
const place = autocomplete.getPlace();
if (!place.geometry) {
console.log('Fant ikke plassering');
return;
}
// Trekk ut adressekomponenter
const addressComponents = {
street: place.address_components.find(c => c.types.includes('route'))?.long_name,
number: place.address_components.find(c => c.types.includes('street_number'))?.long_name,
city: place.address_components.find(c => c.types.includes('locality'))?.long_name,
postal: place.address_components.find(c => c.types.includes('postal_code'))?.long_name
};
console.log('Valgt adresse:', addressComponents);
});Veibeskrivelse (Directions)
La brukere få veibeskrivelse til din plassering:
const directionsService = new google.maps.DirectionsService();
const directionsRenderer = new google.maps.DirectionsRenderer();
directionsRenderer.setMap(map);
function calculateRoute(origin) {
const request = {
origin: origin,
destination: { lat: 59.9139, lng: 10.7522 }, // Din plassering
travelMode: google.maps.TravelMode.DRIVING,
provideRouteAlternatives: true
};
directionsService.route(request, (result, status) => {
if (status === 'OK') {
directionsRenderer.setDirections(result);
} else {
console.error('Veibeskrivelsesfeil:', status);
}
});
}
// Bruk med geolokalisering
document.getElementById('get-directions').addEventListener('click', () => {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(
position => {
const origin = `${position.coords.latitude},${position.coords.longitude}`;
calculateRoute(origin);
},
() => {
// Fallback: be om manuell inntasting
const origin = prompt('Skriv inn startadresse:');
if (origin) calculateRoute(origin);
}
);
}
});Street View
Legg til Street View-forhåndsvisning:
const panorama = new google.maps.StreetViewPanorama(
document.getElementById('street-view'),
{
position: { lat: 59.9139, lng: 10.7522 },
pov: {
heading: 34,
pitch: 10
},
zoom: 1
}
);
map.setStreetView(panorama);Slik gjør du om en adresse til koordinater (geokoding)
Konverter tekstadresser til koordinater:
const geocoder = new google.maps.Geocoder();
function geocodeAddress(address) {
geocoder.geocode({ address: address }, (results, status) => {
if (status === 'OK') {
const location = results[0].geometry.location;
map.setCenter(location);
new google.maps.Marker({
map: map,
position: location
});
console.log('Koordinater:', location.lat(), location.lng());
} else {
console.error('Geokoding mislyktes:', status);
}
});
}
// Bruk
geocodeAddress('Karl Johans gate, Oslo');Beste Google Maps-plugin for WordPress
Hvis du ikke vil implementere kartet selv, velg en av de populære pluginene.
WP Go Maps (tidligere Google Maps Easy)
Best for: Brukere uten programmeringsferdigheter
| Funksjon | Tilgjengelighet |
|---|---|
| Visuelt grensesnitt | ✅ Ja |
| Flere markører | ✅ Ja |
| Clustering | ✅ Pro |
| Egendefinerte stiler | ✅ Ja |
| GDPR-samsvar | ✅ Ja |
| Pris | Gratis / 39$ Pro |
Fordeler:
- Intuitivt grensesnitt
- Innebygd GDPR-støtte
- Støtte for flere kart
Ulemper:
- Begrensede muligheter i gratisversjonen
- Mindre fleksibel enn egendefinert implementering
MapPress
Best for: Bloggere og små nettsteder
| Funksjon | Tilgjengelighet |
|---|---|
| Automatiske kart fra innlegg | ✅ Ja |
| Shortcodes | ✅ Ja |
| Responsivitet | ✅ Ja |
| Egendefinerte markører | ✅ Pro |
| Pris | Gratis / 39$ Pro |
Fordeler:
- Automatisk oppretting av kart fra egendefinerte felt
- Enkel integrasjon med innlegg
Ulemper:
- Færre funksjoner enn WP Go Maps
- Begrenset dokumentasjon
Intergeo
Best for: Avanserte brukere
| Funksjon | Tilgjengelighet |
|---|---|
| Flere lag | ✅ Ja |
| Import/Export | ✅ Ja |
| Egendefinerte overlegg | ✅ Ja |
| AdSense-integrasjon | ✅ Ja |
| Pris | Gratis |
Fordeler:
- Gratis med de fleste funksjoner
- Avanserte lagalternativer
Ulemper:
- Mindre intuitiv
- Sjeldnere oppdatert
Advanced Custom Fields + Map Field
Best for: Utviklere
Hvis du bruker ACF, kan du legge til et kartfelt:
// functions.php
function my_acf_init() {
acf_update_setting('google_api_key', 'DIN_API_NØKKEL');
}
add_action('acf/init', 'my_acf_init');Fordeler:
- Full kontroll over visning
- Integrasjon med egendefinerte felt
- Ingen ekstra plugin for kart
Ulemper:
- Krever programmeringsferdigheter
- Selvstendig implementering av visning
Hvilken Google Maps-plugin bør du velge
| Scenario | Anbefaling |
|---|---|
| Enkelt kart, ingen koding | WP Go Maps |
| Kart i innlegg/blogg | MapPress |
| Avanserte funksjoner, gratis | Intergeo |
| Full kontroll, egendefinert utvikling | ACF + custom code |
Google Maps i WordPress uten plugin
For full kontroll og optimalisering, implementer kartet selv.
Filstruktur
ditt-tema/
├── assets/
│ ├── js/
│ │ ├── maps-config.js # API-konfigurasjon
│ │ ├── maps-loader.js # Lazy loading
│ │ └── maps-init.js # Kartinitialisering
│ └── css/
│ └── maps.css # Kartstiler
└── template-parts/
└── map-container.php # Kart-HTMLRegistrering og lasting av skript
// functions.php
function enqueue_google_maps() {
// Vi laster ikke Google Maps umiddelbart!
// I stedet laster vi vår egendefinerte loader
wp_enqueue_script(
'maps-loader',
get_template_directory_uri() . '/assets/js/maps-loader.js',
[],
'1.0.0',
true
);
// Sende variabler til JS
wp_localize_script('maps-loader', 'mapsConfig', [
'apiKey' => get_option('google_maps_api_key'),
'mapId' => get_option('google_maps_map_id'),
'defaultLat' => 59.9139,
'defaultLng' => 10.7522,
'consentRequired' => true
]);
wp_enqueue_style(
'maps-styles',
get_template_directory_uri() . '/assets/css/maps.css'
);
}
add_action('wp_enqueue_scripts', 'enqueue_google_maps');Google Maps-loader med GDPR-samtykke
// assets/js/maps-loader.js
(function() {
'use strict';
const config = window.mapsConfig || {};
let mapLoaded = false;
// Sjekk samtykke
function hasConsent() {
// Integrasjon med Cookiebot
if (window.Cookiebot) {
return Cookiebot.consent && Cookiebot.consent.marketing;
}
// Integrasjon med Complianz
if (window.cmplz_consent) {
return cmplz_consent.marketing;
}
// Egendefinert localStorage
const consent = localStorage.getItem('cookie_consent');
if (consent) {
return JSON.parse(consent).marketing === true;
}
return false;
}
// Last Google Maps API
function loadGoogleMaps() {
if (mapLoaded) return;
mapLoaded = true;
const script = document.createElement('script');
script.src = `https://maps.googleapis.com/maps/api/js?key=${config.apiKey}&callback=initMap&loading=async`;
script.async = true;
script.defer = true;
document.head.appendChild(script);
}
// Initialisering etter lasting av API
window.initMap = function() {
const mapContainer = document.getElementById('custom-map');
if (!mapContainer) return;
const map = new google.maps.Map(mapContainer, {
center: { lat: config.defaultLat, lng: config.defaultLng },
zoom: 15,
mapId: config.mapId,
disableDefaultUI: true,
zoomControl: true
});
// Legg til markør
new google.maps.Marker({
position: { lat: config.defaultLat, lng: config.defaultLng },
map: map,
title: 'Vår plassering'
});
};
// Lazy loading med Intersection Observer
function initLazyLoading() {
const mapContainer = document.getElementById('map-container');
if (!mapContainer) return;
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting && hasConsent()) {
loadGoogleMaps();
observer.unobserve(entry.target);
}
});
}, {
rootMargin: '100px',
threshold: 0.1
});
observer.observe(mapContainer);
}
// Håndtere samtykkeknapp
document.addEventListener('click', function(e) {
if (e.target.matches('.load-map-btn')) {
e.preventDefault();
// Lagre samtykke
localStorage.setItem('cookie_consent', JSON.stringify({
marketing: true,
timestamp: Date.now()
}));
loadGoogleMaps();
}
});
// Lytte etter samtykkeendringer
document.addEventListener('cookie_consent_updated', function(e) {
if (e.detail.marketing && !mapLoaded) {
loadGoogleMaps();
}
});
// Initialisering
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initLazyLoading);
} else {
initLazyLoading();
}
})();HTML-mål
<!-- template-parts/map-container.php -->
<div id="map-container" class="map-wrapper">
<?php if (!isset($_COOKIE['cookie_consent_marketing'])) : ?>
<!-- Fasade før samtykke -->
<div class="map-facade">
<img
src="<?php echo get_template_directory_uri(); ?>/assets/images/map-placeholder.avif"
alt="Kart over plassering - klikk for å laste"
loading="lazy"
width="800"
height="450"
>
<div class="map-overlay">
<h3>Se vår plassering</h3>
<p>Google Maps krever aksept av informasjonskapsler.</p>
<button class="load-map-btn btn btn-primary">
🗺️ Last kart
</button>
<p class="privacy-note">
<a href="/nb/personvernerkl-ring/">Les mer om databehandling</a>
</p>
</div>
</div>
<?php endif; ?>
<!-- Kartbeholder -->
<div id="custom-map" style="height: 400px; width: 100%;"></div>
</div>CSS-stiler for kartbeholderen
/* assets/css/maps.css */
.map-wrapper {
position: relative;
width: 100%;
border-radius: 8px;
overflow: hidden;
}
.map-facade {
position: relative;
cursor: pointer;
}
.map-facade img {
width: 100%;
height: auto;
display: block;
}
.map-overlay {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background: rgba(255, 255, 255, 0.95);
padding: 2rem;
border-radius: 8px;
text-align: center;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
}
.map-overlay h3 {
margin: 0 0 0.5rem;
font-size: 1.25rem;
}
.map-overlay p {
margin: 0 0 1rem;
color: #666;
}
.privacy-note {
font-size: 0.875rem;
margin-top: 1rem;
}
.privacy-note a {
color: #4285F4;
}
#custom-map {
min-height: 400px;
}
/* Responsivitet */
@media (max-width: 768px) {
.map-overlay {
padding: 1rem;
width: 90%;
}
#custom-map {
min-height: 300px;
}
}Vanlige Google Maps-feil i WordPress
Vanlige problemer og løsninger.
Feilen “This page can’t load Google Maps correctly”
Årsaker:
- Manglende eller feil API-nøkkel
- Ingen aktiv faktureringskonto
- HTTP-henvisningsbegrensninger blokkerer domenet
Løsninger:
- Sjekk at nøkkelen er korrekt i Cloud Console
- Sørg for at fakturering er aktivt
- Legg til domenet ditt i tillatte henvisninger
Feilen “You must enable Billing”
Løsning:
- Gå til Cloud Console og velg Billing
- Opprett eller velg en faktureringskonto
- Legg til betalingsmetode
- Koble kontoen til prosjektet
Google Maps vises ikke i WordPress
Sjekk:
- Har beholderen spesifisert høyde?
- Lastet Google Maps-skriptet? (Network-fanen)
- Er det feil i JavaScript-konsollen?
- Er callback
initMapdefinert?
Slik reduserer du høye API-kostnader for Google Maps
Årsaker og løsninger:
- Tyveri av nøkkel - rotasjon av nøkkel, legge til IP-begrensninger
- Boter - implementere reCAPTCHA, rate limiting
- Mangel på caching - cache geokodingsresultater
- For mange spørringer - optimalisering, lazy loading
Siden med Google Maps laster tregt
Løsninger:
- Bruk lazy loading med Intersection Observer
- Implementer fasade-mønsteret
- Legg til
async defertil skriptet - Bruk
preconnectfor Google-domener
Geokoding i Google Maps fungerer ikke
Sjekk:
- Er Geocoding API aktivert?
- Er adressen korrekt?
- Er API-grenser overskredet?
// Legg til feilhåndtering
geocoder.geocode({ address: address }, (results, status) => {
if (status === 'OK') {
// Suksess
} else if (status === 'ZERO_RESULTS') {
console.log('Fant ikke plassering');
} else if (status === 'OVER_QUERY_LIMIT') {
console.log('Spørringsgrense overskredet');
} else {
console.error('Geokodingsfeil:', status);
}
});Oppsummering
Integrering av Google Maps med WordPress i 2026 er mye mer enn å lime inn kode. Det er en omfattende prosess som krever oppmerksomhet på:
- Sikkerhet - sikring av API-nøkkel mot tyveri
- Ytelse - lazy loading og optimalisering for Core Web Vitals
- Personvern - GDPR-samsvar og samtykkehåndtering
- UX - egendefinerte stiler og interaktive funksjoner
- SEO - datakonsistens og strukturerte markeringer
Uansett om du velger en ferdig plugin eller egendefinert implementasjon - husk beste praksis. Et godt implementert kart er ikke bare et visuelt element, men et kraftig verktøy som støtter lokal SEO og konvertering.
Ikke la et kart senke hastigheten på nettstedet ditt eller utsette deg for bøter. Bygg det riktig - én gang, og gjør det skikkelig.







