WP-Cron (wp-cron.php): uitschakelen en een systeemcron instellen | Prestatieoptimalisatie voor WordPress

In WordPress zijn cronjobs een functie die taken die voor een bepaald tijdstip of een bepaalde datum zijn gepland automatisch uitvoert. Ze lopen via het bestand wp-cron.php, en WordPress roept dit bestand bij elke paginalading aan om geplande taken te verwerken. Deze aanpak is eenvoudig, maar kan op drukbezochte sites de prestaties schaden.
Ⅰ. Hoe WP-Cron draait en de prestatieproblemen ervan
In plaats van het traditionele cronsysteem van Linux-servers biedt WordPress een eigen cronfunctie, WP-Cron. WP-Cron werkt via het bestand wp-cron.php: ⓐ telkens als een gebruiker de site bezoekt, controleert het of er geplande taken zijn en voert ze uit, en ⓑ plugins zoals Rank Math en WP Rocket voeren hun eigen geplande periodieke taken uit.
Op drukbezochte sites kan wp-cron.php daarentegen veel te vaak worden aangeroepen, waardoor de server overbelast raakt. Vooral als veel gebruikers tegelijk verbinding maken, lopen dubbele cronjobs, wat kan leiden tot hoger CPU-gebruik, tragere reacties, trager ladende pagina's en vergelijkbare problemen.
Deze structurele beperkingen van WP-Cron kunnen de prestaties van WordPress verlagen, en vooral bij sites die hoge prestaties nodig hebben, webwinkels en nieuwsportalen kunnen ze ernstige knelpunten veroorzaken.
🔄 Hoe WP-Cron werkt en is opgebouwd
Ⅱ. Prestatieoptimalisatie voor WordPress
Er zijn veel manieren om de prestaties van WordPress te optimaliseren. Na het optimaliseren van caching, de frontend en de database kun je via de instellingen van WP-Cron nog verder verbeteren.
Bij elke paginalading van WordPress worden geplande events gecontroleerd, en door de periodieke taken van plugins moet de inefficiënte WP-Cron efficiënter worden gebruikt.
1️⃣ WP-Cron testen
Als je de cronjobs met WP-CLI controleert, zie je de actieve cronevents draaien. Je ziet plugins zoals Rank Math en WP Rocket dagelijks of om de paar minuten geplande taken uitvoeren.

2️⃣ WP-Cron instellen
WP-Cron is een virtuele planner die de geplande taken van WordPress afhandelt; wp-cron.php wordt uitgevoerd als gebruikers de site bezoeken. Maar uitvoering op basis van verkeer is onbetrouwbaar en overmatige aanroepen kunnen de server belasten, dus meestal wordt het aangevuld met een systeemcron.
Indien nodig is de aanbevolen aanpak om DISABLE_WP_CRON in wp-config.php in te stellen, WP-Cron uit te zetten en het regelmatig te laten draaien met een Linux-cron.
|
Onderdeel |
WP-Cron uitschakelen + alleen de systeemcron laten draaien |
|---|---|
|
Instellingen |
WP-Cron uitzetten en wp-cron.php vanuit de systeemcron uitvoeren |
|
Voordelen |
Geen dubbele uitvoeringen, nauwkeurige uitvoering op tijd en weinig serverbelasting |
|
Nadelen |
Sommige pluginfuncties kunnen stoppen, en een instelfout kan taken laten overslaan |
|
Aanbevolen · Situatie |
Geschikt voor sites met veel verkeer en veel geplande taken |
Methode ① heeft wel een nadeel: het schakelt de preload-functie uit van cacheplugins zoals WP Rocket, die elke minuut de cache vooraf opbouwt voordat bezoekers komen.
⚙️ Het bestand wp-config.php bewerken
Je kunt het instellen door WP_CRON uit te schakelen.
# WP_CRON uitschakelen
define( 'DISABLE_WP_CRON', true );Terwijl WP-Cron draait, werkt WP_CRON_LOCK_TIMEOUT als een [tijdgebonden slot] dat andere pogingen om het te starten tegenhoudt.
# 5 minuten = 300, elke 60 minuten = 3600
define('WP_CRON_LOCK_TIMEOUT', 300);Daarom raad ik aan om WP-Cron niet alleen uit te schakelen in het bestand wp-config.php, maar daarna ook een System Cron -taak toe te voegen, en de server die ik nu beheer is ook zo ingesteld.
⚙️ Een systeemcron inschakelen op een Linux-server [basis]
Je kunt het per domein inschakelen.
# Elke 5 minuten uitvoeren
*/5 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
# Elke 30 minuten uitvoeren
*/30 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
# Elk uur uitvoeren
0 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
# Eén keer per dag uitvoeren
0 3 * * * curl -s https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1De vier regels hierboven zijn voorbeelden per interval die je aan crontab toevoegt; op elk ingesteld tijdstip roept curl de URL [wp-cron.php] aan, dus geplande taken lopen ook als er geen bezoekers zijn.
# Als de server een lokale server is
*/5 * * * * php /path/to/wordpress/wp-cron.php > /dev/null 2>&1
# Elke 30 minuten uitvoeren
*/30 * * * * php /path/to/wordpress/wp-cron.php > /dev/null 2>&1
# Elk uur uitvoeren
0 * * * * php /path/to/wordpress/wp-cron.php > /dev/null 2>&1
# Eén keer per dag uitvoeren
0 3 * * * php /path/to/wordpress/wp-cron.php > /dev/null 2>&1Als WP-CLI is geïnstalleerd, kun je één regel instellen voor het interval dat je wilt. ▼
# Elke 5 minuten uitvoeren
*/5 * * * * cd /sites/example.com/files/ && flock -n ~/.wp_cron.lock /usr/local/bin/wp cron event run --due-now --quiet
# Elke 30 minuten uitvoeren
*/30 * * * * cd /sites/example.com/files/ && flock -n ~/.wp_cron.lock /usr/local/bin/wp cron event run --due-now --quiet
# Elk uur uitvoeren
0 * * * * cd /sites/example.com/files/ && flock -n ~/.wp_cron.lock /usr/local/bin/wp cron event run --due-now --quiet
# Eén keer per dag uitvoeren
0 3 * * * cd /sites/example.com/files/ && flock -n ~/.wp_cron.lock /usr/local/bin/wp cron event run --due-now --quietMet deze instelling voert WP-CLI binnen de server alleen de geplande taken uit die aan de beurt zijn, met de optie [--due-now], en [flock -n] slaat een nieuwe run over als de vorige nog niet klaar is.
⚙️ WP-CLI en een systeemcron van 1 minuut, plus dubbele cronjobs voorkomen
Standaard negeert (slaat over) WP_CRON taken als er veel werk is en voert ze later opnieuw uit. Zet de standaard WP-Cron uit en laat geplande taken een slot van 5 minuten aanhouden, zodat de systeemcron en WP-Cron niet tegelijk draaien.
define('DISABLE_WP_CRON', true); // zet de automatische uitvoering van WP-Cron uit
define('WP_CRON_LOCK_TIMEOUT', 300); // niet wachten → overgeslagen; houdt een slot van 5 minuten aan terwijl een geplande taak draait
/* That's all, stop editing! Happy publishing. */Voeg de optie flock -n toe aan de systeemcron, zodat een run die het slot aantreft aan de kant van de systeemcron meteen stopt.
# wp cron-instelling: flock -n → niet wachten → meteen stoppen
*/1 * * * * cd /sites/example.com/files/ && flock -n ~/.wp_cron.lock /usr/local/bin/wp cron event run --due-now --quietHet resultaat van deze combinatie van instellingen is:
- De interne automatische uitvoering van WordPress staat uit → geplande taken lopen, ongeacht het aantal bezoekers
- De systeemcron probeert elke minuut te draaien → geplande taken lopen als die er zijn
- Eenmaal vergrendeld draait er 5 minuten niets opnieuw → voorkomt dubbele uitvoeringen (in de praktijk is WP_CRON_LOCK_TIMEOUT met de instelling flock -n eigenlijk niet nodig.)
Met de preventie van dubbele uitvoering is het werkelijke verloop:
- 08:00 → de systeemcron roept wp-cron.php aan
- Geplande taak A draait → slot van 5 minuten gezet
- 08:01 → de systeemcron roept opnieuw aan
- Taak A is vergrendeld → draait niet
- 08:02–08:04 → hetzelfde
- 08:05 → slot vrij → de volgende geplande taak draait als die er is
In plaats van dat WordPress taken automatisch uitvoert, neemt het systeem de uitvoering op zich. En WP_CRON_LOCK_TIMEOUT werkt als extra beveiliging tegen dubbele uitvoeringen.
|
Onderdeel |
WP_CRON_LOCK_TIMEOUT |
flock -n |
|---|---|---|
|
Type slot |
Binnen WordPress |
Systeemniveau |
|
Locatie van het slot |
Op basis van de database: doing_cron in wp_options |
Op basis van een systeembestand: ~/.wp_cron.lock |
|
Wacht het? |
❌ Wacht niet → overslaan |
❌ Wacht niet → stopt meteen |
|
Preventie van dubbele uitvoering |
✅ Voorkomt dubbele uitvoeringen |
✅ Voorkomt dubbele uitvoeringen |
Als je klaar bent, kun je met een WP-CLI-commando controleren of cron nog net zo werkt als voorheen.
wp cron event list+-------------------------------------------+---------------------+-----------------------+---------------+
| hook | next_run_gmt | next_run_relative | recurrence |
+-------------------------------------------+---------------------+-----------------------+---------------+
| rocket_saas_pending_jobs | 2026-10-17 12:00:57 | now | 1 minute |
| action_scheduler_run_queue | 2026-10-17 12:00:57 | now | 1 minute |
| action_scheduler_run_queue_rucss | 2026-10-17 12:00:58 | now | 1 minute |
| rocket_saas_on_submit_jobs | 2026-10-17 12:00:58 | now | 1 minute |
| rocket_preload_process_pending | 2026-10-17 12:00:59 | now | 1 minute |
| rocket_purge_time_event | 2026-10-17 12:16:59 | 15 minutes 8 seconds | 1 hour |
| wp_privacy_delete_old_export_files | 2026-10-17 12:28:46 | 26 minutes 55 seconds | 1 hour |
| wp_update_user_counts | 2026-10-17 20:15:52 | 8 hours 14 minutes | 12 hours |
| rocket_preload_revert_old_failed_rows | 2026-10-17 20:17:59 | 8 hours 16 minutes | 12 hours |
| wp_version_check | 2026-10-17 20:28:34 | 8 hours 26 minutes | 12 hours |
| wp_update_plugins | 2026-10-17 20:58:34 | 8 hours 56 minutes | 12 hours |
| wp_update_themes | 2026-10-17 21:28:34 | 9 hours 26 minutes | 12 hours |
| recovery_mode_clean_expired_keys | 2026-10-18 07:28:46 | 19 hours 26 minutes | 1 day |
| wp_privacy_personal_data_cleanup_requests | 2026-10-18 07:28:46 | 19 hours 26 minutes | 1 day |
| wp_scheduled_delete | 2026-10-18 08:15:52 | 20 hours 14 minutes | 1 day |
| delete_expired_transients | 2026-10-18 08:15:52 | 20 hours 14 minutes | 1 day |
| wp_scheduled_auto_draft_delete | 2026-10-18 08:15:54 | 20 hours 14 minutes | 1 day |
| wp_delete_temp_updater_backups | 2026-10-18 08:16:17 | 20 hours 14 minutes | 1 week |
| rocket_update_dynamic_lists | 2026-10-18 08:16:57 | 20 hours 15 minutes | 1 week |
| rocket_saas_clean_rows_time_event | 2026-10-18 08:16:57 | 20 hours 15 minutes | 1 week |
| rocket_performance_hints_cleanup | 2026-10-18 08:16:58 | 20 hours 15 minutes | 1 day |
| rocket_preload_clean_rows_time_event | 2026-10-18 08:26:57 | 20 hours 25 minutes | 1 week |
| rocket_database_optimization_time_event | 2026-10-18 09:34:25 | 21 hours 32 minutes | 1 day |
| wp_site_health_scheduled_check | 2026-10-19 07:28:46 | 1 day 19 hours | 1 week |
| rocket_remove_saas_failed_jobs | 2026-10-19 08:16:58 | 1 day 20 hours | 3 days |
+-------------------------------------------+---------------------+-----------------------+---------------+De uitvoer toont de geregistreerde hooknamen, het volgende tijdstip van uitvoering en de herhaling, en taken waarvan de kolom [next_run_relative] [now] zegt, worden bij de volgende cronrun meteen verwerkt.
Ⅲ. Als geplande taken van WP-Cron niet draaien
Je zou kunnen denken dat een taak vanzelf draait als het geplande tijdstip komt, maar WP-Cron controleert op werk als er een paginaverzoek binnenkomt, niet op een vast tijdstip. Een taak gepland voor 14.00 uur draait bij het eerste verzoek om 17.00 uur als er eerder geen verzoeken zijn.
Als runs achterlopen, staan geplande berichten in de berichtenlijst als [Gemiste planning]. Onder [Aanbevolen verbeteringen] op het tabblad Status van [Extra › Sitestatus] verschijnt [Een gepland event is mislukt]. Taken die plugins registreren, zoals het voorladen van de cache, wachten om dezelfde reden.
Geplande taken draaien in [wp-cron.php] na een paginaverzoek, een controle op werk en een loopback-verzoek; als een van deze schakels breekt, draaien ze niet, ook niet als hun tijd voorbij is.
1️⃣ Als er geen bezoeken zijn of de paginacache antwoordt
WP-Cron controleert alleen op werk bij verzoeken die WordPress laten draaien, dus in uren zonder bezoeken stapelen taken die over tijd zijn zich gewoon op. Ook met bezoeken is het resultaat hetzelfde als een paginacachebestand antwoordt, omdat WordPress dan niet draait.
Op een WordPress-installatie met de paginacache van WP Rocket aan werd bij het openen van de gecachete homepage geen aanroep van [wp-cron.php] gelogd. Bij het openen van een niet-gecachete URL werd in dezelfde seconde een aanroep gelogd, en de vijf achterstallige taken draaiden.
Je kunt de achterstallige taken controleren door de WP-CLI-lijst te filteren op de regels waar [next_run_relative] [now] is.
wp cron event list --next_run_relative=now --fields=hook,next_run_gmt,next_run_relative+----------------------------------+---------------------+-------------------+
| hook | next_run_gmt | next_run_relative |
+----------------------------------+---------------------+-------------------+
| rocket_saas_pending_jobs | 2026-10-17 14:49:57 | now |
| action_scheduler_run_queue | 2026-10-17 14:49:57 | now |
| action_scheduler_run_queue_rucss | 2026-10-17 14:49:58 | now |
| rocket_saas_on_submit_jobs | 2026-10-17 14:49:58 | now |
| rocket_preload_process_pending | 2026-10-17 14:49:59 | now |
+----------------------------------+---------------------+-------------------+[now] betekent dat het geplande tijdstip al voorbij is. Ook dit lijstcommando laadt WordPress, dus als er achterstallige taken zijn, roept het [wp-cron.php] aan zodra het klaar is. Voer je hetzelfde commando meteen opnieuw uit, dan zijn de taken die je net zag uit de lijst verdwenen.
Wil je de achterstallige taken wegwerken voordat je de oorzaak oplost, voer dan met WP-CLI meteen alleen de taken uit die over tijd zijn.
wp cron event run --due-nowExecuted the cron event 'rocket_saas_pending_jobs' in 0.005s.
Executed the cron event 'action_scheduler_run_queue' in 0.006s.
Executed the cron event 'action_scheduler_run_queue_rucss' in 0.006s.
Executed the cron event 'rocket_saas_on_submit_jobs' in 0.005s.
Executed the cron event 'rocket_preload_process_pending' in 0.007s.
Success: Executed a total of 5 cron events.Dit commando voert de taken binnen de server uit zonder HTTP-verzoek; om ze met vaste tussenpozen te verwerken, ongeacht bezoeken, registreer je hetzelfde commando in de systeemcron.
2️⃣ Als alleen DISABLE_WP_CRON aan staat en er geen systeemcron is
Met [DISABLE_WP_CRON] op true controleert WP-Cron niet op werk, ook niet als er paginaverzoeken binnenkomen. Ook de officiële documentatie zegt eerst te registreren bij de taakplanner van het systeem en dan deze constante toe te voegen; alleen de constante toevoegen, zonder registratie, laat niets over dat de geplande taken uitvoert.
Met de constante actief bleef een bericht dat iets meer dan een minuut vooruit was gepland op [Gepland] staan nadat de tijd voorbij was, en de datumkolom van de berichtenlijst toonde [Gemiste planning]. In de tussentijd werd geen enkele aanroep van [wp-cron.php] gelogd.
Of de constante aan staat, controleer je met [wp cron test].
wp cron testError: The DISABLE_WP_CRON constant is set to true. WP-Cron spawning is disabled.Krijg je deze fout, controleer dan of de systeemcron een regel heeft die [wp-cron.php] aanroept of [wp cron event run] uitvoert. Als de crontab van het siteaccount leeg is, zie je het volgende.
crontab -lno crontab for exampleIs er geen zo'n regel, registreer dan een systeemcron; als je omgeving dat niet toestaat, verwijder dan de regel [DISABLE_WP_CRON] en gebruik WP-Cron weer.
3️⃣ Als het loopback-verzoek van de server geblokkeerd is
Als er werk is, laat WP-Cron de server een verzoek sturen naar [wp-cron.php] op zijn eigen siteadres om de taken uit te voeren; dat is het loopback-verzoek. Als een beveiligingsregel [wp-cron.php] blokkeert, komt het loopback-verzoek terug met een 403 en draaien de taken niet.
Op een server met een Nginx- en Apache-opstelling blokkeerde het beperken van [wp-cron.php] tot alleen 127.0.0.1 het loopback-verzoek met een 403. Dat komt doordat het verzoek dat de server naar zijn eigen domein stuurt via het publieke IP binnenkomt, en [wp cron test] geeft dezelfde statuscode terug.
wp cron testError: WP-Cron spawn returned HTTP status code: 403 ForbiddenMet de taken meer dan vijf minuten achter toonde het scherm [Sitestatus] onder [Aanbevolen verbeteringen] tegelijk een loopback-waarschuwing en een mislukt gepland event.

Toen de regel was verwijderd, slaagde [wp cron test] weer. Moet je de regel houden, voer de taken dan uit met WP-CLI vanuit de systeemcron. Een WP-CLI-run gaat niet via een HTTP-verzoek, dus de achterstallige taken werden ook met dezelfde regel verwerkt.
🔢 FAQ & aanbevolen content





ℹ️ Affiliatemelding
De content van deze site bevat affiliatelinks. Koopt een bezoeker via een van deze links een product of dienst, dan ontvangt deze site een commissie van de verkoper. Het bedrag dat de koper betaalt (bij acties gaat het omlaag ↓) wordt daardoor niet hoger. De vermelde prijzen, kortingen en voorraad gelden op het moment van schrijven en kunnen afwijken; controleer ze daarom vóór je aankoop bij de verkoper. Producten worden gekozen en beoordeeld volgens onze eigen criteria, en commissies hebben geen invloed op de volgorde of de inhoud van de beoordelingen.