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

Pregled sadržaja

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 da vidimo kako on funkcionira. Napravit ćemo primjer izrade zadatke i isplanirati izvršenje zadataka.

WordPress Cron

Neki 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.

Kako funkcionira WP Cron

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

Izrada WP-cron posla

1. Podešavanje cron posla bez instaliranog plugina

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.

2. Podešavanje i kontrola cron poslova pomoću WP Crontrol dodatka

Dodatak nam dosta pojednostavljuje rad s cron zadacima.

Pregled registriranih intervala

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.

Kreiranje vlastitog intervala

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

Popis registriranih poslova

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.

Kreiranje novog Cron posla

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'));
}

Brisanje cron posla i brisanje dodatka

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.

Sažetak

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.