Scope en versies. Deze naslag behandelt de wp-config.php-constanten die je het meest tegenkomt, aanpast of verklaard moet krijgen, voor WordPress 5.5 en nieuwer, met expliciete notities waar een constante pas vanaf een latere versie bestaat (WordPress 5.5 introduceerde WP_ENVIRONMENT_TYPE, WordPress 6.3 introduceerde WP_DEVELOPMENT_MODE). Bewust gekozen, niet uitputtend. De officiële wp-config.php-reference uit het Advanced Administration Handbook somt elke constante op die WordPress herkent, en het APIs-handbook behandelt ze nog een keer vanuit een developer-hoek. Dit artikel kiest de subset die in de dagelijkse praktijk telt en legt uit wat de defaults echt betekenen.
Eerst een kleine kadering. Elke constante hieronder is een PHP define() die moet draaien voordat wp-settings.php start, en daarom zet WordPress de markering /* That's all, stop editing! Happy publishing. */ in het meegeleverde bestand. Constanten die je onder die regel plakt, worden in sommige bootstrap-situaties genegeerd. De regel is dus simpel: zet nieuwe defines boven die markering, niet eronder.
Wat wp-config.php regelt
wp-config.php staat in de WordPress-root (of, in een gehardende setup, één map hoger, daar kijkt WordPress automatisch). Het is een PHP-bestand dat heel vroeg in de WordPress-bootstrap door wp-load.php wordt geladen, en het zet de omgeving op waar wp-settings.php daarna de rest van core mee initialiseert. Het regelt grofweg drie dingen:
- Bootstrap-parameters: database-credentials, table prefix, site-URLs, filesystem-methode, cache-includes. Deze worden ingelezen voordat WordPress-core draait.
- Runtime-toggles: debug-flags, memory-limieten, environment type, cron-gedrag. Deze worden gelezen terwijl WordPress draait en sturen het gedrag van elk request.
- Security-constanten: keys en salts die
wp_salt()gebruikt om authentication-cookies en nonces te salten.
Omdat het een gewoon PHP-bestand is, worden wijzigingen actief bij het volgende request. Geen service te restarten, geen cache te flushen, geen daemon te reloaden. Dit is een hardnekkig misverstand (onderaan dit artikel staat de uitleg), en het brengt site-eigenaren in verwarring die denken dat wp-config.php zich gedraagt als een PHP-ini-bestand.
Database-verbinding
De vier database-constanten zijn wat de WordPress-installer als eerste neerzet. Ze zijn verplicht en het zijn de enige plek waar WordPress credentials voor MySQL of MariaDB opslaat:
| Constante | Type | Verplicht | Omschrijving |
|---|---|---|---|
DB_NAME |
string | ja | Naam van de database waarmee WordPress verbindt. |
DB_USER |
string | ja | MySQL- of MariaDB-gebruiker met rechten op DB_NAME. |
DB_PASSWORD |
string | ja | Wachtwoord voor DB_USER. Staat in platte tekst in het bestand, daarom moeten de permissies van wp-config.php strak staan. |
DB_HOST |
string | ja | Database-host. localhost lost op veel systemen op naar een UNIX-socket; 127.0.0.1 forceert TCP. Kan een poort bevatten (db.example.internal:3307) of een socketpad (localhost:/var/run/mysqld/mysqld.sock). |
DB_CHARSET |
string | nee | Character set voor de databaseverbinding. Default: utf8, maar elke moderne installatie gebruikt utf8mb4. |
DB_COLLATE |
string | nee | Collation. Standaard leeg (laat MySQL kiezen). De meeste installaties laten dit leeg. |
$table_prefix |
string | ja | De tabel-prefix, een globale variabele, geen constante. Default wp_. Aanpassen op een bestaande site vraagt om het hernoemen van alle tabellen en het bijwerken van usermeta-keys; dit is geen post-install-configuratieknop. |
Een vuistregel: als WordPress Error establishing a database connection toont, check dan als eerste of DB_HOST klopt met wat je host werkelijk aanbiedt. Veel shared hosts gebruiken een andere hostname dan localhost, en veel managed hosts wijzigen dit tijdens een servermigratie zonder het te melden.
WordPress-URLs
WP_SITEURL en WP_HOME zijn optionele overrides voor de twee URL-waarden die WordPress anders in de wp_options-tabel bewaart als siteurl en home. Ze in wp-config.php zetten heeft drie praktische effecten:
- De URLs staan niet meer in de database, dus een search-replace na een migratie hoeft er niet meer langs.
- De URLs zijn op slot, dus een beheerder kan ze niet per ongeluk wijzigen in Instellingen > Algemeen en zichzelf uitloggen.
- Het lost redirect loops op die kunnen ontstaan als de database een andere URL bevat dan de browser feitelijk gebruikt, bijvoorbeeld na een haastige HTTP-naar-HTTPS-overstap.
define( 'WP_HOME', 'https://jouwsite.nl' );
define( 'WP_SITEURL', 'https://jouwsite.nl' );
WP_HOME is de URL die bezoekers zien (de voorkant van de site). WP_SITEURL is waar de WordPress-core staat. In de meeste installaties zijn ze gelijk. Ze verschillen alleen als je WordPress-core in een eigen submap plaatst terwijl de voorkant op de root blijft.
Gebruik geen trailing slash. WordPress verwacht de URL zonder.
Memory-limieten
WordPress heeft twee memory-limit-constanten, en beide zijn ondergeschikt aan PHP's memory_limit, niet aan iets in WordPress zelf. WordPress kan nooit meer geheugen allocaten dan PHP toestaat; deze constanten verhogen alleen het plafond binnen wat PHP toelaat.
| Constante | Default (single site) | Default (multisite) | Scope |
|---|---|---|---|
WP_MEMORY_LIMIT |
40M |
64M |
Geldt voor front-end- en admin-requests, tenzij per request overschreven. |
WP_MAX_MEMORY_LIMIT |
256M |
256M |
Geldt voor admin-scripts zoals plugin-/theme-updates, mediaverwerking en Site Health. WordPress schaalt het effectieve plafond op naar deze waarde zodra het de admin-context binnenkomt. |
Deze defaults staan in het APIs-handbook genoemd. De normale oorzaak van Allowed memory size exhausted is een specifieke plugin die boven de 40M-front-end-default uitkomt. Dat getal stamt uit de tijd voor 2010 en slaat op moderne servers nergens meer op. Beide constanten verhogen kan gewoon, mits de onderliggende PHP memory_limit het toelaat; het feitelijke plafond is de laagste van de twee.
define( 'WP_MEMORY_LIMIT', '256M' );
define( 'WP_MAX_MEMORY_LIMIT', '512M' );
Staan deze waarden al hoog en crasht de site toch met een memory-fout? Dan zit de bottleneck in PHP zelf. Kijk in php.ini of het PHP-paneel van je host.
Debug-instellingen
Debug is waar de meeste schade wordt aangericht, omdat de default bij WP_DEBUG = true ook meteen fouten toont op de voorkant van de site. De officiële debug-guide is daar expliciet over: "It is not recommended to use WP_DEBUG or the other debug tools on live sites; they are meant for local testing and staging installs."
| Constante | Default | Effect bij true |
|---|---|---|
WP_DEBUG |
false |
Zet PHP error_reporting op E_ALL en laat deprecation-notices zien. Zodra WP_DEBUG op true staat, gaat ook WP_DEBUG_DISPLAY default op true, tenzij je dat expliciet op false zet. |
WP_DEBUG_LOG |
false |
Bij true schrijft WordPress errors naar wp-content/debug.log. Sinds WordPress 5.1 accepteert de constante ook een bestandspad als string, voor een custom locatie. De default-locatie (wp-content/debug.log) is niet in 5.1 veranderd; 5.1 voegde alleen de mogelijkheid toe om een ander pad op te geven. |
WP_DEBUG_DISPLAY |
true (als WP_DEBUG aanstaat) |
Print errors inline in de HTML-response. Deze op false zetten is wat de "loggen maar verbergen"-pattern voor productie mogelijk maakt. |
SCRIPT_DEBUG |
false |
Dwingt WordPress om de niet-geminificeerde versies van core JS en CSS te laden. Handig bij debuggen in de admin-UI. |
SAVEQUERIES |
false |
Bewaart elke database-query van een request in $wpdb->queries voor later onderzoek. Duur: alleen aanzetten voor een specifieke debug-sessie, nooit laten staan. |
WP_DISABLE_FATAL_ERROR_HANDLER |
false |
Zet de Recovery Mode die in WordPress 5.2 is geïntroduceerd uit, zodat fatal errors normaal doorkomen in plaats van het recovery-proces te triggeren. Handig in een dev-omgeving waar je wilt dat WP_DEBUG_DISPLAY gewoon zichtbaar blijft. |
De veilige debug-pattern voor productie is loggen zonder tonen:
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
@ini_set( 'display_errors', '0' );
De display_errors-override hoort erbij, omdat sommige PHP-errortypes door de outputfilters van WordPress heen glippen als PHP's eigen display-toggle nog aanstaat. Zonder die regel lek je alsnog foutmeldingen naar bezoekers.
Nog een beveiligingspunt: wp-content/debug.log is schrijfbaar voor de PHP-user en, bij default, gewoon te bereiken via /wp-content/debug.log door de webserver, dus iedereen die het pad weet of gokt, kan je errors lezen. Als je WP_DEBUG_LOG in productie aanzet, ook al is het even, wijs het bestand dan aan buiten de webroot, of voeg een .htaccess- of nginx-regel toe die de toegang blokkeert. Het Advanced Administration Handbook vlagt dit expliciet als beveiligingsrisico.
Krijg je zodra debug-logging aanstaat een stroom aan set_time_limit()-meldingen? Dan zit je in het gebied van Maximum execution time exceeded, dat vaak pas opvalt als debug-logging aanstaat en een trage plugin begint te klagen.
Security keys en salts
WordPress genereert deze als acht constanten: vier keys (AUTH_KEY, SECURE_AUTH_KEY, LOGGED_IN_KEY, NONCE_KEY) en vier salts (AUTH_SALT, SECURE_AUTH_SALT, LOGGED_IN_SALT, NONCE_SALT). Hun enige taak is input leveren voor wp_salt(), dat de salts produceert waarmee WordPress authentication-cookies en nonces hasht.
Ze versleutelen niets. Ze raken de database niet. Ze worden niet op wachtwoorden in rust toegepast. Dit is het misverstand-stuk om even rustig te lezen: security keys zijn salts voor hashes die session-cookies en CSRF-nonces gebruiken, meer niet.
Genereer ze via https://api.wordpress.org/secret-key/1.1/salt/, dat elk request een verse set teruggeeft. Plak de acht regels in wp-config.php en vervang de bestaande waarden.
Wat gebeurt er als je ze roteert? Alle bestaande cookies worden ongeldig, dus elke ingelogde gebruiker (jij dus ook) wordt onmiddellijk uitgelogd. Elk formulier dat nu net met een nonce bezig is, wordt ook ongeldig. Daarom roteer je keys bewust, meestal als onderdeel van incident response, en niet op een schema. Snicco's "How WordPress Uses Salts and Why You Should Not Rotate Them" onderbouwt uitgebreid waarom schema-rotatie geen beveiligingswinst oplevert, wel operationele kosten.
Filesystem-instellingen
Zodra WordPress zelf bestanden moet schrijven (core-updates, plugin-installs, theme-updates), gebruikt het de WP_Filesystem-API, die een "method" kiest op basis van wat schrijfbaar is. Twee constanten sturen dat gedrag:
| Constante | Default | Toegestane waarden | Omschrijving |
|---|---|---|---|
FS_METHOD |
(auto-detectie) | direct, ssh2, ftpext, ftpsockets |
Forceert de filesystem-method. direct laat WordPress schrijven met gewone PHP fopen, wat alleen werkt als de PHP-user ook de eigenaar van de target-bestanden is. |
FS_CHMOD_DIR |
0755 |
octaal | Permissies voor mappen die WordPress aanmaakt. |
FS_CHMOD_FILE |
0644 |
octaal | Permissies voor bestanden die WordPress aanmaakt. |
De reden om FS_METHOD expliciet te zetten is het "please enter your FTP credentials"-scherm. Als FS_METHOD auto-detecteert en de PHP-user niet eigenaar is van de WordPress-bestanden (een klassieke shared-hosting-misconfiguratie), valt WordPress terug op FTP-credentials vragen bij elke update. De combinatie define( 'FS_METHOD', 'direct' ); samen met het eigenaarschap van wp-content bijzetten naar de PHP-user is wat die prompt permanent wegneemt. Als direct niet werkt omdat het eigenaarschap echt niet aan te passen is, waarschuwt die prompt voor een reëel permissie-probleem en is hem verbergen erger dan hem zien.
Environment flags
Dit zijn de runtime-flags die senior admins zetten om een site vast te zetten of gedrag te scopen voor een specifieke omgeving.
| Constante | Geïntroduceerd | Default | Omschrijving |
|---|---|---|---|
DISABLE_WP_CRON |
pre-2.9 | false |
Stopt WordPress met het triggeren van wp-cron.php aan het eind van elk bezoekersrequest. Bij true moet je wp-cron.php zelf op een echt schema aanroepen (meestal een system cron per minuut). |
DISALLOW_FILE_EDIT |
WordPress 2.9 (niet 4.9) | false |
Verbergt de ingebouwde plugin- en theme-editor in wp-admin. Vergelijkbaar met het afpakken van de capabilities edit_plugins, edit_themes (zie WordPress-gebruikersrollen en -rechten voor de volledige capability-referentie) en edit_files van elke gebruiker. |
DISALLOW_FILE_MODS |
al lang aanwezig | false |
Strakkere variant: verbergt de editor én blokkeert plugin-/theme-installaties en -updates vanuit de admin. Alleen aanzetten op strak beheerde sites waar deploys via versiebeheer lopen. |
WP_CACHE |
pre-2.9 | false |
Bij true laadt WordPress tijdens bootstrap wp-content/advanced-cache.php. De meeste pagecache-plugins zetten dit tijdens activatie automatisch aan. |
WP_ENVIRONMENT_TYPE |
WordPress 5.5 | production |
Toegestane waarden: local, development, staging (zie de WordPress-staging-omgeving gids), production. Wordt teruggegeven door wp_get_environment_type() zodat plugins en themes per omgeving gedrag kunnen splitsen. Bij development gaat WP_DEBUG automatisch aan als het niet al gedefinieerd is. |
WP_DEVELOPMENT_MODE |
WordPress 6.3 | '' (leeg) |
Toegestane waarden: '', core, plugin, theme, all. Scopet development mode naar een subsysteem. Het huidige hoofdeffect is het omzeilen van de theme.json-cache (theme-aanpassingen horen in een WordPress child theme om updates te overleven) bij theme, wat theme-developers nodig hebben om blockstyle-wijzigingen meteen te zien. Niet hetzelfde als WP_ENVIRONMENT_TYPE: environment type zegt wat voor soort site dit is; development mode zegt waar je nu actief aan werkt. |
FORCE_SSL_ADMIN |
al lang aanwezig | false |
Forceert admin-area en login naar HTTPS. De meeste moderne hosts termineren TLS op een reverse proxy; dan moet deze constante gecombineerd worden met het vertrouwen van HTTP_X_FORWARDED_PROTO, anders komt WordPress in een admin-redirect-loop. |
COOKIE_DOMAIN |
al lang aanwezig | leeg (host-only cookie) | Stuurt het Domain-attribuut van de auth-cookies. Expliciet zetten is nodig op multisite-subdomain-netwerken en zelden ook als een reverse proxy de host-header herschrijft. |
AUTOMATIC_UPDATER_DISABLED |
al lang aanwezig | false |
Bij true schakelt WordPress alle automatische achtergrond-updates uit (core, vertalingen, plugins, themes). Alleen zetten als je een echte deploy-pipeline hebt die de functionaliteit vervangt; anders is het een foot-gun. |
De constante die de meeste mensen in de war brengt, is DISALLOW_FILE_EDIT. De default is altijd false geweest (editor staat aan). Op true zetten is een expliciete keuze. WordPress 4.9 heeft hem niet geïntroduceerd en heeft de default niet gewijzigd; wat 4.9 wel toevoegde, is een loopback-gebaseerde fatal-error-sandbox rondom de editor, een heel andere feature. De constante zelf bestaat ongeveer sinds WordPress 2.9.
wp-config.php veilig bewerken
Vier regels die meer sites redden dan welke configuratiewaarde dan ook.
- Maak eerst een backup. Een kapotte wp-config.php legt de hele site plat met een wit scherm, want elk request laadt dit bestand. Kopieer het naar
wp-config.php.bakvoordat je iets aanraakt, of gebruik de "dupliceer"-optie van je filemanager. Terugzetten is één commando; om twee uur 's nachts een syntax error debuggen zonder backup is dat niet. - Zet nieuwe defines boven de "stop editing"-comment. Het meegeleverde bestand eindigt met
/* That's all, stop editing! Happy publishing. */en daarna de include vanwp-settings.php. Alles erboven draait voordat WordPress wordt geladen. Alles eronder draait pas als core al opgestart is, waardoor sommige constanten daar gewoon niet meer werken. - Plak geen snippets met smart quotes. Copy-pasten uit blogs zet rechte quotes (
"en') nogal eens om in typografische quotes ("en'), die PHP als syntax error weigert. Als de site breekt na een paste, is dit meestal de oorzaak. Typ de aanhalingstekens liever zelf over. - Scherpe file-permissies. Omdat wp-config.php het databasewachtwoord in platte tekst bevat, zijn de permissies belangrijk. De hardening-guide adviseert
440of400, in eigendom van de user die PHP draait. Op shared hosts kom je soms niet onder644; dat is een beperking van je hostingomgeving, niet iets wat je in wp-config.php zelf kunt fixen.
Wijzigingen worden meteen actief bij het volgende request. Je hoeft PHP-FPM niet te restarten. Het hardnekkige misverstand "wp-config.php wijzigingen vragen om een PHP-FPM restart" komt uit een ander probleem: OPcache dat verouderde kopieën van PHP-bestanden blijft serveren omdat de server opcache.validate_timestamps=0 heeft staan. Dat is een server-misconfiguratie, geen normaal WordPress-gedrag, en de fix is OPcache fixen, niet PHP restarten voor elke wp-config-wijziging.
Verwante artikelen
Als wp-config.php goed staat, zijn de drie errors waarvoor hij het vaakst de schuld krijgt de moeite waard om in volgorde te lezen, want elke error wijst terug naar een specifieke constante hierboven. Voor de database-variant: begin bij Error establishing a database connection. Voor de memory-variant: Allowed memory size exhausted in WordPress. Voor de PHP-timeout-variant: Maximum execution time exceeded.