devdev / in the loop

WordPress e cron job in modo semplice

WordPress possiede un sistema interno di cron job da poter sfruttare in modo modo semplice, senza l’utilizzo di alcun plugin o sistemi esterni.

Un cron atipico

Se siamo abituati al sistema di Attività pianificate che ci offrono gli hoster, cioè la possibilità di eseguire di script, ad esempio, ogni giorno alle 12, dobbiamo sapere che WordPress funziona in modo diverso. Non accedendo a nessun pannello di hosting, nel al sistema crontab installato sul server, WordPress utilizza un meccanismo “furbo” per eseguire i Cron. In sostanza, l’esecuzione del cron è vincolata alla visita dell’utente, viene quindi eseguito dopo il loading di una pagina da parte di un qualsiasi visitatore.

In sostanza, le operazioni rimangono in coda fintanto che un utente non visita e carica una pagina del nostro sito. Solo in quel momento verrà eseguito il Cron. Se abbiamo quindi un sito con poche visite i nostri Cron potrebbero essere “meno precisi”. Facciamo un esempio: se scheduliamo un task da eseguire alle 12 ogni giorno, ma in quell’ora non c’è nessun visitatore al sito, verrà eseguito solo alla prossima visita utile. Ovvero, se la prossima visita sarà alle 17, il cron verra eseguito ..alle 17.

Se invece il nostro sito ha un traffico abbondante e distribuito durante la giornata, non dovremo preoccuparci di ciò.

 

WP-Cron in azione

Il componente di cui stiamo parlando, come avrete capito, è WP-Cron, ed è sicuramente il modo più rapido e conveniente per eseguire azioni temporizzate.

WP-Cron funziona attorno a due concetti principali: il momento di esecuzione del task per la prima volta, e il tempo dopo il quale esso va ripetuto. Per esempio, se vogliamo che il nostro task inizi alle 12, con un intervallo di 3600 secondi (cioè un’ora), esso verrà eseguito alle 12, alle 13, alle 14 e così via ogni ora.

Per semplificare l’intervallo, WordPress ha degli intervalli predefiniti:

  • hourly (ogni ora)
  • twicedaily (due volte al giorno)
  • daily (ogni giorno)
  • weekly (settimanale, a partire da WordPress 5.4+)

Vediamo quindi come aggiungere un cron job con uno di questi intervalli:

Aggiungiamo un cron job

WP-Cron utilizza gli hook di WordPress. Creiamo quindi un hook personalizzato che esegue la nostra funzione di scheduling:

// Creiamo il nostro hook "hook_schedule" e indichiamo la funzione da chiamare
add_action( 'hook_schedule', 'esegui_scheduled');

// Controlliamo che non sia già il coda
if (!wp_next_scheduled('hook_schedule')) {
    // Mettiamolo in coda d'esecuzione
    wp_schedule_event(time(), 'daily', 'hook_schedule');
}

function esegui_scheduled() { /* */ }

Per prima cosa creiamo un hook con add_action(). Ricordiamoci che il primo parametro è il nome del nostro hook, il secondo il nome della funzione da eseguire.

Importante da sapere: wp_schedule_event() è una funzione abbastanza semplice, se la chiamiamo più volte, il cron verrà eseguito più volte. Abbiamo messo quindi un controllo per capire se è già in coda con wp_next_scheduled(). Questa funzione restituisce il timestamp della prossima esecuzione o false nel caso non ci sia nulla.

wp_schedule_event() accetta questi parametri:

  • il timestamp (in formato UNIX) della prima volta che deve essere eseguito
  • ogni quanto
  • l’hook da chiamare
  • argomenti opzionali da passare all’hook che viene chiamato

Disabilitiamo un cron

Nel caso volessimo disabilitare il cron, possiamo usare la funzione wp_unschedule_event() che cancellerà sia la prossima esecuzione, stia tutte quelle future. In modo del tutto simile al caso precedente, questa funzione accetta come parametri il timestamp della prossima esecuzione e il nome dell’hook. Dato che probabilmente il timestamp della prossima esecuzione non lo conosceremo, sfruttiamo di nuovo la funzione wp_next_scheduled() per saperlo.

$timestamp_prossimo = wp_next_scheduled( 'hook_schedule' );
wp_unschedule_event( $timestamp_prossimo, 'hook_schedule' );

Creiamo un intervallo custom

Se gli intervalli predefiniti non ci bastano, ma vogliamo ad esempio creare un cron che giri ogni 10 minuti, possiamo crearlo facilmente:

add_filter( 'cron_schedules', 'intervallo_10_minuti' );
function intervallo_10_minuti($schedules)
{
    $schedules['dieci_minuti'] = [
        'interval' => 600,
        'display' => esc_html__( 'Ogni 10 minuti' )
    ];
    return $schedules;
}

A questo punto, per utilizzalo nell’esempio precedente, sostituiamo daily con dieci_minuti:

wp_schedule_event(time(), 'dieci_minuti', 'hook_schedule');

Bonus: cron che gira un preciso giorno della settimana

Abbiamo visto che gli intervalli possibili sono daily, weekly, twicedaily e hourly. Bene.. e se volessimo far girare il cron ogni lunedì ad esempio? Potremmo sfruttare un cron daily e agire all’interno della funzione chiamata dall’hook facendo un controllo sul giorno della settimana utilizzando date(). Vediamolo applicato alla funzione del nostro esempio:

function esegui_scheduled()
{
    if (date("w") == 1) { // 0 = domenica, 1 = lunedì, etc.
        // ...
    }
}
Questo articolo ti è stato utile?
Wordpress – LETTURA 5 MINUTI Abilitare upload di file in WordPress (senza plugin)
Se volessimo caricare nella Libreria Media di WordPress un tipo di file non supportato, riceveremo l’errore: Non hai i permessi…
Wordpress – LETTURA 3 MINUTI Ottenere l’URL della pagina attuale in WordPress
Ecco uno snippet che ci permette di ottenere velocemente l’URL della pagina WordPress attuale, non importa se essa è una…
Wordpress – LETTURA 4 MINUTI Visualizzare i tag di una categoria in WordPress
Nella costruzione di un template, spesso ci troviamo a dover ottenere la lista dei tag dei post associati ad una…
Wordpress – LETTURA 5 MINUTI Passare variabili a get_template_part() in WordPress
Come sappiamo, la funzione get_template_part(), ci mette a disposizione un meccanismo semplice per creare delle sezioni riusabili all’interno del nostro…
Roba figa da
if (weekend) {
    relax();
}
la nostra newsletter, ogni tanto.