Hur du får schemalagda uppgifter att fungera i WordPress

Schemalagda uppgifter

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:

  1. Jobbet utförs inte förrän någon besöker din webbplats efter utsatt tid
  2. Vid tyngre jobb kan besökaren som aktiverar jobbet uppleva en fördröjning
  3. 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 http://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.

Ä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

  1. Logga in i cPanel.
  2. Gå till Home > Advanced > Cron jobs.
  3. Lämna fältet för e-postadress tomt — annars kommer du få ett mejl varje gång jobbet körs.
  4. 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.
  5. I fältet ”Command” skriver du in kommandot som jag skrev tidigare i artikeln.
  6. Spara cron-jobbet genom att klicka på knappen ”Add New Cron Job”.

Skapa ett cron-jobb på en Linux-server

  1. Logga in på servern med SSH (jag använder Putty).
  2. Kör kommandot crontab -e.
  3. Klistra in */5 * * * * följt av kommandot som jag skrev tidigare i artikeln. Allt ska vara på en rad.
  4. 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.

Ivar Johansson

Skriven av

Ivar började med webbutveckling för tio år sedan och har sedan dess utvecklat breda kunskaper inom framför allt webbprestanda, sökmotorer och användarupplevelse. Idag driver han eget företag där han skapar webbplatser som är snabba, säkra och enkla att hantera.

  1. 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?

  2. 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. :-)

Mejla mig: