Skip to content

Alt om WordPress, webutvikling — og mer til

⚙️ Grav: ofte brukte innstillinger og kodebiter (Markdown, Twig, Atom editor)

⚙️ Grav: ofte brukte innstillinger og kodebiter (Markdown, Twig, Atom editor)

Når du har jobbet med Grav CMS i flere år, samler du opp et sett med snutter som følger deg fra prosjekt til prosjekt. YAML frontmatter, Twig-maler, syntaksuthevingskonfigurasjoner, Atom-regex-mønstre: å grave i dokumentasjon eller et gammelt repository hver gang er bortkastet tid. Særlig når Grav kjører på en VPS og du må huske hvordan du installerer sqlite-driveren for PHP 8.3 på riktig måte, eller kommenterer ut SetHandler etter en Apache-oppdatering.

Dette juksearket er en destillasjon fra praksis i den virkelige verden: standard topptekst, Markdown-innstillinger for sider, Twig-snutter i post body, Atom-regex for etterbehandling av.md-eksporter og Ubuntu-serverkommandoer. Alt på ett sted, med forklaringer på hva og hvorfor.

💡 Rask oversikt:

  • Konfigurer Grav YAML frontmatter med alle felt: taxonomy, page-toc, highlight, process, egendefinert page-addon
  • Sett opp Markdown-logikk i sidetopper: title, description, date, taxonomies, template
  • Legg til Twig-kode i body: automatisk innholdsfortegnelse via toc(), Unitegallery-galleri
  • Bearbeid Writage.md-eksporter i Atom: erstatt media/ i stier, send med klasser for lazy load
  • Sett opp servermiljø: SQLite, Memcached, PHP 8.3 på Ubuntu 24.04, redigering av php*.conf for Virtualmin

Grav standardtopptekst for alle sider på nettstedet

Den grunnleggende Grav side YAML frontmatter inneholder felt som CMS-et leser under rendring. Nedenfor finner du en fungerende mal som dekker de fleste typiske oppgaver: fra taksnomier til egendefinerte page-addon-flagg.

1title: ''
2date: '2026-06-14 10:00'
3published: true
4media_order: poster.jpg
5metadata:
6 description: ''
7taxonomy:
8 category:
9 - WordPress
10 tag:
11 - WordPress - Plugins
12 - WordPress - Admin
13page-toc:
14 active: true
15template: blog_item
16highlight:
17 enabled: true
18 lines: true
19page-addon:
20 ifarmelazy: true

page-toc.active: true aktiverer Page Toc-utvidelsen (GitHub), som bygger en innholdsfortegnelse fra H1-H6 direkte på siden. template: blog_item setter eksplisitt malen for bloggundersider, slik at Grav ikke bestemmer den heuristisk ved hver rendring.

page-addon-blokken er en egendefinert seksjon for brukerdefinerte flagg. Her aktiverer ifarmelazy: true lazy loading for iframes: i filen user/themes/g5_helium/custom/templates/partials/blog_item.html.twig utløses en betingelse som laster inn iframe.ly-skriptet.

1{% if attribute(page.header, 'page-addon').ifarmelazy %}
2 <script async charset="utf-8" src="//cdn.iframe.ly/embed.js"></script>
3{% endif %}
4

For å sette inn selve iframen (for eksempel en YouTube-video), bruk denne strukturen:

1<iframe allowfullscreen
2 data-iframely-url="https://www.youtube.com/embed/54WI1XSilb4"
3 scrolling="no"
4 style="border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;">
5</iframe>

Markdown-innstillinger for topptekster på innleggssider

Denne delen dekker felt som angis i toppteksten på hvert enkelt innlegg.

Tittel og beskrivelse

1title: 'Grav + Gantry 5 — an overview of useful extensions and resources'
2metadata:
3 description: 'A collection of Grav extensions for Gantry 5 that speed up work with content and templates.'

Beskrivelsen havner i <meta name="description"> og er viktig for utdrag i søkeresultater.

Opprettelsesdato og Auto Date

1date: '2026-06-14 10:00'

For å få datoen automatisk satt når du oppretter en side, installer Auto Date-utvidelsen, github.com/getgrav/grav-plugin-auto-date. Den setter inn gjeldende dato og klokkeslett dersom date-feltet ikke fylles ut manuelt.

Taksnomier

For én enkelt kategori og én enkelt tag, flat syntaks:

1taxonomy:
2 category: WEB
3 tag: Markdown

For flere verdier, bruk listeformat:

1taxonomy:
2 category:
3 - Grav
4 tag:
5 - Grav - Gantry 5
6 - Grav - Plugins

Page Toc og mal

Page Toc genererer en innholdsfortegnelse fra overskrifter i sideinnholdet. I tillegg til flagget page-toc.active: true i toppteksten, kan du legge til Twig-kode direkte i temamalen (se Twig-avsnittet nedenfor).

template: blog_item angis manuelt slik at Grav pålitelig bruker malen for blogginnlegg, ettersom CMS-et noen ganger feiler med automatisk gjenkjenning for nye sider.

Markdown- og Twig-forprosessorer

1process:
2 markdown: true
3 twig: true
4twig_first: true

twig_first: true betyr at Grav først vil prosessere Twig-malmotoren, deretter Markdown. Rekkefølgen er kritisk hvis sideinnholdet inneholder Twig-logikk som genererer Markdown-markering.

Syntaksutheving (Highlight)

Avhenger av Highlight-utvidelsen, github.com/getgrav/grav-plugin-highlight.

1highlight:
2 enabled: true
3 lines: true

lines: true legger til linjenummerering i uthevede kodeblokker.

Twig-innstillinger for sideinnhold

Automatisk innholdsfortegnelse via toc()

Page Toc kan fungere ikke bare fra toppteksten, men også gjennom direkte innsetting i temamalen. I filen user/themes/g5_helium/custom/templates/partials/blog_item.html.twig, legg til:

1{# PAGE TOC START #}
2{#
3page-toc:
4 active: true
5 #}
6{% if attribute(page.header, 'page-toc').active %}
7 {% set table_of_contents = toc(page.content) %}
8 {% if table_of_contents is not empty %}
9 Table of contents:
10 {{ table_of_contents|raw }}
11 {% endif %}
12
13{% endif %}
14{# PAGE TOC END #}
15

Twig-funksjonen toc(page.content) analyserer overskrifter i page.content og returnerer et strukturert tre. Betingelsen sjekker flagget page-toc.active fra toppteksten, slik at du kan aktivere og deaktivere innholdsfortegnelsen for enkeltsider uten å røre malen.

Bildegalleri via Unitegallery

Unitegallery-utvidelsen, github.com/variar/grav-plugin-unitegallery, legger til et galleri i Grav basert på Unitegallery JS-biblioteket med flere visningstemaer.

Etter installasjon via administrasjonspanelet eller GPM (Grav Package Manager), legges en enkelt linje til i sideinnholdet:

1{{ unite_gallery(page.media.images) | raw }}
2

Den gjengir alle bilder som er lastet opp til sidens mediesamling som et galleri.

Atom søk og erstatt for Writage.md-eksporter

Når du eksporterer WordPress-innlegg til Markdown via Writage, inneholder bildestier prefikset media/, og aktivering av lazy loading krever klassene figure-img og img-fluid. Å redigere hver URL manuelt er meningsløst; Atom med regulære uttrykk gjør det på et sekund.

Lazy Image-utvidelsen håndterer lazy loading, github.com/unsaturated/grav-plugin-lazy-image.

Finn (regulært uttrykk):

1(![.*]()(media/)(.*)())

Erstatt med lightbox-variant (FeatherLight-plugin):

1$1$3)

Erstatt med kun lazy loading:

1$1$3?classes=figure-img,img-fluid)

Etter erstatning får bildet en classes-spørringsparameter som Lazy Image fanger opp.

Arbeid med miniatyrbilder

Grav kan manipulere bilder dynamisk: endre størrelse, beskjære, mellomlagre. Et sideminiatyrbilde settes via Markdown-syntaks med spørringsparametere:

1![ALT Image](https://learn.getgrav.org/20/content/media)

Mer om medieegenskapene i den offisielle dokumentasjonen: learn.getgrav.org/content/media.

Ubuntu 24.04-serveroppsett for Grav

Grav på en VPS krever PHP, SQLite (for intern plugin-database), og fortrinnsvis Memcached (side-mellomlagring). Nedenfor følger aktuelle kommandoer for Ubuntu 24.04 LTS og PHP 8.3.

Installere PDO SQLite på PHP 8.3

1sudo apt-get update
2sudo apt-get install php8.3-sqlite
3sudo systemctl restart apache2

SQLite brukes av Grav til å lagre logger, plugin-mellomlager og intern bokføring. Uten driveren vil adminpanelet krasje med en databasetilkoblingsfeil.

Installere Memcached

Aktuell veiledning: tecadmin.net/install-memcached-with-php-on-ubuntu/.

1sudo apt-get update
2sudo apt-get install memcached
3
4sudo add-apt-repository ppa:ondrej/php
5sudo apt-get update
6sudo apt-get install -y php php-dev php-pear libapache2-mod-php
7
8sudo apt-get install -y php-memcached
9
10sudo systemctl restart apache2

PHP-filer kjøres ikke etter versjonsbytte (Virtualmin/Webmin)

Etter å ha byttet fra PHP 7.x til 8.3 kan Apache levere .php-filer som tekst i stedet for å kjøre dem, en kjent oppførsel ved modulbytte. Problemet er SetHandler-direktiver i PHP-modulens konfigurasjon.

1sudo nano /etc/apache2/mods-enabled/php8.3.conf

Kommenter ut disse linjene:

1 # SetHandler application/x-httpd-php
2 # SetHandler application/x-httpd-php-source

Endelig php8.3.conf etter redigering:

1&lt;filesmatch &quot;.+\.ph(ar|p|tml)$&quot;&gt;
2 # SetHandler application/x-httpd-php
3</filesmatch>
4<filesmatch ".+\.phps$">
5 # SetHandler application/x-httpd-php-source
6 # Deny access to raw php sources by default
7 # To re-enable it's recommended to enable access to the files
8 # only in specific virtual host or directory
9 Require all denied
10</filesmatch>
11
12 # Deny access to files without filename (e.g. '.php')
13&lt;filesmatch &quot;^\.ph(ar|p|ps|tml)$&quot;&gt;
14 Require all denied
15</filesmatch>
16
17 # Running PHP scripts in user directories is disabled by default
18 #
19 # To re-enable PHP in user directories comment the following lines
20 # (from <IfModule ...> to </IfModule>.) Do NOT set it to On as it
21 # prevents .htaccess files from disabling it.
22<ifmodule mod_userdir.c="">
23 <directory /home/*/public_html>
24 php_admin_flag engine Off
25 </directory>
26</ifmodule>

Etter redigering, start Apache på nytt:

1sudo systemctl restart apache2

Video: hva er Grav CMS og hvor bør du starte

En kort introduksjon til Grav for deg som hører om flatfil-CMS for første gang: hva som ligger under panseret, hvordan innhold er strukturert, og hvorfor det å kjøre uten database kan være raskere.

⁉️🤔 Ofte stilte spørsmål

Trenger Grav en database?

Nei, Grav er et flatfil-CMS. Alt innhold, innstillinger, taksonomier og metadata lagres i tekstfiler (Markdown og YAML). SQLite brukes valgfritt for interne behov: plugin-cache, logger, køer. PostgreSQL og MySQL er ikke offisielt påkrevd. I praksis betyr dette at sikkerhetskopiering av et nettsted er så enkelt som å kopiere /user-mappen.

Er Page Toc-pluginen obligatorisk for innholdsfortegnelse?

Den kan erstattes med direkte Twig-kode ved å bruke toc(page.content) i temamalen. Men pluginen er mer praktisk for rask aktivering/deaktivering via et flagg i YAML-frontmatter på en bestemt side. Hvis nettstedet ditt har 50+ sider, er administrasjon via header mer praktisk enn forgrening i malen.

Hvordan skiller Highlight seg fra Prism.js eller Highlight.js?

Highlight er den offisielle Grav-pluginen som integrerer highlight.js direkte i renderingspipelinen. Den forstår enabled- og lines-flagg fra YAML-headeren og krever ikke manuell inkludering av JS/CSS; GPM håndterer alt. Prism.js må inkluderes manuelt i temaet.

Er Grav fortsatt relevant i 2026 sammenlignet med WordPress?

For visse scenarioer, ja. Grav vinner for statiske visittkortsider, porteføljer, dokumentasjon og landingssider der kompleks brukerlogikk og e-handel ikke er nødvendig. Flatfil-arkitektur gir umiddelbar respons uten database, og innholdsversjonskontroll fungerer via Git. Men for en blogg med tusenvis av innlegg, et mediebibliotek og dynamiske arkiver, er WordPress mer praktisk på grunn av sitt plugin-økosystem.

Hva bør jeg gjøre hvis Grav-administrasjonspanelet slutter å fungere etter en PHP-oppdatering?

Tre typiske årsaker: (1) php8.x-sqlite er ikke installert, og Grav krasjer stille uten databasedriveren; (2) SetHandler er ikke kommentert ut i php8.x.conf når du bruker Virtualmin, og Apache serverer .php som tekst; (3) tillatelser på cache/-, logs/- og backup/-mappene inne i /user har blitt tilbakestilt, så kjør chown -R www-data:www-data user/.

Ferdig jukseark: hva du skal kopiere inn i prosjektet ditt

Seks filer og pluginer som starter et typisk Grav-prosjekt på VPS: header med taksonomier og page-toc, Twig-innholdsfortegnelse i malen, Markdown-forprosessor, Highlight, Unitegallery og Atom-regex for etterbehandling av eksport. Legg til serveroppsettet fra Ubuntu 24.04-delen, så har du et fullt klart miljø på en halvtime. Bokmerk denne siden; vi oppdaterer kodebitene for gjeldende Grav- og PHP-versjoner.