WPLake > Blog > 5 cose importanti su WordPress Cron
  • English
  • Deutsch
  • Español
  • Français

5 cose importanti su WordPress Cron

Tempo di lettura: 9 minuti

-

Aggiornato 14.07.23

-

Generale Tutorial
WordPress Cron offre un modo semplice per programmare azioni senza occuparsi dell'implementazione. Esaminiamo momenti specifici per aiutarvi a gestire Cron in modo corretto.

Indice dei Contenuti

Cos'è il Cron?

#link copiato

Cron, in breve, è un modo per eseguire alcune attività (o lavori, se preferite) in base a una pianificazione. Ad esempio, per mantenere aggiornati i tassi di cambio sul vostro sito web, dovete aggiornarli una volta al giorno. Invece di farlo manualmente, si crea un'attività cron e la si imposta con una frequenza di una volta al giorno. Cron è ampiamente utilizzato in molti plugin e temi di WordPress per mantenere aggiornate le informazioni.

Cron di sistema VS Cron di WordPress

#link copiato

Con WordPress ci sono due modi diversi per farlo.

Cron di sistema

#link copiato

Il primo modo consiste nell'aggiungerlo nel cron del sistema Linux (questo è sul vostro server di hosting). Questi task si trovano nel file /etc/crontab e questo approccio è il modo più universale e affidabile per eseguire i task Cron. Il sistema operativo del vostro server (ad esempio Linux, Ubuntu o RedHat) garantisce che i task nei nostri file PHP saranno chiamati come sono stati programmati, indipendentemente da qualsiasi evento esterno.

Sebbene sia più universale e affidabile, non ha alcuna integrazione con WordPress. Ciò significa che se si chiamano direttamente i file PHP all'interno del tema, questi non avranno accesso alle funzioni di WordPress e al database. In questo modo, WordPress non può essere caricato correttamente. Inoltre, non è adatto ai plugin, perché se si utilizza il plugin, non si può semplicemente impostare il sistema Cron per tutti i clienti.

WordPress Cron

#link copiato

Poi arriva WordPress Cron ed è il secondo modo per eseguire attività cron. Potete facilmente registrare il vostro task cron all'interno di WordPress, e WordPress si occuperà di caricare ed eseguire i vostri task secondo la pianificazione specificata. Sembra una buona idea ed è adatta ai plugin.

Cosa c'è di meglio, vero? Ma nulla è perfetto e anche questo approccio presenta degli svantaggi.

WordPress è un'applicazione basata su PHP e non ha accesso al sistema Cron (il sistema operativo in esecuzione sul vostro host). Di fatto, significa che WP ha bisogno di qualche evento esterno per controllare l'elenco delle pianificazioni ed eseguire le attività pertinenti. Un'altra cosa è che WordPress può eseguire attività Cron SOLO quando qualcuno visita o apre una pagina del sito web. Se nessuno visita il vostro sito web, le attività Cron NON verranno eseguite.

Questo può sembrare spaventoso, ma la buona notizia è che WordPress garantisce che i task saranno chiamati, solo che non è garantito quando esattamente saranno chiamati. Ad esempio, avete impostato un task Cron sui tassi di cambio da eseguire una volta al giorno. Nella vita reale ciò significa che il task verrà eseguito con il primo visitatore, dopo un giorno all'ora stabilita. Non prima, ma forse più tardi, forse anche molto più tardi se non ci sono stati visitatori per diversi giorni.

Ci sono alcune attività che possono essere eseguite con questo approccio, ma mentre nessuno visita il vostro sito, Cron non viene eseguito e quindi non "funziona". Ma ci sono altri compiti che richiedono affidabilità. Quindi, se le attività di Cron riguardano l'estrazione di informazioni da fonti esterne o semplicemente attività molto importanti che devono essere eseguite, come ad esempio le API, non si può fare affidamento su questo approccio.

Verdetto

#link copiato

Entrambi i modi hanno vantaggi e svantaggi.

Per questo motivo la soluzione migliore, utilizzata dai professionisti e consigliata da WordPress, è una combinazione dei due approcci, che offre il meglio di entrambi e permette di contrastare i rispettivi svantaggi.

Come proprietario di un sito web (o come sviluppatore) è necessario impostare il lavoro Cron di sistema che chiamerà WordPress Cron. Nel complesso, è relativamente semplice da fare e in questo modo WordPress Cron sarà più affidabile pur mantenendo l'approccio nativo di WordPress.

Per sapere come procedere, consultate il punto 2.

Informazioni su WordPress Cron

#link copiato

Sopra abbiamo appreso che WordPress è un'applicazione basata su PHP e che il suo Cron interno si basa su eventi esterni, cioè sulle richieste degli utenti. Oltre a questo fatto, c'è un elenco di aspetti importanti, che analizzeremo in dettaglio.

1. WordPress Cron è asincrono

#link copiato

Innanzitutto, dovete sapere che WordPress Cron è asincrono. Asincrono significa che esegue i lavori di Cron in una richiesta separata dall'evento stesso.

Quindi, una richiesta dell'utente non avrà ritardi dovuti a WordPress Cron, un utente che ha attivato un lavoro Cron non aspetterà che il lavoro sia terminato per vedere il risultato della sua richiesta. Quindi potete stare tranquilli sapendo che non ci sono ritardi per i vostri visitatori. WordPress gestisce tutto tranquillamente in background.

Se siete interessati ai dettagli più fini, tecnicamente avviene nel modo seguente:

WordPress controlla la pianificazione Cron su ogni richiesta dell'utente a un sito web e, se è necessario eseguire lavori Cron, crea una nuova richiesta al file Cron del sito web (/cron.php), utilizzando la libreria cURL. L'utente riceve immediatamente la risposta alla sua richiesta, mentre Cron esegue le altre attività di cron in una richiesta separata, che è indipendente.

2. WP Cron non è affidabile (out-of-the-box). Come risolvere

#link copiato

Come già sappiamo, WordPress Cron out-of-the-box dipende da eventi esterni. Rispetto al Cron di sistema, ha un grosso svantaggio. Ma possiamo risolverlo facilmente unendo Cron di sistema e Cron di WordPress.

Quindi la soluzione è creare un lavoro Cron all'interno di Cron di sistema e richiamare WordPress Cron da lì. In questo modo, si ottiene un Cron affidabile con tutte le funzionalità di WordPress e il supporto per i cron job dei plugin. Può sembrare un po' complicato, ma non lo è affatto.

Per il manuale ufficiale vedere qui.

Il compito può essere suddiviso in due fasi. Il primo passo riguarda la creazione di un nuovo lavoro Cron di sistema. Fondamentalmente, esistono due diversi tipi di hosting (condiviso e dedicato) e la modalità di creazione dei cron job dipende dal tipo di hosting.

Come aggiungere un cron job di sistema per un hosting condiviso

#link copiato

Quando si utilizza un hosting condiviso, ci sono molti fornitori diversi e occorre verificare le caratteristiche offerte dal proprio fornitore in merito alle attività Cron. Di solito, il pannello di amministrazione di un hosting ha una scheda o una voce speciale su Cron, dove è possibile gestire i lavori Cron. Il pannello di amministrazione più comune è cPanel; per saperne di più su come aggiungere un lavoro Cron per cPanel, potete leggere l'articolo ufficiale . Di seguito è riportato il video ufficiale.

Come aggiungere un lavoro Cron di sistema per l'hosting VPS

#link copiato

Nel caso in cui siate proprietari di un VPS (Virtual Private Server ovvero Dedicated), dovete accedere al vostro server con SSH ed eseguire il seguente comando per aprire un file in modalità di modifica.

crontab -e

Passo 1. Impostare un processo Cron di sistema per WordPress Cron

#link copiato

Ora è il momento di creare un job Cron di sistema che chiamerà WordPress Cron.

a) Approccio classico (con wget)

#link copiato

Aggiungete una nuova riga nel vostro file Cron e copiate il contenuto qui sotto.

*/10 * * * * wget -q -O - https://YOUR_DOMAIN_HERE/wp-cron.php?doing_wp_cron >/dev/null 2>&1

Nota: la riga precedente non è adatta all'uso con WordPress Multisite. Se state utilizzando la modalità WP Multisite e avete bisogno di un Cron affidabile, leggete qui per saperne di più sulle soluzioni.

Non dimenticate di sostituire YOUR_DOMAIN_HERE con il vostro dominio.

La prima parte del comando indica che vogliamo che il nostro comando venga eseguito una volta ogni dieci minuti, indipendentemente dal numero di ore, dal giorno della settimana e da altre opzioni. La parte centrale utilizza lo strumento wget per richiedere il file Cron di WordPress e l'ultima parte dichiara che non vogliamo salvare l'output del file Cron.

Potete leggere ulteriori informazioni sugli argomenti qui.

b) Approccio pro (con WP-CLI)

#link copiato

Se si dispone di un sito web protetto da password (ad esempio Dev), il metodo sopra descritto non funzionerà, poiché wget non sarà in grado di richiamare il file wp-cron.php. La soluzione in questo caso è usare lo strumento WP-CLI sul vostro server. Basta installarlo come descritto nel manuale ufficiale e aggiungere la seguente riga alla pianificazione di cron, che chiamerà Cron tramite lo strumento CLI per il sito web specifico:

// don't forget to replace the path below to yours
wp cron event run --due-now --path=/home/admin/domains/YOUR_DOMAIN_HERE/public_html >/dev/null 2>&1

Questo metodo richiama Cron direttamente tramite il filesystem, senza alcuna richiesta HTTP. Ciò significa che non ci saranno problemi con i siti web, compresi quelli protetti da password.

Passo 2. Disattivare i controlli predefiniti di WordPress

#link copiato

Poiché ora abbiamo integrato WordPress Cron con il Cron di sistema, WordPress non ha più bisogno di controllare l'elenco delle pianificazioni in ogni richiesta dell'utente. Lo diciamo a WordPress impostando una costante speciale nel file wp-config.php.

/* Add any custom values between this line and the "stop editing" line. */

define( 'DISABLE_WP_CRON', true );

/* That's all, stop editing! Happy publishing. */

Come si può vedere, il file ha una sezione speciale per i valori personalizzati, quindi è necessario aggiungere questa costante dopo il primo commento e prima del secondo.

Non preoccupatevi dell'etichetta della costante, "DISABLE_WP_CRON" non significa in realtà disabilitare completamente WordPress Cron. Disabilita il controllo dell'elenco delle pianificazioni a ogni richiesta dell'utente. WP Cron dovrebbe comunque funzionare correttamente, in quanto il file wp-cron.php viene richiamato direttamente dal sistema Cron.

Ecco fatto! Congratulazioni! Ora la vostra installazione di WordPress ha un Cron affidabile con tutte le funzionalità di WordPress. Cron eseguirà i lavori secondo la pianificazione, indipendentemente dalla quantità di visitatori del sito web.

3. Come aggiungere e rimuovere i lavori Cron

#link copiato

Il Cron job di WordPress è solo un po' di codice PHP che viene eseguito da un programma. Inoltre, può utilizzare tutte le funzionalità di WordPress e ha accesso al database. Qui potete trovare un articolo per gli sviluppatori di WordPress su questo argomento.

Scegliere un intervallo

#link copiato

Per prima cosa, dobbiamo scegliere un intervallo con cui Cron ripeterà il nostro lavoro. Gli intervalli predefiniti di WordPress sono ogni ora, due volte al giorno, ogni giorno, ogni settimana. Sebbene sia sufficiente per la maggior parte dei casi, potrebbe essere necessario un intervallo personalizzato. Possiamo definirlo aggiungendo il seguente codice.

add_filter('cron_schedules', function ($schedules) {
    return array_merge($schedules, [
        // here is the name of our custom interval. used when adding a new job
        'five_hours' => [
            // the number here represents seconds, so the formula is: 5 hours * 60 minutes * 60 seconds
            'interval' => 5 * 60 * 60,
            'display' => esc_html__('Every Five Hours'),
        ],
    ]);
});

Aggiunta di un nuovo lavoro ricorrente

#link copiato

Per aggiungere un nuovo lavoro Cron è necessario aggiungere un nuovo shortcode e allegare un calendario allo shortcode. L'intervallo (il secondo argomento della funzione wp_schedule_event()) deve essere uno degli intervalli predefiniti o un nome personalizzato che si può aggiungere utilizzando il frammento di codice qui sopra.

add_action('YOUR_NAME_HERE', function () {
    /* your job here
    you can use all the WordPress features and functions
    e.g. wp_insert_post() */
});

// we must check that the event wasn't scheduled as each call creates a new one
// otherwise, if we've skipped the check it'll create a new event for each user request
if (!wp_next_scheduled('YOUR_NAME_HERE')) {
     /* the first argument is the timestamp which controls when the job 
       will be run for the first time
       the next argument  reflects the chosen interval */
    wp_schedule_event(time(), 'hourly', 'YOUR_NAME_HERE');
    return;
}

Nel codice precedente abbiamo creato un lavoro vuoto che Cron esegue una volta all'ora.

Aggiunta di un nuovo lavoro singolo

#link copiato

L'esempio precedente aggiunge un lavoro che Cron esegue con un metodo ricorrente. Ma si ha anche la possibilità di programmare un singolo lavoro. Per questo obiettivo, è necessario utilizzare la funzione wp_schedule_single_event() invece della funzione wp_schedule_event(). Può accettare due (2) tipi di argomenti: il timestamp con il prossimo orario di esecuzione e l'hook che contiene il lavoro. Creiamo quindi un lavoro che Cron eseguirà una sola volta, dopo 5 ore:

add_action('YOUR_NAME_HERE', function () {
    /* your job here
     you can use all the WordPress features and functions
     e.g. wp_insert_post() */
});

// it's necessary to check that the event wasn't scheduled as each call creates a new one
// if you've skipped the check it'll create a new event for each user request
if (!wp_next_scheduled('YOUR_NAME_HERE')) {
    // as before, the first argument is the timestamp which controls when the job will be run
    // it's presented in seconds, so the formula is: 5 hours * 60 minutes * 60 seconds
    wp_schedule_single_event(time() + 5 * 60 * 60, 'YOUR_NAME_HERE');
    return;
}

Rimozione di un lavoro Cron

#link copiato

È possibile rimuovere un lavoro pianificato aggiunto in precedenza. È particolarmente utile per le attività ricorrenti. A tale scopo, chiameremo la funzione wp_unschedule_event() con un paio di argomenti. Il primo deve contenere il prossimo timestamp dell'evento (lo otteniamo dinamicamente) e il secondo è il nome del lavoro.

Il codice sottostante rimuove i lavori singoli e ricorrenti. Inoltre, si noti che per i lavori ricorrenti non viene rimosso solo il programma o l'evento successivo, ma anche tutti gli eventi futuri del lavoro.

$timestamp = wp_next_scheduled('YOUR_NAME_HERE');
if ($timestamp) {
    wp_unschedule_event($timestamp, 'YOUR_NAME_HERE');
}

4. Come monitorare i lavori Cron

#link copiato

Le informazioni su tutti i lavori Cron di WordPress sono memorizzate nel database. Questo significa che possiamo ottenere un elenco di tutti i lavori programmati e gestirli. È una cosa importante per gli sviluppatori e i proprietari di siti web.

Se avete visto lo schema del database di WordPress, sapete che non esiste una tabella separata per Cron. Tutte le attività di Cron sono memorizzate all'interno di una singola opzione nella tabella Options. Molto probabilmente conoscete già questa tabella, come ogni buon sviluppatore di WordPress conosce le tabelle principali del database di WordPress. Questa conoscenza è necessaria per comprendere i processi interni. Se volete verificare e migliorare le vostre conoscenze, leggete cosa deve sapere un buon sviluppatore WordPress.

WordPress memorizza le attività Cron come opzione nella tabella Opzioni

Ma guardare i dati serializzati direttamente tramite PhpMyAdmin non è la migliore delle idee. Per questo motivo utilizzeremo il plugin WP Crontrol che ci fornirà un'interfaccia chiara. Utilizzando lo strumento possiamo eseguire il debug dei nostri lavori Cron o controllare quelli esterni aggiunti dai plugin. Ad esempio, abbiamo creato il nostro Cron job personalizzato e lo abbiamo eseguito immediatamente utilizzando lo strumento per assicurarci che funzioni correttamente.

Il plugin fornisce l'interfaccia per gestire sia i processi Cron che gli intervalli. Utilizzarlo è abbastanza semplice. Installare e attivare il plugin, quindi visitare la voce "Strumenti" - "Eventi Cron" nel menu di amministrazione.

Qui è possibile gestire i lavori Cron (chiamati Eventi Cron) e gli intervalli Cron (chiamati Pianificazioni Cron).

È possibile controllare ogni singolo lavoro. Passare il cursore sulla voce di destinazione per visualizzare l'elenco delle azioni

5. Plugin Cron e Cache

#link copiato

La cosa importante a cui dovete prestare attenzione è la collaborazione dei plugin Cron e Cache di WordPress. La maggior parte dei siti web WordPress utilizza alcuni plugin di cache per ridurre i tempi di risposta. Nel complesso l'approccio è buono e importante per la SEO. Inoltre, la cache significa molto per l'ottimizzazione della velocità di WordPress. Ma nel nostro caso, significa anche saltare l'esecuzione del PHP e restituire l'HTML.

Per impostazione predefinita, WordPress Cron si basa sulle richieste degli utenti. Il fatto che WordPress Cron venga chiamato o meno durante le richieste alle pagine memorizzate nella cache dipende dal plugin in uso. In base alla nostra esperienza, i plugin per la cache non chiamano WordPress Cron o lo chiamano più raramente di quando è pronto.

WordPress Cron verrà comunque richiamato durante le visite dell'editor alla dashboard, ma potrebbe non essere sufficiente. Questo approccio va bene nel caso in cui i lavori Cron non siano importanti e possano essere ritardati per periodi più lunghi. Altrimenti, considerare la seconda parte dell'articolo.

La soluzione descritta nella seconda parte dell'articolo, relativa all'unione di Cron di sistema e Cron di WordPress, mostra i chiari vantaggi, quindi se l'avete utilizzata in questo modo allora siete a posto e non dovete più preoccuparvi.

Il file wp-cron.php viene chiamato direttamente e WordPress Cron funzionerà correttamente.

Conclusione

#link copiato

Abbiamo esaminato le 5 cose importanti di WordPress Cron. Vi consigliamo di seguire la seconda parte (unire Cron di sistema e Cron di WordPress) per ciascuno dei vostri siti WordPress. Vi risparmierà tonnellate di grattacapi in futuro. Inoltre, non dimenticate gli strumenti che vi permettono di monitorare i lavori Cron. Sono molto utili.

Speriamo che il nostro articolo vi sia stato utile e che ora abbiate un quadro chiaro di WordPress Cron e di come aggiungere i vostri lavori Cron utilizzando gli snippet di codice.

Sull'autore
Maxim Akimov

Certified WordPress expert from Ukraine with over 7 years of experience. Advocate of the BEM methodology and the overall modular approach. Loves sporting activities and enjoys going to the gym and regularly plays table tennis.

Got it