En waarom zou ik willen weten, wat wp-cron is?
Dit artikel is een intensieve herbewerking van een blogartikel wat ik oorspronkelijk 9 mei 2012 heb geschreven. Omdat er inmiddels veel is veranderd, heb ik delen verwijderd en andere delen toegevoegd. Veel plezier ermee!
Vandaag gaan we het over een onderdeel van WordPress hebben, wat heel belangrijk is… maar waar je in de meeste gevallen niets over hoeft te weten. ‘Leuk’, zul je zeggen, ‘maar als ik er niets van hoef te weten, waarom val je mij er dan meer lastig? Dat is vrij eenvoudig: Er zijn situaties, waarin je ineens wel iets van wp-cron hoort te weten.
Maar laten we beginnen eens uit te leggen wat WP-Cron eigenlijk is. Wanneer we het woord goed bekijken, zien we daar natuurlijk ‘Cron’, ‘Chron’… ‘Chronos’, de Griekse godheid van de tijd in terug. En dat is precies wat WP-Cron doet: Het zorgt, dat dingen op tijd gebeuren.
Zichtbare en onzichtbare taken
Wanneer je een plugin installeert, dan is er meestal een aantal dingen, wat die plugin duidelijk voor de buitenwereld doet. Heb ik een plugin voor ‘Social Share’ knoppen, dan zie ik social share knoppen. Installeer ik een webwinkel als WooCommerce of een eLearning systeem als WP-Courseware, dan worden er enkele honderden nieuwe functies toegevoegd aan mijn website.
Naast al die zichtbare functies voegen meer complexe plugins ook een aantal ‘onzichtbare’ functies toe aan je systeem. Functies waardoor het systeem ongestoord kan blijven werken, of waardoor jouw klanten op de hoogte gehouden blijven.
Neem bijvoorbeeld WP Courseware. Een prachtige online leeromgeving met heel veel verschillende functies. Zo kan je bijvoorbeeld lessen via ‘drip feed’ beschikbaar maken. Iedere x aantal dagen krijgt de cursist een nieuwe les.
Prachtig natuurlijk, maar dat moet die cursist dan wel weten. Ook geen probleem. WP Courseware stuurt vanzelf een email wanneer die nieuwe les klaarstaat. Tenminste… dat mogen we hopen!
WordPress doet niets, als jij niets doet!
Een prachtig systeem, maar hier kleeft wel een heel groot nadeel aan: Omdat WordPress een web-applicatie is, wordt WordPress alleen actief, op het moment dat er een webpagina wordt opgevraagd. Zodra jij een pagina opvraagt -zoals zojuist- kijkt WP-Cron of er nog iets te doen is en als er iets te doen is, voert hij die taak uit net voordat hij de hele pagina aan jou getoond heeft. Jij merkt er dus weinig van. Je hebt je hele webpagina, je ziet alleen dat je webbrowser nog aan het ‘laden’ is, terwijl jij je misschien afvraagt, wat er in vredesnaam nog te laden valt. Jij hebt je pagina toch al? Maar als WP-Cron zijn werk doet, net nadat jij een pagina hebt geladen, wat gebeurt er dan, indien er geen pagina wordt geladen. Je raadt het al: NIETS!
Kijken we naar ons WP Courseware voorbeeld: Als nog maar weinig mensen jouw site bezoeken, dan kan het dagen duren voor jouw cursisten een mailtje krijgen, dat er -inmiddels mogelijk al meer dan een week- een nieuwe les voor hen klaar staat. WordPress kan namelijk niets doen, zonder bezoek!
Wanneer je net een nieuwe website hebt, zal er nog niet veel bezoek zijn. Zaken die van WP-Cron afhankelijk zijn zullen dus niet uitgevoerd worden. Of om het simpel te stellen: Bij een online leeromgeving, komt je eerste cursist mogelijk pas terug als hij een mail krijgt, dat er een les klaarstaat. Maar die mail krijgt hij pas als hij naar de site toegaat. Een vicieuze cirkel. Hoe lossen we dit op?
Natuurlijk. Je kunt zelf ieder uur je pagina’s opvragen. Dan komt WordPress toch ook in actie. Maar we kunnen dit natuurlijk ook automatiseren.
Cron
De meeste webhosts draaien onder Linux en Linux kent een proces wat -heel verrassend- ‘cron’ heet. Echter, in tegenstelling tot WP-Cron, is cron wel constant actief. Iedere minuut kijkt cron of er nog iets moet gebeuren. En we kunnen natuurlijk heel goed tegen dit ‘cron’ proces vertellen, dat we willen, dat iedere x minuten WP-Cron moet worden geactiveerd. Hoe je dat precies kunt doen, kun je het best navragen aan je hosting provider, omdat iedere hosting provider zijn eigen beheers-interface heeft, maar ik kan je wel laten zien, hoe je het doet met de twee meest populaire beheersinterfaces: CPanel en Plesk.
We kunnen ook gebruik maken van een externe dienst. In het laatste configuratievoorbeeld laat ik zien, hoe simpel het is om WP Cron op te zetten met de online dienst cron-job.org
WP-Cron en CPanel
Let op : CPanel kan ’themes’ hebben die per hosting partij kunnen verschillen. De iconen kunnen er per thema en versie anders uitzien.
In CPanel kom je bij de cron instellingen door op je CPanel hoofdpagina onder ‘Geavanceerd’ op ‘Cron Jobs’ te klikken:
Daarna krijg je het volgende scherm. Mocht je overigens de ‘Cronjobs’ keuze niet hebben, heeft jouw hoster toegang tot cron voor jou afgeschermd.
In CPanel is het eigenlijk heel makkelijk… door voor ‘Algemene instellingen’ de periode te kiezen die je wilt, geef je aan, wanneer iets moet lopen. ‘Elke vijf minuten’ of ‘Elk uur’ zijn eigenlijk de twee meest gewenste opties. Sommige hosters zijn niet echt blij, als je een cronjob iedere vijf minuten laat lopen, dus informeer altijd wel even, hoe jouw hoster hier tegenover staat.
In de opdrachtregel vullen we het volgende in :
wget http://mijndomeinnaam.com/wp-cron.php >/dev/null 2>&1
Natuurlijk vervang je ‘mijndomeinnaam.com’ door je eigen domeinnaam. Als je WordPress in een sub-folder hebt geinstalleerd, geef je bijvoorbeeld in :
wget http://mijndomeinnaam.com/wordpress/wp-cron.php > dev/null 2>&1
En tenslotte klik je op ‘Nieuwe cronjob toevoegen’.
WP-Cron en Plesk
Let op : Plesk kan themes hebben, waardoor iconen en omschrijvingen per hosting partij of versie kunnen verschillen.
In Plesk werkt het iets complexer. Wanneer je meerdere domeinen hebt, moet je in Plesk eerst het domein selecteren, waarvoor je deze actie uit wilt voeren. Daarna krijg je het volgende op je scherm (fragment):
En hier klik je op Scheduled Tasks. Daarna krijg je de accountnaam of -namen te zien, die aan dit domein gekoppeld zijn. Waarschijnlijk is dit er maar een, dus hier klik je op. Dan krijg je het invulscherm. Hieronder vind je de voorbeelden voor de instellingen per 5 minuten en per uur :
En voor hetgeen je in moet vullen op de ‘command’ regel onder in het scherm geld voor beide schermen :
wget http://mijndomeinnaam.com/wp-cron.php >/dev/null 2>&1
Natuurlijk vervang je ‘mijndomeinnaam.com’ door je eigen domeinnaam. Als je WordPress in een sub-folder hebt geinstalleerd, geef je bijvoorbeeld in :
wget http://mijndomeinnaam.com/wordpress/wp-cron.php >/dev/null 2>&1
Daarna sla je natuurlijk alles nog even op.
Cron-job.org
Bij cron-job.org is het denk ik nog wel het meest eenvoudig om je eigen cron job aan te maken. Ten eerste omdat je geen ‘wget’ en allerlei andere ingewikkelde dingen in hoeft te geven.
Wat je eerst doet is het aanmaken van je account. Na bevestiging per email kan je cron jobs toevoegen. En die geef je in als een simpele URL. Dus iets als https://mijndomeinnaam.com/wp-cron.php. Daar hoeft verder niets meer achter of niets meer voor. Vervolgens geef je in hoe vaak dit commando uitgevoerd moet worden.
Het mooie van cron-job.org is dat je bovendien rapporten hebt, wanneer en hoe je cron jobs zijn uitgevoerd. Dat heb je in de andere gevallen namelijk niet.
De reden dat ik ook ‘overstapte’ naar deze site, was omdat ik bij één van mijn drukbezochte webshops het vermoeden had, dat de cron van mijn hoster niet altijd even goed liep. Dat vermoeden bleek onjuist te zijn (er was een ander probleem), maar het maakte mij wel duidelijk, dat ik geen enkel instrument had om te controleren of het allemaal wel goed ging. Door de cron-job uit te besteden aan cron-job.org wist ik in ieder geval, dat de WP Cron werd aangeroepen en kon ik zo één voor één de oorzaken elimineren.
Niet alleen voor stille sites
Nu heb ik in het begin van dit artikel aangegeven, dat het aanroepen van WP Cron via een ‘cron job’ eigenlijk noodzaak is, wanneer jouw website nog maar weinig bezoekers trekt. Maar het kan ook een gigantische performance verbetering zijn, wanneer jouw website juist veel bezoekers trekt.
Stel je voor. Ik heb een drukke webwinkel waar ik veel in verkoop. Op de achtergrond draaien allerlei intelligente processen, die klanten op basis van hun eerdere aankopen email versturen, mijn ‘abandoned cart’ problemen afhandelen en nog heel wat andere dingen op de achtergrond doen die mijn succesvolle webshop juist tot een succesvolle webshop hebben gemaakt.
Dat kost tijd. En dat vertraagt een webwinkel. Wat een goed alternatief is, is WP cron uitzetten als ‘standaard’ taak op je site en dit voortaan door een cron-job laten uitvoeren.
Het voordeel is hier, dat iedere keer dat een bezoeker op je site komt, hij geen ‘kleintje cron’ mee krijgt in de tijd, dat de sitepagina gebouwd wordt, maar dit allemaal keurig op de achtergrond gebeurt.
Hoe je die cron-job configureert heb je hierboven al gelezen. Maar hoe zet je WP Cron als ‘website taak’. Dat is in principe heel eenvoudig, maar je moet hiervoor wel naar de ‘wp-config.php’ file gaan. Dit is een bestand wat op de server van je website staat. Mocht je wat minder thuis zijn met dit soort zaken, kan je het best aan een derde partij vragen of ze deze aanpassing voor je willen doen.
Wanneer je ‘wp-config.php’ opent voeg je hieraan de onderstaande regel toe.
define('DISABLE_WP_CRON', true);
De exacte positie is minder belangrijk, zolang het maar voor de regel is met de volgende inhoud:
/* That's all, stop editing! Happy blogging. */
Wanneer je nu het bestand weer opslaat, zal voortaan ‘WP Cron’ niet meer vanuit de website worden opgestart.
Hoe weten we dat WP-cron nog loopt?
Als we WP Cron uitschakelen op bovenstaande manier en vervolgens via de ‘cron’ van ons hostingpakket de taak uit laten voeren, dan hebben we echter één probleem. Hoe weten we, dat WP Cron ook daadwerkelijk wordt uitgevoerd.
De makkelijkste manier is door een WP Cron beheersplugin te installeren. Er is een tweetal plugins wat hier bijzonder goed geschikt voor is, namelijk WP Crontrol en Advanced Cron Manager. Beide plugins zijn goed en qua functionaliteiten lijken ze heel sterk op elkaar.
Hoewel er van beide plugins ook een premium versie is, die talloze debug mogelijkheden biedt, wil ik daar niet verder op in gaan. Het belangrijkst is, dat beide plugins laten zien welke jobs er ‘in de queue’ staan en op welke tijd deze hierin geplaatst zijn.
Nu wordt niet bij iedere call naar het wp-cron.php script gelijk de hele queue leeg gemaakt. Per slot van rekening is het uitgangspunt dat in die tijd ook nog een pagina geladen moet kunnen worden. Dus een job die is gepland om uitgevoerd te worden op een bepaalde tijd, kan best nog een tijdje ‘in de queue’ staan, omdat er nog meer te doen is.
Maar zie je na een drie, viertal aanroepen van WP Cron niets opschuiven, dan kan je er gevoeglijk vanuit gaan, dat er iets mis is.
In de meeste gevallen zal het de ‘command line’ zijn, die je als cron opdracht hebt opgegeven. Werkt de ‘command line’ bij je eigen hoster niet, probeer dan cron-job.org eens. Werkt dat ook niet, is er iets groters mis en is het een goed moment om een expert in te schakelen.
Tenslotte
Dit artikel is oorspronkelijk in mei 2012 voor het eerst gepost. Omdat WordPress sinds die tijd nog afhankelijker van WP Cron is geworden en het aantal ‘wp cron jobs’ wat plugins toevoegen alleen maar lijkt te groeien, leek het mij een goede zaak om het artikel te updaten en uit te breiden.
Gezien het belang van dit onderwerp, heb ik dit artikel ook ‘gepromoveerd’ tot een sticky post!
Mocht je verder nog vragen hebben over (WP)-cron, stel ze hieronder en ik zal ze zo goed mogelijk proberen te beantwoorden.