I WordPress kan man schemalägga vissa uppgifter. Det kan till exempel vara ett blogginlägg som ska publiceras en viss tid, en backup som ska göras varje vecka eller kontrollera ifall några uppdateringar finns tillgängliga. Många upplever dock problem med dessa schemalagda uppgifter, att de inte utförs när de ska utföras.
Den här artikeln kommer lära dig hur du ser till att de schemalagda uppgifterna fungerar som de ska.
Hur fungerar de schemalagda uppgifterna i WordPress?
I Linux-världen finns det ett verktyg som heter ?cron? (från grekiskans ?chronos? som betyder tid), vilket sköter om datorrelaterade arbeten som regelbundet ska utföras vid vissa tider eller med vissa intervaller. WordPress har en egen variant som ska efterlikna detta verktyg, och kallas därmed för ?WP-cron? i vardagligt tal. Eller ?fejk-cron?, som jag brukar kalla det.
WP-cron gör det möjligt för dig att exempelvis publicera ett blogginlägg automatiskt vid en viss tid. Vid varje sidvisning på din webbplats kontrollerar WordPress om det finns något ogjort cron-jobb vars tid har passerat ? om det gör det så utför WordPress jobbet.
Problem med WordPress-cron
Det finns tre uppenbara problem med WP-cron:
- Jobbet utförs inte förrän någon besöker din webbplats efter utsatt tid
- Vid tyngre jobb kan besökaren som aktiverar jobbet uppleva en fördröjning
- Ifall din webbplats har intensiv trafik kan alla kontroller mot WP-cron påverka prestandan negativt.
Ett följdproblem som vissa får är att det dröjer för lång tid mellan den utsatta tiden för ett blogginlägg och nästa besök, vilket gör att blogginlägget markeras som ?missat? ? det publiceras aldrig.
Lösningen: Ett riktigt cron-jobb
Lösningen är att skapa ett riktigt cron-jobb ? i den här artikeln kommer jag berätta hur du gör med cPanel. Om du istället använder en Linux-baserad server (antingen dedikerad eller VPS) utan cPanel så kommer jag berätta hur du gör lite längre fram i artikeln.
Det vi kommer göra är inte att byta ut WP-cron, utan istället att inaktivera det under de vanliga besöken och skapa ett riktigt cron-jobb som kör WP-cron istället. På så sätt kommer dina schemalagda uppgifter vara helt oberoende och alltid utföras på utsatt tid.
Kommandot vi kommer lägga in i cron är följande (en rad):
wget --quiet --spider --timeout=0 --tries=1 https://www.exempel.se/wp-cron.php?doing_wp_cron
wget
 anropar en webbsida, --quiet
 gör att ingen data skrivs ut, --spider
 gör att det är endast webbsidans header-data som hämtas, --timeout=0
 ser till att inget avbryts ifall det tar för lång tid och --tries=1
 ser till att kommandot bara kommer köras en gång. I slutet av kommandot har du webbadressen, och den ska du ersätta med din egen. Observera att /wp-cron.php?doing_wp_cron
 måste vara med.
Webbhotell med stöd för cron
Tyvärr så har inte alla webbhotell stöd för cron. Nedan är en lista med webbhotell som stödjer cron ? samtliga är från mitt tidigare prestandatest.
- Binero (egen lösning)
- City Network (egen lösning)
- Crystone (egen lösning, hittar dock ingen guide)
- Loopia (egen lösning)
- Manufrog (via cPanel)
- Mebo (via cPanel)
- Oderland (via cPanel)
Är inte ditt webbhotell med i listan? Då är det enklaste sättet att fråga dem ifall de har stöd för cron, och i så fall hur du når det.
Skapa ett cron-jobb via cPanel
- Logga in i cPanel.
- GÃ¥ till Home > Advanced > Cron jobs.
- Lämna fältet för e-postadress tomt ? annars kommer du få ett mejl varje gång jobbet körs.
- Vid ?Common Settings? väljer du hur ofta du vill att det ska göras en kontroll om några schemalagda uppgifter finns. Jag tog var femte minut, men för de flesta räcker det gott och väl med två gånger per timme (?Twice per hour?) ? då kommer kontrollerna göras varje hel- och halvtimme.
- I fältet ?Command? skriver du in kommandot som jag skrev tidigare i artikeln.
- Spara cron-jobbet genom att klicka på knappen ?Add New Cron Job?.
Skapa ett cron-jobb på en Linux-server
- Logga in på servern med SSH (jag använder Putty).
- Kör kommandot
crontab -e
. - Klistra inÂ
*/5 * * * *
 följt av kommandot som jag skrev tidigare i artikeln. Allt ska vara på en rad. - Spara och avsluta (jag trycker Ctrl + X för detta ändamål).
De fem olika delarna (stjärnorna) är separerade med mellanslag och kan ersättas med en siffra för att ange önskad tid. Det hela kan kännas förvirrande, men det finns en logik:
- Första delen (
*/5
) är vilken minut arbetet ska köras (0-59). Just*/5
 är en specialare och betyder var femte minut. - Andra delen är vilken timme arbetet ska köras (0-23). I detta fall alla timmar.
- Tredje delen är vilken månadsdag arbetet ska köras (1-31). I detta fall alla dagar.
- Fjärde delen är vilken månad arbetet ska köras (1-12). I detta fall alla månader.
- Femte delen är vilken veckodag arbetet ska köras (1-7 för mån-sön). I detta fall alla veckodagar. Även 0 kan anges, vilket är detsamma som 7.
Om vi exempelvis istället skulle ange 10 5 * * 7
 skulle vårt cron-jobb köras varje söndag klockan 05:10.
Stäng av WP-cron under vanliga sidbesök
Nu när du har ett riktigt cron-jobb är det onödigt att WP-cron ska köras för varje sidbesök. Du kan enkelt stänga av detta genom att lägga till nedanstående rad i wp-config.php:
define('DISABLE_WP_CRON', true);
Slutord
Svårare än så är det inte. Glöm inte att prova skapa ett schemalagt inlägg och kontrollera att inlägget publiceras på utsatt tid.
Staffan
11 maj, 2014
Intressant Ivar.
Detta genererar flera frågor, men en som poppar upp nu är. Det finns till WP flera pluggar som utlovar att göra olika saker med automatik, men du skriver att cron inte fungerar på alla webbhotell.
Frågan blir då funkar inte dessa tillägg på alla hotell, eller?
Ivar Johansson
11 maj, 2014
Tilläggen använder sig högst troligt av WP-cron, vilket gör att de fungerar, dock inte på ett tillförlitligt sätt om du själv inte sätter upp ett riktigt cron-jobb för WP-cron. :-)
Kommentarer är för närvarande avstängda.