Kreiranje automatskog izvršavanja radnji u intervalima pomoću WP-Cron

Saznajte kako pomoću WordPress cron posla možemo zakazati izvršavanje određene radnje u željeno vrijeme i u raznim intervalima.
Cron je standardni UNIX program koji služi za zakazivanje izvršavanja poslova u određeno vrijeme. Zadatak je poznat kao cron posao (eng. cron job). Cilj je automatizirati zadatke koji se ponavljaju radi bolje produktivnosti, uštede vremena, manje briga i glavobolja te izbjegavanja nepotrebnog ručnog posla. Iako se zove kao standardni program, WordPressov Cron posao malo se razlikuje pa ćemo u članku raščlaniti kako funkcionira. Napravit ćemo primjer izrade zadatke i isplanirati izvršenje zadataka.
Za početak, nekoliko primjera gdje se WP-Cron koristi u čistom WordPressu:
- provjere ako postoje nove verzije WordPressa, dodataka ili teme i izvršavanje njihovih nadogradnji (ako je aktivirano)
- objavljivanje članaka koje smo podesili da se objave u određeno vrijeme u budućnosti
- brisanje starih objava ili komentara iz otpada (ako nije deaktivirano)
- provjera zdravlja stranice (ishod se vidi na nadzornoj ploči ili pod Tools > Site Health)
Ovisno postoje li neki instalirani dodaci, popularni WP-Cron poslovi su još:
- redovito skeniranje sustava radi potencijalnih virusa i drugih hakerskih prijetnji
- automatsko stvaranje sigurnosne kopije baze podataka
Možemo kreirati zadatak kakav god poželimo. Primjerice, podesiti da nam se pošalje poruka na e-mail nakon što sustav odradi neke provjere.
Ponekad smo primijetili da postoje kreirani poslovi za dodatke (pluginove) koji više ni ne postoje jer ne počiste za sobom nakon što se obrišu. Još jedan razlog zašto je dobro čim manje dodataka instalirati na WordPress stranice i koristiti samo dodatke provjerene kvalitete, kako ne bi zagušili sustav nepotrebnim radnjama.
WP-Cron poslovi izvršavaju se u pozadini i šalju naredbu na server hostinga web stranice na kojem se nalaze da izvrši zadatak u određeno vrijeme ili u određenim vremenskim intervalima. Da bi cron započeo sa zacrtanim poslom, netko treba posjetiti web stranicu. Dakle, prvo trebate imati barem neke posjetitelje na stranici. Usput, znate li da možemo optimizirati web stranice za tražilice kako bi bolje rangirale i privukle posjetu? 🙂
Jer WP-Cron se izvrši tek kada se web stranica učita i kada se programski kodovi WordPressa pokrenu. Zbog tog razloga nije baš posve precizan ali za uobičajene radnje nam je sasvim dovoljno. Za slučaj kad nam je potrebno vrlo precizno postavljanje vremena morali bi se odmaknuti od WordPress načina i koristiti izvorni cron job koji podesimo na razini servera.
WP-Cron zatim provjerava ima li nekih planiranih poslova koje mora izvršiti. Ako je upravo vrijeme za njihovo izvršenje ili ako primijeti da je to vrijeme već prošlo i trebao je poslove već obaviti, sustav tada pokreće njihovo izvršavanje.
WP-Cron koristi dvije datoteke za rad. Prva je cron.php (nalazi se unutar wp-includes direktorija) koja sadrži sve funkcije potrebne za zakazivanje posla, druga je wp-cron.php (u glavnom direktoriju WordPressa) i ona je odgovorna za njihovo izvršenje.
1. Definiramo interval na 5 minuta. Ovaj korak nije potreban ako se koristi neki standardni interval (hourly, daily…)
add_filter('cron_schedules', 'ms_custom_cron_schedule'); function ms_custom_cron_schedule($schedules) { $schedules['ms_five_minutes'] = array( 'interval' => 300, // 5 minuta (5 x 60 = 300) 'display' => 'Five minutes', ); return $schedules; }
2. Zakazujemo posao na određeni interval (ako taj posao već ne postoji jer ne želimo da ih duplicira) pomoću
wp_schedule_event
funkcije unutar teme.
Funkcija prima tri parametra:
- naziv akcije koja će se izvršiti
- interval – koliko često se posao mora izvršavati
- datum i vrijeme kada se posao mora prvi puta izvršiti
- dodatni opcionalni argumenti koje možemo proslijediti
Mi ćemo zakazati termin za podne i postaviti da se izvršava svakih 5 minuta koristeći prethodno registrirani interval.
if (!wp_next_scheduled('ms_test_cron_job')) { wp_schedule_event(strtotime('12:00:00'), 'ms_five_minutes', 'ms_test_cron_job'); }
3. Definiramo funkciju koja će se pozvati, u ovom slučaju samo zabilježi obavijest u log.
add_action('ms_test_cron_job', 'ms_test_cron_job'); function ms_test_cron_job() { $dt = new DateTime(); error_log('Cron job je izvršen - ' . $dt->format('Y-m-d H:i:s')); }
Ako u
wp-config.php
imamo postavljenu konstantu
define('WP_DEBUG', true);
tada će se obavijest zapisati u datoteku
/wp-content/debug.log
. U suprotnome, zapisat će se u
error_log
datoteku koja se nalazi u glavnom (root) direktoriju WordPressa.
Dodatak nam dosta pojednostavljuje rad s cron zadacima.
Pod
Tools > Cron Events > Cron Schedules
imamo pregled cijelog popis registriranih intervala, pod kojih imenom su registrirani i koliko često se izvršavaju. Neki primjeri su:
-
hourly
– svaki sat -
every2hours
– svaka dva sata -
twicedaily
– dva puta dnevno -
daily
– jednom dnevno -
weekly
– jednom tjedno -
monthly
– jednom mjesečno
Ovo nije bila iscrpna lista ali dovoljno je za početak. Za detalje sami pogledajte kompletan popis.
Pod
Tools > Cron Events > Cron Schedules
dolje za dodavanje imamo 3 polja za input.
- internal name – programerski naziv za interval, riječi trebaju biti izdvojene donjom crtom a pametno je koristiti prefiks kako bi kasnije znali tko je postavio interval i može li se modificirati
- interval (seconds) – broj intervala u sekundama, npr. interval od 2 minute će biti 2 x 60 = 120
- display name – proizvoljan naziv za interval
Mi ćemo, kao i u primjeru bez instaliranog dodatka, kreirati interval od 5 minuta s idućim parametrima:
ms_five_minutes 300 Five minutes
Pod
Tools > Cron Events > Cron Events
imamo uvid u sve registrirane zadatke. Vidimo funkciju koju okidaju, postoje li neki argumenti koji će se proslijediti funkciji, točan datum idućeg izvršavanja, ispod odmah i relativno vrijeme do tog datuma, te koliko često se interval izvršava.
Pod
Tools > Cron Events > Cron Events
klikom na “Add Cron Event” možemo kreirati novi posao. Potrebno je navesti naziv udice (“Hook name”), argumente koje želimo proslijediti (opcionalno), datum prvog izvršavanja te koliko često se interval ponavlja.
Kreirat ćemo posao s ovim parametrima:
ms_test_cron_job {prazno} Now Five minutes
Time smo kreirali akciju nazivom
ms_test_cron_job
koju ćemo odmah pozvati tako da na stranici
Tools > Cron Events > Cron Events
pokrenemo (Run Now) našu akciju. Nakon prvo izvršenja, posao će se izvršavati svakih pet minuta beskonačno puta ali pod uvjetom da netko posjeti web stranicu kako bi WordPress mogao pokrenuti provjeru i okinuti zadane poslove prema potrebi.
Da bismo mogli imati koristi od kreirane akcije, trebamo joj dodijeliti funkciju. Naredni primjer pokazuje nam kako da akciji dodijelimo funkciju koja će potom u error log ispisati poruku i datum izvršenja poruke.
add_action('ms_test_cron_job', 'ms_test_cron_job'); function ms_test_cron_job() { $dt = new DateTime(); error_log('Cron job je izvršen - ' . $dt->format('Y-m-d H:i:s')); }
Kada više ne trebamo izvršavanje funkcije, posao samo obrišemo pod
Tools > Cron Events > Cron Events
.
Kada više ne želimo koristiti dodatak, samo ga deaktiviramo i obrišemo. Ako smo koristili standardne vrijednosti za intervale (daily, hourly…), Cron poslovi koje smo kreirali nastavit će se izvršavati i nakon što je dodatak obrisan.
Vidjeli smo primjer zakazivanja cron posla što nam dugoročno može uštedjeti vrijeme. Pokazali smo dva načina, jedan pomoću čistog kôda i drugi pomoću instaliranog dodatka koji nam pruži pregledan uvid u sve registrirane cron poslove i podešene intervale. Za uvid u pregled svih poslova nije ni nužno koristiti dodatak, možemo to vidjeti preko WP CLI koristeći naredbu
wp cron event list
. Jedino bi tada trebali imati SSH pristup web stranicama. U toj tablici vidimo pregled svih akcija, točan datum idućeg pokretanja, relativno vrijeme idućeg pokretanja, koliko često se posao izvršava.