Hvordan legge til Google Maps i WordPress i 2026: Komplett utviklerguide

Hvordan legge til Google Maps i WordPress i 2026: Komplett utviklerguide

Sist verifisert: 14. oktober 2026
28 min lesetid
Veiledning
Full-stack-utvikler

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:

  1. Core Web Vitals - Google Maps laster som standard ~2MB JavaScript, noe som kan ødelegge LCP- og INP-resultater
  2. Privacy-First Web - GDPR, ePrivacy Directive og nye forskrifter krever eksplisitt samtykke for å laste kart
  3. 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
  4. 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

  1. Gå til Google Cloud Console
  2. Klikk prosjektvelgeren (øverste bjelke) og velg “New Project”
  3. Gi prosjektet et navn (f.eks. “WordPress Maps - DinBedrift”)
  4. Velg organisasjon (valgfritt) og plassering
  5. 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:

APIFormålGratis terskel per måned (modellen fra mars 2025)
Maps JavaScript APIInteraktive kart på nettstedet10 000 kartinnlastinger (Dynamic Maps, Essentials)
Geocoding APIKonvertere adresser til koordinater10 000 hendelser (Essentials)
Places APIAutocomplete-adresser, stedsdetaljerLegacy, nye prosjekter bruker Places API (New), se prissiden
Static Maps APIStatiske kartbilder10 000 hendelser (Essentials)

Prisene over terskelen endrer seg og står på Googles prisside.

For å aktivere API-er:

  1. I Cloud Console, gå til “APIs & Services” og velg “Library”
  2. Søk etter “Maps JavaScript API”
  3. Klikk “Enable”
  4. 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:

  1. Gå til “Billing” og velg “Manage billing accounts”
  2. Opprett en ny faktureringskonto eller velg en eksisterende
  3. Legg til betalingsmetode (kredittkort)
  4. 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:

  1. Gå til “APIs & Services” og velg “Credentials”
  2. Klikk “Create credentials” og velg “API key”
  3. Kopier den genererte nøkkelen

Konfigurere begrensninger (obligatorisk!):

  1. Application restrictions - velg “HTTP referrers (web sites)”
  2. Legg til domenene dine:
    https://dittnettsted.no/*
  3. API restrictions - velg “Restrict key”
  4. 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 HTTPS

Unngå:

  • Ikke bruk * (wildcard) uten domene - dette tillater bruk av nøkkelen fra hvilken som helst side
  • Ikke legg til http:// uten https:// - 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:

  1. Gå til “APIs & Services” og velg “Dashboard”
  2. Analyser bruksgrafer
  3. 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:

  1. Umiddelbar rotasjon:

    • Gå til “Credentials”
    • Klikk rotasjonsikonet ved nøkkelen
    • En ny nøkkel vil bli generert
  2. Analysere logger:

    • Sjekk “Metrics” i Cloud Console
    • Identifiser kilden til uautorisert trafikk
  3. 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

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”):

  1. Tilleggssamtykke kreves - vilkårene for Google Maps Platform krever uttrykkelig, forhåndsgitt og tilbakekallbart samtykke før posisjonen hentes
  2. Browser API - bruk navigator.geolocation med feilhåndtering
  3. 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

BeregningHva Maps API påvirkerMålgrense
LCPSkript og kartfliser konkurrerer med hovedinnholdet om nettverket< 2.5s
INPJavaScript-kjøring på hovedtråden forsinker svar på klikk< 200ms
TBTLange oppgaver når kartet initialiseres< 200ms
CLSEn 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ØKKEL

#Strategi 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øsningPrisPersonvernYtelseFunksjonalitet
Google MapsGratis terskel per SKU, se prissidenKrever samtykke~2MBFull
OpenStreetMap + LeafletGratisPrivat~150KBGrunnleggende
Mapbox50,000 hendelser/mnd. gratisKrever samtykke~300KBAvansert
HERE MapsFreemiumKrever samtykke~400KBAvansert
Apple MapsGratis (kun Apple)PrivatVariabelBegrenset

#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å:

  1. Gå til Google Cloud Console og velg “Map Styles”
  2. Klikk “Create style”
  3. Bruk visuell redigerer eller importer JSON
  4. Koble stilen til et Map ID
  5. 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 title for 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

FunksjonTilgjengelighet
Visuelt grensesnitt✅ Ja
Flere markører✅ Ja
Clustering✅ Pro
Egendefinerte stiler✅ Ja
GDPR-samsvar✅ Ja
PrisGratis / 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

FunksjonTilgjengelighet
Automatiske kart fra innlegg✅ Ja
Shortcodes✅ Ja
Responsivitet✅ Ja
Egendefinerte markører✅ Pro
PrisGratis / 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

FunksjonTilgjengelighet
Flere lag✅ Ja
Import/Export✅ Ja
Egendefinerte overlegg✅ Ja
AdSense-integrasjon✅ Ja
PrisGratis

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

ScenarioAnbefaling
Enkelt kart, ingen kodingWP Go Maps
Kart i innlegg/bloggMapPress
Avanserte funksjoner, gratisIntergeo
Full kontroll, egendefinert utviklingACF + 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-HTML

#Registrering 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:

  1. Manglende eller feil API-nøkkel
  2. Ingen aktiv faktureringskonto
  3. HTTP-henvisningsbegrensninger blokkerer domenet

Løsninger:

  1. Sjekk at nøkkelen er korrekt i Cloud Console
  2. Sørg for at fakturering er aktivt
  3. Legg til domenet ditt i tillatte henvisninger

#Feilen “You must enable Billing”

Løsning:

  1. Gå til Cloud Console og velg Billing
  2. Opprett eller velg en faktureringskonto
  3. Legg til betalingsmetode
  4. Koble kontoen til prosjektet

#Google Maps vises ikke i WordPress

Sjekk:

  1. Har beholderen spesifisert høyde?
  2. Lastet Google Maps-skriptet? (Network-fanen)
  3. Er det feil i JavaScript-konsollen?
  4. Er callback initMap definert?

#Slik reduserer du høye API-kostnader for Google Maps

Årsaker og løsninger:

  1. Tyveri av nøkkel - rotasjon av nøkkel, legge til IP-begrensninger
  2. Boter - implementere reCAPTCHA, rate limiting
  3. Mangel på caching - cache geokodingsresultater
  4. For mange spørringer - optimalisering, lazy loading

#Siden med Google Maps laster tregt

Løsninger:

  1. Bruk lazy loading med Intersection Observer
  2. Implementer fasade-mønsteret
  3. Legg til async defer til skriptet
  4. Bruk preconnect for Google-domener

#Geokoding i Google Maps fungerer ikke

Sjekk:

  1. Er Geocoding API aktivert?
  2. Er adressen korrekt?
  3. 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å:

  1. Sikkerhet - sikring av API-nøkkel mot tyveri
  2. Ytelse - lazy loading og optimalisering for Core Web Vitals
  3. Personvern - GDPR-samsvar og samtykkehåndtering
  4. UX - egendefinerte stiler og interaktive funksjoner
  5. 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.

#Relaterte ressurser og videre lesning

#Offisiell dokumentasjon

#Verktøy

#WordPress

#Ytelsesoptimalisering

#GDPR og personvern

Se vår WordPress-hastighetsoptimalisering.

Neste steg

Gjør artikkelen om til faktisk implementering

Denne blokken styrker intern lenking og sender leseren videre til de mest relevante tjenestene og innholdet.

Vil du få dette implementert på nettstedet ditt?

Hvis du planlegger headless WordPress, frikoblet frontend eller migrering til Astro, kan jeg bygge arkitektur, API og frontend.

Artikkel-FAQ

Ofte stilte spørsmål

Praktiske svar for å bruke temaet i faktisk arbeid.

SEO-readyGEO-readyAEO-ready5 Q&A
Er Google Maps gratis etter mars 2025?#
Den månedlige kreditten på 200 USD er erstattet av en gratis månedlig terskel for hver Core Services-SKU. Dynamic Maps, Static Maps og Geocoding har 10 000 fakturerbare hendelser hver per måned, og Maps Embed API er oppført som ubegrenset. Prisene over terskelen står på Googles prisside for Maps Platform.
Trenger Maps Embed API en API-nøkkel?#
Ja. Embed API er gratis med ubegrensede forespørsler, men hver forespørsel krever en API-nøkkel. Legg også til referrerpolicy på iframen, ellers avviser en nøkkel som er begrenset til nettstedet ditt, forespørselen.
Hvordan begrenser jeg Google Maps API-nøkkelen?#
Legg til en begrensning til nettsteder (HTTP-henvisninger) med domenene dine, og begrens nøkkelen til API-ene den faktisk kaller, for eksempel Maps JavaScript API og Geocoding API. En kvote per minutt eller per dag stopper forespørsler over grensen, mens et budsjett bare sender varsler.
Krever et Google-kart samtykke?#
I praksis bør kartet lastes først etter samtykke eller etter et klikk på en tydelig merket plassholder. Hver forespørsel til Googles servere eksponerer IP-adressen, ePrivacy-direktivet krever samtykke for lagring og lesing på enheten, og etter Fashion ID-dommen kan nettstedseieren være felles behandlingsansvarlig for overføringen til Google. Det gjelder også iframen fra Embed API.
Hva erstatter google.maps.Marker?#
Google har merket google.maps.Marker som foreldet siden februar 2024 og peker på google.maps.marker.AdvancedMarkerElement som erstatning. Den gamle klassen fungerer fortsatt, men nye funksjoner kommer bare i avanserte markører, og de krever en map ID (mapId) for å lastes.

Trenger du FAQ tilpasset bransje og marked? Vi lager en versjon som støtter dine forretningsmål.

Ta kontakt

Relaterte artikler