Cronjobs worden gebruikt om taken op vaste tijdstippen, datums of met vaste tussenpozen op je WordPress-site in te plannen. Voorbeelden van een WordPress-CRON-taak zijn bijvoorbeeld het inplannen van de publicatie van een bericht, het controleren op updates of het uitvoeren van een backupplugin volgens een vooraf ingesteld schema.

In WordPress wordt dit afgehandeld door WP-Cron, dat wordt gebruikt om een system-cron te simuleren. Maar afhankelijk van de hoeveelheid verkeer op je site kan het gebruik van de ingebouwde cron-handler de laadtijden van je pagina’s gaan beïnvloeden.

Daarom laten we je vandaag zien hoe je WP-Cron (wp-cron.php) kunt uitschakelen en in plaats daarvan een systeem-cron kunt gebruiken voor betere prestaties.

Waarom WP-Cron uitschakelen?

Bij Kinsta hebben we te maken met veel drukbezochte en veeleisende sites. Hierdoor hebben we veel prestatieproblemen gezien met de ingebouwde Cron-handler van WordPress: WP-Cron.

Allereerst is het belangrijk om te begrijpen dat WP-Cron geen echte cronjob is, maar gewoon iets wat WordPress heeft gemaakt om na te bootsen wat een systeem-cron doet.

WP-Cron draait niet continu. Standaard wordt de wp-cron.php bij elke paginalading geactiveerd, wat op drukbezochte sites voor problemen kan zorgen. Als een site niet genoeg PHP-threads heeft, kan het gebeuren dat er een verzoek binnenkomt, WordPress de cron start, maar de cron moet dan wachten op de worker en blijft daardoor simpelweg hangen.

Het omgekeerde scenario geldt ook. Als een site niet veel verkeer heeft, kunnen geplande taken worden gemist omdat er niemand een pagina heeft geladen.

Daarnaast is er ook een veiligheidsreden om WP-Cron uit te schakelen. Omdat wp-cron.php een openbaar toegankelijk bestand is, kan iedereen het activeren door een verzoek te sturen naar https://yourdomain.com/wp-cron.php.

Bij het aanvallen van een site kan dit worden gebruikt om de serverbelasting herhaaldelijk te laten pieken, een simpele maar effectieve manier om een site te vertragen of te destabiliseren. Door WP-Cron uit te schakelen, sluit je die mogelijkheid volledig af.

WP-Cron uitschakelen in WordPress (2 stappen)

Dit is wat je moet doen (in deze volgorde):

  1. Stel eerst een cronjob op serverniveau in om WP-Cron te vervangen
  2. Schakel vervolgens WP-Cron uit in je wp-config.php

Als je WP-Cron eerst uitschakelt zonder een vervanging in te stellen, zullen je geplande taken (het inplannen van berichten, back-ups, controles op plugin-updates, e-mailmeldingen) stilletjes stoppen met draaien. Geen foutmeldingen, alleen gemiste taken.

Stap 1: Stel een cronjob op serverniveau in

Nu je begrijpt waarom WP-Cron een probleem kan zijn, leggen we je hier uit hoe je het kunt vervangen. De systeem-cron draait volgens een vooraf gedefinieerd schema en wordt zelfs aanbevolen in het officiële pluginhandboek.

Kies de methode die past bij je hostingconfiguratie.

Met cPanel

Als je een host met cPanel gebruikt, kun je een systeem-cron aanmaken via hun controlepaneel. Log eerst in op cPanel. Klik in het gedeelte ‘Advanced’ op ‘Cron Jobs’.

cPanel cron jobs
cPanel cronjobs

Onder het gedeelte ‘Add New Cron Job’ kun je kiezen uit een aantal verschillende vooraf gedefinieerde schema’s, zoals twee keer per uur of één keer per week. Je hostingprovider heeft waarschijnlijk een limiet ingesteld voor hoe vaak cronjobs mogen worden uitgevoerd. Twee keer per uur is een veelgebruikte instelling voor gedeelde hosting.

cPanel-instellingen voor cronjobs
cPanel-instellingen voor cronjobs

Voeg de volgende opdracht toe. Vervang https://domain.com door je domeinnaam. Deze opdracht kan enigszins afwijken, afhankelijk van hoe je hosting is geconfigureerd. Klik vervolgens op ‘Add New Cron Job’.

wget -q -O - https://domain.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
cPanel nieuwe cronjob toevoegen
cPanel nieuwe cronjob toevoegen

Het gedeelte >/dev/null 2>&1 in de bovenstaande opdracht schakelt e-mailmeldingen uit.

SSH en Crontab gebruiken

Als je SSH-toegang tot je server hebt, kun je de cron rechtstreeks in de crontab van je server instellen. Dit werkt op elke Linux-server, ongeacht je controlepanel.

Maak verbinding via SSH en voer het volgende uit:

crontab -e

Voeg vervolgens een van de volgende regels toe (kies er één).

Met wget (werkt op elke server):

*/15 * * * * wget -q -O - https://yourdomain.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1

Direct met PHP (iets sneller, geen HTTP-overhead):

*/15 * * * * php /path/to/wordpress/wp-cron.php >/dev/null 2>&1

Vervang yourdomain.com en /path/to/wordpress door je eigen domein en het installatiepad van WordPress. De */15 voert de cron elke 15 minuten uit, een goede standaardinstelling voor de meeste sites.

Met WP-CLI

Als je WP-CLI gebruikt, is dit vaak de meest overzichtelijke methode. Het ingebouwde cron-commando van WP-CLI voert alleen de taken uit die daadwerkelijk aan de beurt zijn, wat efficiënter is dan wp-cron.php rechtstreeks aan te roepen. Voeg dit toe aan je crontab via crontab -e:

*/15 * * * * cd /path/to/wordpress && wp cron event run --due-now --allow-root >/dev/null 2>&1

Je kunt WP-CLI ook gebruiken om je geplande taken op elk moment te bekijken zonder ze uit te voeren:

wp cron event list

Dit is handig bij het oplossen van problemen. Je ziet alle openstaande cron-gebeurtenissen, wanneer ze gepland staan en aan welke hook ze gekoppeld zijn.

Een tool van een derde partij gebruiken

Als je het lastig vindt om cronjobs op je server in te stellen of als je hostingprovider geen toegang biedt, kun je ook een oplossing van een derde partij gebruiken, zoals EasyCron.

Belangrijk: WordPress Multisite netwerken

Op een Multisite netwerk werkt het iets anders.

WP-Cron moet voor elke subsite afzonderlijk worden uitgevoerd, niet alleen voor de hoofdsite. Als je één server-cron instelt die verwijst naar wp-cron.php op het hoofddomein, worden cronjobs voor subsites op andere domeinen of subpaden mogelijk niet betrouwbaar uitgevoerd.

De meest elegante oplossing is om WP-CLI te gebruiken, dat van zichzelf met Multisite omgaat:

*/15 * * * * cd /path/to/wordpress && wp cron event run --due-now --url=https://yourdomain.com --allow-root >/dev/null 2>&1

Voor netwerken met veel subsites kun je ze allemaal doorlopen met:

*/15 * * * * cd /path/to/wordpress && wp site list --field=url | xargs -I % wp cron event run --due-now --url=% --allow-root >/dev/null 2>&1

De constante DISABLE_WP_CRON in wp-config.php werkt op dezelfde manier bij Multisite: voeg hem één keer toe en hij geldt voor het hele netwerk.

Stap 2: Schakel WP-Cron uit in wp-config.php

Om WP-Cron uit te schakelen, voeg je het volgende toe aan je wp-config.php-bestand, vlak voor de regel die zegt: “Dat is alles, stop met bewerken! Veel plezier.”

define('DISABLE_WP_CRON', true);
WP-Cron uitschakelen
WP-Cron uitschakelen

Sla het bestand op en dat is alles. WP-Cron wordt niet meer geactiveerd bij het laden van een pagina.

Deze constante zorgt ervoor dat WP-Cron niet meer wordt uitgevoerd bij het laden van een pagina. Het voorkomt niet dat wp-cron.php rechtstreeks wordt aangeroepen. De cronjob op je server die je in stap 1 hebt ingesteld, kan het nog steeds zoals verwacht activeren.

Hoe je kunt controleren of alles werkt

Nadat je beide stappen hebt doorlopen, is het de moeite waard om te controleren of WP-Cron daadwerkelijk is uitgeschakeld en of de cronjob op je server correct wordt geactiveerd.

Optie 1: Gebruik de WP Crontrol-plugin

Installeer en activeer de gratis WP Crontrol plugin. Ga in je WordPress-dashboard naar Tools → Cron Events. Je ziet dan een lijst met alle geplande gebeurtenissen. Als WP-Cron goed is uitgeschakeld, zou je niet langer moeten zien dat er bij elke paginalading gebeurtenissen worden geactiveerd, maar alleen op de intervallen waarop de cronjob van je server wordt uitgevoerd.

Optie 2: Controleer via WP-CLI

Voer deze opdracht uit vanaf je server:

wp cron event list

Hiermee worden alle openstaande cron-gebeurtenissen weergegeven, samen met het tijdstip van de volgende geplande uitvoering. Als de lijst er normaal uitziet en de gebeurtenissen tussen de uitvoeringen door verdwijnen, werkt je configuratie.

Optie 3: Controleer je serverlogs

Als je een crontab-item hebt ingesteld, kun je de uitvoer ervan tijdelijk omleiden naar een logbestand om te controleren of het wordt geactiveerd:

*/15 * * * * wget -q -O - https://yourdomain.com/wp-cron.php?doing_wp_cron >> /tmp/wpcron.log 2>&1

Kijk na 15 minuten op /tmp/wpcron.log om te controleren of de taak is uitgevoerd. Zodra je dit hebt gecontroleerd, verwijder je de logomleiding.

Samenvatting

WP-Cron uitschakelen en vervangen door een echte cronjob op serverniveau is een simpele aanpassing die de betrouwbaarheid verbetert, de overhead vermindert en een onnodig openbaar endpoint verwijdert.

Of je kunt het grootste deel van de installatie helemaal overslaan door een host te kiezen die dit voor je regelt. Aanbieders van managed hosting zoals Kinsta draaien standaard elke 15 minuten een cronjob op de server, dus je hoeft alleen WP-Cron uit te schakelen en het platform de rest te laten regelen.

Brian Jackson

Brian heeft een enorme passie voor WordPress, gebruikt het al meer dan tien jaar en heeft zelfs al aantal premium plugins ontwikkeld. Brian houdt van bloggen, films en hikes. Kom in contact met Brian op Twitter.