← Terug naar kennisbank HOSTING

WordPress maintenance mode zetten zonder plugin

Even een grote update doen, een migratie draaien of een uur diagnose plegen op een live site? Dan wil je bezoekers een nette "even bezig"-pagina tonen in plaats van halve foutmeldingen of een witte pagina. Plugins voor maintenance mode zijn er genoeg — maar voor iets dat een paar regels code is, niet altijd nodig. Vier methoden, van WordPress-native tot je eigen volledig branded onderhoudspagina via .htaccess.

Wanneer zet je een site in maintenance mode?

  • Plugin- of thema-update die meer dan een paar seconden duurt
  • Database-migratie waarbij data inconsistent kan zijn
  • Hosting-verhuizing in combinatie met DNS-switch
  • Diagnose/debugging waarbij je tijdelijk plugins uit wilt zetten zonder dat klanten halve sites zien
  • Beveiligings-incident waarbij je site liever offline is tot je 'm hebt gecheckt

Wat je niet wilt: bezoekers die tijdens een update een halve pagina zien, een 500-error krijgen of erger — een onbeveiligde admin-bar. En zoekmachines die een gecorrumpeerde versie indexeren.

Methode 1 — .maintenance-bestand (WordPress native)

WordPress heeft een ingebouwde maintenance mode die het zelf gebruikt tijdens core/plugin-updates. Je kunt 'm handmatig activeren door één bestand aan te maken in de site-root:

// Bestand: .maintenance (in de site-root, zelfde niveau als wp-config.php)
<?php
$upgrading = time();

Zodra dit bestand bestaat, toont WordPress aan elke bezoeker een eenvoudige "Briefly unavailable for scheduled maintenance"-pagina. Verwijder het bestand om de site weer beschikbaar te maken.

Belangrijke beperkingen van methode 1

  1. Auto-timeout na 10 minuten: WordPress controleert of $upgrading minder dan 600 seconden geleden is. Bij een onderhoudsklus van > 10 minuten denkt WordPress dat de update vastliep en negeert het bestand. Workaround: zet de timestamp 5 minuten in de toekomst, of refresh hem regelmatig.
  2. Lelijke standaardpagina: kale tekst zonder branding. Voor een production-site niet ideaal.
  3. Geen IP-bypass: je sluit jezelf ook buiten. Als je tegelijkertijd wilt werken in wp-admin, werkt deze methode niet zonder maintenance.php-template (zie methode 2).
  4. Browser-fout: techniek geeft een 503 Service Unavailable, wat correct is, maar sommige browsers cachen dat agressief.

Methode 2 — Eigen maintenance.php template (branded + flexibel)

WordPress laadt automatisch een bestand wp-content/maintenance.php als dat bestaat, in plaats van de standaard onderhoudspagina. Hiermee kun je een volledig gebrand pagina ontwerpen.

Stap 1: maak wp-content/maintenance.php

<?php
http_response_code(503);
header('Retry-After: 3600');
?>
<!DOCTYPE html>
<html lang="nl">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Onderhoud — wij zijn zo terug</title>
    <meta name="robots" content="noindex">
    <style>
        body { font-family: -apple-system, sans-serif; background: #0e1e3d; color: #fff;
               display: flex; align-items: center; justify-content: center; min-height: 100vh;
               margin: 0; text-align: center; padding: 20px; }
        h1 { font-size: 32px; margin-bottom: 12px; }
        p { color: rgba(255,255,255,0.75); max-width: 480px; line-height: 1.6; }
        a { color: #20DD7B; }
    </style>
</head>
<body>
    <div>
        <h1>Even onderhoud aan onze site</h1>
        <p>We zijn momenteel kort offline voor onderhoud. Binnen een uur zijn we weer beschikbaar.
           Voor dringende vragen: <a href="mailto:info@jouwdomein.nl">info@jouwdomein.nl</a>.</p>
    </div>
</body>
</html>

Stap 2: activeer met .maintenance-file

Maak ook het .maintenance-bestand uit methode 1 aan. WordPress detecteert dat én ziet dat maintenance.php bestaat, dus toont jouw branded pagina in plaats van de standaard.

Voordelen

  • Volledig branded met jouw logo, kleuren en tekst
  • Behoudt de juiste 503-status — Google ziet het als tijdelijk en blijft je rankings respecteren
  • Werkt voor alle bezoekers, behalve admin-pagina's via methode 3 (hieronder)

Methode 3 — .htaccess redirect (geen WordPress nodig)

Soms is je hele WordPress-installatie tijdelijk niet werkend (bijv. tijdens een database-migratie). Dan kun je via Apache .htaccess alle bezoekers naar een statische HTML-pagina sturen:

Stap 1: maak onderhoud.html in de site-root

<!DOCTYPE html>
<html lang="nl">
<head>
    <meta charset="UTF-8">
    <title>Onderhoud</title>
    <style>
        /* Hetzelfde als methode 2, of een complete custom pagina */
    </style>
</head>
<body>
    <h1>Even bezig</h1>
    <p>We zijn binnen een uur weer terug.</p>
</body>
</html>

Stap 2: voeg deze regels toe aan .htaccess

# BEGIN Maintenance
<IfModule mod_rewrite.c>
    RewriteEngine On

    # Sta jouw eigen IP toe
    RewriteCond %{REMOTE_ADDR} !^123\.45\.67\.89$

    # Sta de onderhoud-pagina zelf en assets toe
    RewriteCond %{REQUEST_URI} !^/onderhoud\.html$
    RewriteCond %{REQUEST_URI} !\.(png|jpg|jpeg|gif|svg|css|js|woff2)$ [NC]

    # Stuur al het andere naar onderhoud.html met 503 status
    RewriteRule ^(.*)$ /onderhoud.html [R=503,L]
</IfModule>

# Status 503 met juiste headers
ErrorDocument 503 /onderhoud.html
Header always set Retry-After "3600"
# END Maintenance

Vervang 123.45.67.89 door jouw eigen IP-adres (te vinden via whatismyip.com). Dit zorgt dat jij de site normaal kunt blijven gebruiken terwijl alle anderen de onderhoudspagina zien.

Werkt zelfs als WordPress kapot is

Het krachtige aan deze methode: Apache leest .htaccess vóór PHP. Dus zelfs als je wp-config.php tijdelijk corrupt is of je database down — de onderhoudspagina werkt nog steeds. Ideaal tijdens migraties.

Klaar? Verwijder de regels uit .htaccess óf zet # BEGIN Maintenance in commentaar.

Methode 4 — WP-CLI maintenance mode

Voor wie comfortabel is op de command line — WP-CLI heeft sinds versie 2.9 ingebouwde commando's. Eén regel om aan/uit te zetten:

# Activeer maintenance mode
wp maintenance-mode activate

# Status checken
wp maintenance-mode status

# Deactiveren
wp maintenance-mode deactivate

Dit doet onder de motorkap exact wat methode 1 doet (een .maintenance-bestand aanmaken/verwijderen), maar dan vanaf de command line zonder dat je via FTP hoeft.

Combineer dit met methode 2 (maintenance.php template) en je hebt de mooiste workflow: eenmalig je branded template uploaden, en daarna toggle je maintenance mode met één commando.

IP-bypass voor de native methode (methode 1+2)

De .maintenance-methode sluit standaard ook jou buiten. Hier is een truc om alleen jouw IP toegang te geven, zonder je .htaccess te wijzigen:

Maak je maintenance.php dynamisch:

<?php
// wp-content/maintenance.php

$jouw_ip = '123.45.67.89'; // vervang door je eigen IP

if ($_SERVER['REMOTE_ADDR'] === $jouw_ip) {
    // Jij ziet de echte site
    return; // hint naar WordPress: stop met deze pagina te tonen
}

// Iedereen anders ziet onze pagina
http_response_code(503);
header('Retry-After: 3600');
?>
<!DOCTYPE html>
<html>
... (rest van de HTML zoals methode 2)

Let op: de return;-truc werkt niet als je .maintenance-file bestaat — WordPress laadt dan helemaal niet. Combineer dit met de methode in core.trac.wordpress.org waarbij je in wp-load.php een check toevoegt vóór de .maintenance-detectie. Iets te ver voor een quick tutorial — gebruik in dat geval beter methode 3 (.htaccess), die heeft IP-bypass natuurlijk ingebouwd.

Drie veelgemaakte fouten

1. Je vergeet de 503-status

Als je een statische HTML-pagina toont met status 200 (normaal), denkt Google dat dit je échte content is. Bij langer onderhoud verlies je dan rankings. Altijd 503 (Service Unavailable) teruggeven, eventueel met Retry-After-header zodat zoekmachines later terugkomen.

2. Je laat browser-cache de pagina vasthouden

Als je onderhoud.html caching-headers heeft (bijv. via je hoofdsite-cachebeleid), kan een bezoeker uren later nog steeds de onderhoudspagina te zien krijgen, ook al is je site al lang weer online. Voorkom dit:

<IfModule mod_headers.c>
    Header set Cache-Control "no-store, no-cache, must-revalidate, max-age=0"
    Header set Pragma "no-cache"
    Header set Expires "Mon, 01 Jan 1970 00:00:00 GMT"
</IfModule>

Dit in je .htaccess-blok onder de Maintenance-regels.

3. Je vergeet de mode uit te zetten

Klassieker. Site staat een dag in maintenance, klanten kunnen niets bestellen. Tip: zet altijd een herinnering in je telefoon of werk-tracker. Of gebruik een methode die zichzelf opheft na een uur (de .maintenance-file timeout helpt hier feitelijk).

Wat moet je in je onderhoudspagina zetten?

  • Korte uitleg: "We zijn even bezig met onderhoud" — niet meer details dan nodig.
  • Tijdsindicatie: "Binnen een uur weer beschikbaar" — geen exacte tijd want die loopt vast uit.
  • Contact: e-mailadres of telefoonnummer voor noodgevallen.
  • Branding: logo + huiskleuren — bezoekers zien dat het echt jouw site is, geen hosting-error of hijack.
  • Geen technische details: niet "we draaien een PHP 8.2 upgrade" — bezoekers hebben er niets aan.

SEO-impact: hoeveel maakt 503 uit?

Korte onderhoudsmodus (< 24u) met correcte 503-status is geen probleem voor je rankings. Google Search Console laadt dan tijdelijk crawl-errors, maar zodra je site terug is hervat het indexeren normaal.

Bij langer dan 24u onderhoud kan Google je pagina's tijdelijk uit de index halen. Dat gaat vrijwel altijd terug zodra de site weer online is, maar voor een week+ onderhoud is dit een aandachtspunt.

Wat je niet moet doen: een statische pagina serveren met status 200 ("we zijn dicht!"). Google denkt dan dat dit je echte homepage is en je raakt veel rankings kwijt.

Snelle keuze — welke methode wanneer?

  • Korte update (< 10 min) op een development-omgeving → methode 1, .maintenance-file
  • Production-site, branded pagina gewenst, < 1u onderhoud → methode 2, eigen maintenance.php
  • Migratie of database-update, IP-bypass nodig, kan WordPress kapot zijn → methode 3, .htaccess
  • Frequente onderhoudsmomenten, comfortabel met CLI → methode 4, WP-CLI + branded maintenance.php

Voor de meeste sites: combineer methode 2 (branded template) met methode 4 (WP-CLI toggle). Dat is professioneel, snel te activeren en bezoekers krijgen een nette pagina.