WP-Cron è il sistema con cui WordPress gestisce le attività programmate: pubblicazione dei post pianificati, controlli periodici, manutenzione e molte operazioni avviate da plugin e temi.

Il punto da capire è che WP-Cron non funziona come il cron di sistema di Linux. Non rimane attivo in background aspettando che l’orologio raggiunga un determinato minuto. WordPress controlla gli eventi programmati quando il sito riceve una richiesta e, se trova attività scadute, tenta di avviarne l’esecuzione.

Per questo un evento impostato alle 10:00 non ha necessariamente la garanzia di partire alle 10:00: deve arrivare anche un’occasione utile per attivare il sistema. È uno dei motivi per cui WP-Cron può funzionare perfettamente su un sito e diventare poco prevedibile su un altro. La documentazione ufficiale di WordPress sul sistema Cron descrive proprio questa differenza rispetto a un normale scheduler di sistema.

In questa guida vediamo come capire se WP-Cron sta realmente causando un problema, come diagnosticarlo con Site Health e WP-CLI, cosa cambia su WooCommerce e quando conviene sostituire il trigger predefinito con un cron job del server.

Cos’è WP-Cron e cosa fa davvero in WordPress

WP-Cron è uno scheduler interno a WordPress. Il suo compito non è eseguire continuamente codice in background, ma mantenere un elenco di eventi programmati e avviare quelli che hanno raggiunto il momento previsto.

La distinzione sembra sottile, ma cambia completamente il modo in cui va diagnosticato.

WP-Cron non è un vero cron di sistema

Un cron di sistema viene eseguito dal sistema operativo secondo una pianificazione temporale indipendente dal traffico del sito.

Puoi dire al server:

esegui questo comando ogni cinque minuti.

Il server controllerà l’orologio ed eseguirà il comando ogni cinque minuti, che qualcuno stia visitando il sito oppure no.

WP-Cron lavora diversamente. WordPress simula questa logica attraverso il proprio ciclo applicativo. Quando arriva una richiesta, controlla se esistono eventi dovuti e può quindi avviare il processo che li eseguirà.

Per una spiegazione generale del cron Unix, della sintassi e della pianificazione lato server puoi fare riferimento alla nostra guida ai cron job. Qui ci concentriamo invece esclusivamente sullo scheduler di WordPress e sui problemi che possono nascere dalla sua modalità di attivazione.

Nell’implementazione corrente, WordPress tenta di avviare wp-cron.php attraverso una richiesta HTTP loopback non bloccante. Il controllo viene agganciato alla fase shutdown, salvo configurazioni particolari con ALTERNATE_WP_CRON. Non significa quindi che il browser dell’utente debba rimanere in attesa mentre WordPress esegue tutti i task programmati. La documentazione della funzione wp_cron() chiarisce questo meccanismo.

Quali attività WordPress vengono eseguite tramite WP-Cron

WordPress core utilizza gli eventi programmati per operazioni che non devono necessariamente avvenire durante una normale richiesta HTTP.

Fra gli esempi più immediati ci sono la pubblicazione dei post pianificati e alcuni controlli periodici relativi agli aggiornamenti. Plugin e temi possono poi registrare i propri eventi.

Questo significa che sullo stesso sito potresti trovare attività relative a:

  • manutenzione e pulizia;
  • backup;
  • sincronizzazioni;
  • email;
  • importazioni ed esportazioni;
  • scadenze;
  • ecommerce;
  • elaborazioni periodiche;
  • code di lavoro gestite da sistemi come Action Scheduler.

Il fatto che un hook compaia nell’elenco degli eventi cron non significa però che appartenga a WordPress core. Molti hook vengono registrati da plugin specifici ed è quindi essenziale identificarne l’origine prima di modificarli o eliminarli.

Cosa succede quando un evento raggiunge l’orario programmato

Immaginiamo che un plugin registri un evento per le 14:00.

Alle 14:00 WordPress non riceve automaticamente un segnale dal sistema operativo. L’evento diventa semplicemente dovuto.

Quando arriva una richiesta utile al sito, WordPress controlla gli eventi programmati. Se trova quello delle 14:00 ancora in attesa, può avviare WP-Cron e farlo eseguire.

Questo porta a un modello mentale più corretto:

orario programmato → evento diventa dovuto → richiesta al sito → controllo WP-Cron → avvio del runner → esecuzione dell’hook

Se si rompe uno di questi passaggi, l’effetto visibile può essere identico — “il cron non funziona” — ma la causa tecnica cambia completamente.

Sequenza evento dovuto, richiesta, WP-Cron, runner ed esecuzione del task WordPress
Un evento programmato diventa dovuto; una richiesta può attivare WP-Cron, che avvia il runner responsabile dell’esecuzione del task.

Perché WP-Cron può eseguire un’attività in ritardo o non eseguirla

Quando un’attività programmata salta o arriva in ritardo, disabilitare immediatamente WP-Cron è quasi sempre un approccio diagnostico troppo aggressivo.

Prima bisogna capire dove si interrompe la catena.

SintomoPossibile causaPrimo controllo utile
Post programmati pubblicati in ritardotrigger WP-Cron poco frequente o evento in ritardoSite Health + eventi cron
Molti eventi risultano scadutiWP-Cron non viene avviato correttamentewp cron test
Un solo hook fallisceproblema del plugin/callback, non necessariamente di WP-Cronesecuzione manuale del singolo evento
wp cron test fallisceproblema nello spawning HTTP o WP-Cron disabilitatooutput del comando + loopback
WooCommerce accumula Scheduled Actionsrunner insufficiente, errori nella coda o problema WP-CronScheduled Actions + log
Email programmata assente ma evento eseguitopossibile problema email/SMTP invece del cronlog del task e sistema email
wp-cron.php genera consumo elevatotask pesanti, frequenti o backloglista eventi + log + profiling

Traffico basso: l’evento è dovuto, ma manca il trigger

È il limite più intuitivo di WP-Cron.

Supponiamo che un sito riceva l’ultima visita alle 23:30 e poi nessuna richiesta fino alle 07:15 del mattino. Se un’attività diventa dovuta alle 02:00, WP-Cron non dispone necessariamente di un processo autonomo che si sveglia a quell’ora.

L’evento può quindi restare in attesa finché una nuova richiesta non rimette in moto il sistema.

Questo non rende WP-Cron “rotto”: significa che la sua precisione temporale dipende dal meccanismo utilizzato per attivarlo.

Se il task è una pulizia periodica non urgente, il ritardo potrebbe non avere alcuna conseguenza. Se deve invece inviare una comunicazione, elaborare una scadenza commerciale o avviare un processo ecommerce in un momento preciso, la stessa caratteristica diventa un limite architetturale.

Traffico elevato: più visite non significano automaticamente un cron migliore

All’estremo opposto c’è il sito molto trafficato.

Qui il problema non è l’assenza di trigger, ma il fatto che WordPress deve continuamente verificare lo stato degli eventi mentre contemporaneamente il server gestisce richieste, PHP worker, query e altri processi.

È però sbagliato dedurne che ogni page view esegua nuovamente tutti i cron. WordPress usa meccanismi di locking per evitare che lo spawning venga ripetuto senza controllo e il processo viene avviato tramite richiesta separata. La funzione spawn_cron() mostra anche il controllo utilizzato per evitare esecuzioni concorrenti troppo ravvicinate.

Su un sito ad alto traffico il vantaggio del cron server è quindi soprattutto il controllo: puoi decidere quando far partire il runner e separare maggiormente la pianificazione dal flusso delle normali richieste web.

Loopback bloccati, errori PHP, firewall e limiti del server

WordPress può effettuare richieste verso se stesso. Queste richieste vengono chiamate loopback request e vengono utilizzate anche per avviare WP-Cron.

Se il server non riesce a raggiungere correttamente il proprio sito, lo scheduler può avere problemi anche se il frontend sembra funzionare normalmente.

Fra le cause possibili ci sono restrizioni HTTP, autenticazione, configurazioni DNS o server, firewall e codice che interferisce con la richiesta interna.

WordPress dispone di un controllo specifico in Site Health perché le loopback sono una dipendenza reale del meccanismo. La documentazione del test delle loopback request indica espressamente WP-Cron fra gli utilizzi di queste richieste.

Anche un errore PHP dentro la callback di un evento può interrompere l’esecuzione. In questo caso il runner può essere partito correttamente, ma il task che stavi aspettando è fallito dopo l’avvio.

Sono due problemi diversi e vanno trattati diversamente.

Eventi duplicati, task lenti e plugin che riempiono la coda

Un altro errore frequente è attribuire qualsiasi accumulo di eventi a WP-Cron.

Un plugin può registrare eventi troppo frequentemente, lasciare hook inutilizzati dopo la disattivazione oppure generare task che impiegano troppo tempo. Anche una programmazione errata può creare duplicati: la stessa documentazione WordPress avverte che chiamare ripetutamente wp_schedule_event() senza verificare l’esistenza dell’evento può registrare più copie dello stesso task.

In questi casi sostituire WP-Cron con il cron del server può rendere il trigger più regolare, ma non corregge il plugin che continua a creare lavoro inutile.

È una distinzione fondamentale: migliorare lo scheduler non significa automaticamente migliorare i task che gli stai affidando.

Come capire se WP-Cron funziona prima di modificare la configurazione

La diagnosi dovrebbe partire dal controllo meno invasivo e diventare progressivamente più tecnica.

L’obiettivo è rispondere a tre domande:

gli eventi esistono? → il runner riesce a partire? → la callback dell’evento riesce a terminare?

Controllare gli eventi programmati con Site Health

Il primo controllo può essere effettuato direttamente da WordPress attraverso Strumenti → Salute del sito.

WordPress verifica se gli eventi programmati stanno funzionando come previsto e può segnalare eventi in ritardo o falliti. Secondo la documentazione ufficiale del test Scheduled Events, un problema può indicare che WP-Cron non sta funzionando correttamente oppure che esistono eventi rimasti da vecchio codice.

Questo test è utile come segnale iniziale, ma non dice automaticamente quale componente sia responsabile.

Se compare un evento in ritardo, annota almeno:

nome dell’hook, plugin che presumibilmente lo registra, orario previsto e frequenza del problema.

È molto più utile di iniziare a modificare wp-config.php senza sapere quale evento stia realmente fallendo.

Verificare WP-Cron da terminale con wp cron test

Se hai accesso SSH e WP-CLI installato, il controllo successivo è molto più preciso:

wp cron test

Il comando verifica il sistema utilizzato per avviare WP-Cron.

In particolare controlla se DISABLE_WP_CRON è attivo, segnala la presenza di ALTERNATE_WP_CRON e tenta di effettuare lo spawning tramite HTTP.

Quando tutto funziona correttamente riceverai un messaggio di successo.

La documentazione ufficiale di wp cron test descrive esattamente questi controlli.

Qui c’è una distinzione diagnostica molto utile: wp cron test verifica il meccanismo di spawning, non dimostra che ogni singola callback registrata da plugin e temi funzioni correttamente.

Un test positivo e un singolo evento fallito orientano quindi l’indagine verso quell’evento o il codice che deve eseguire.

Elencare gli eventi con wp cron event list

Per vedere cosa WordPress ha realmente pianificato:

wp cron event list

L’output predefinito mostra informazioni come hook, prossima esecuzione e ricorrenza. La documentazione di wp cron event list riporta tutti i campi disponibili.

Questo comando è particolarmente utile quando:

un plugin sostiene di aver programmato un’attività ma non la trovi, un evento risulta continuamente scaduto oppure compaiono molti hook che non riesci a ricondurre ai componenti installati.

Prima di cancellare qualcosa, identifica sempre il proprietario dell’hook.

Eseguire gli eventi dovuti con wp cron event run --due-now

Puoi anche chiedere a WP-CLI di eseguire tutti gli eventi attualmente dovuti:

wp cron event run --due-now

La documentazione WP-CLI conferma l’uso di --due-now per eseguire gli eventi che dovrebbero partire in quel momento.

Questo test permette una diagnosi interessante.

Se:

wp cron test

fallisce, ma:

wp cron event run --due-now

riesce a processare correttamente gli eventi, hai un’indicazione forte che il problema può essere nel meccanismo automatico di spawning e non necessariamente nei task registrati.

Al contrario, se un evento fallisce anche quando lo esegui esplicitamente, devi guardare più da vicino la callback, gli errori PHP, le dipendenze del plugin e i log del server.

Usare WP Crontrol quando non hai accesso a WP-CLI

Se non hai accesso al terminale, WP Crontrol permette di visualizzare e gestire gli eventi WP-Cron dall’amministrazione WordPress.

Puoi vedere quando un evento deve essere eseguito, la sua ricorrenza, gli argomenti e altri dettagli utili per capire quale componente lo abbia creato.

Lo userei soprattutto come strumento diagnostico, non come invito a cancellare cron sconosciuti.

Un hook dal nome poco comprensibile può essere essenziale per un plugin, un sistema di backup o una funzione ecommerce. Rimuoverlo senza identificarlo può trasformare un semplice ritardo in un problema reale.

WP-Cron e WooCommerce: perché devi controllare anche Scheduled Actions

Su un sito WooCommerce la diagnosi richiede un livello in più.

Vedere WP-Cron funzionante non significa automaticamente che tutte le elaborazioni in background del negozio siano in ordine, perché WooCommerce e molte sue estensioni utilizzano Action Scheduler.

WP-Cron e Action Scheduler non sono la stessa cosa

WP-Cron è il sistema di scheduling integrato in WordPress.

Action Scheduler è invece una libreria progettata per gestire code di azioni in background. Permette di archiviare task, processarli e conservarne lo stato e i log.

La relazione fra i due crea spesso confusione.

La FAQ ufficiale di Action Scheduler spiega che, per impostazione predefinita, il runner viene avviato anche tramite WP-Cron, oltre che in determinate richieste amministrative. Action Scheduler non è però intrinsecamente dipendente da WP-Cron e può essere attivato con meccanismi differenti.

Quindi:

WP-Cron può essere il trigger → Action Scheduler gestisce la coda → le singole azioni eseguono il lavoro.

Sono tre livelli che possono fallire separatamente.

WP-Cron attiva Action Scheduler, che gestisce una coda di task WooCommerce Pending e Failed
Su WooCommerce, trigger WP-Cron, coda di Action Scheduler ed esecuzione del singolo task sono livelli distinti: un problema può verificarsi in ciascuno di essi.

Come WP-Cron attiva la coda di Action Scheduler

Immagina un negozio con cinquanta azioni in attesa.

WP-Cron non deve necessariamente eseguire direttamente la logica commerciale di tutte quelle azioni. Può avviare il runner di Action Scheduler, che prende in carico la coda e comincia a elaborarla.

Se WP-Cron non parte con sufficiente regolarità, il runner può ricevere meno occasioni di lavorare.

Se WP-Cron parte ma un’azione continua a fallire, invece, il problema può essere nella singola azione.

Se la coda cresce più rapidamente di quanto venga elaborata, puoi avere un problema di capacità, durata dei task o configurazione del runner.

Questa distinzione evita di trattare ogni backlog WooCommerce come “un problema di cron”.

Dove controllare azioni Pending e Failed in WooCommerce

WooCommerce mette a disposizione una schermata dedicata alle Scheduled Actions, dalla quale puoi controllare lo stato delle attività programmate.

La documentazione WooCommerce sulle Scheduled Actions mostra come consultare le azioni e distingue gli stati della coda.

Quando diagnostichi un negozio, presta particolare attenzione alle azioni:

Pending, perché potrebbero indicare un backlog se rimangono in attesa oltre il previsto;

Failed, perché il runner può averle effettivamente avviate ma il task può aver restituito un errore.

Controlla inoltre i log associati. Sapere che un’azione è fallita è utile; sapere perché è fallita è ciò che permette di correggere il problema.

Cosa succede quando si accumula un backlog di attività

Un backlog non indica automaticamente un bug.

Durante un’importazione, una sincronizzazione importante o un periodo di elevata attività è possibile che vengano generate molte azioni in poco tempo.

La domanda corretta è:

la coda viene progressivamente smaltita oppure continua a crescere?

Se diminuisce, il sistema sta processando il lavoro e potresti semplicemente osservare un picco.

Se resta ferma o cresce continuamente, devi capire se manca il trigger, se il runner non ha capacità sufficiente oppure se alcune azioni stanno fallendo.

Per un ecommerce questo controllo è più utile della semplice osservazione di wp-cron.php, perché ti mostra la conseguenza reale a livello applicativo.

Quando conviene lasciare WP-Cron attivo

WP-Cron non deve essere disabilitato per principio.

Su moltissimi siti il comportamento predefinito è perfettamente sufficiente e ha un vantaggio evidente: non richiede configurazione del sistema operativo o del pannello hosting.

ScenarioScelta generalmente più sensataMotivo
Blog con task non criticilasciare WP-Cronsemplicità e tolleranza ai piccoli ritardi
Sito con traffico regolare e nessun errore cronlasciare WP-Cronnon esiste un problema da correggere
Hosting che gestisce già il cron WordPressverificare la configurazione del providerpotresti avere già uno scheduler controllato
Sito con poco traffico ma task non urgentiWP-Cron può essere sufficienteil ritardo può essere irrilevante
Task che devono partire con maggiore puntualitàvalutare cron servertrigger indipendente dalle visite
Ecommerce con workload rilevantevalutare cron server + monitoraggio della codamaggiore prevedibilità operativa
Backlog o consumo cron anomalodiagnosticare primacambiare scheduler non corregge automaticamente task difettosi

Blog e siti in cui il timing non è critico

Se un’operazione può partire qualche minuto più tardi senza produrre conseguenze, il vantaggio di configurare un cron server può essere modesto.

Non ottimizzi un sistema soltanto perché esiste un’alternativa più tecnica.

La domanda utile è:

il comportamento corrente sta creando un problema misurabile o un rischio operativo concreto?

Se la risposta è no, lasciare WP-Cron attivo può essere la decisione più semplice e razionale.

Quando il problema non è WP-Cron ma un singolo task

Supponiamo che cento eventi funzionino e uno solo fallisca sempre.

In questo scenario sostituire globalmente WP-Cron sarebbe una risposta poco mirata.

Esegui il singolo hook, controlla il log PHP, verifica il plugin che lo registra e guarda cosa accade durante la callback.

Lo stesso principio vale per un’email programmata: se l’evento cron risulta completato ma il messaggio non arriva, l’indagine deve spostarsi sul sistema di invio email invece di continuare a modificare lo scheduler.

Quando conviene sostituire WP-Cron con un cron server reale

Il cron server diventa interessante quando hai bisogno di separare la pianificazione dalle visite al sito.

La documentazione WordPress sull’integrazione di WP-Cron con lo scheduler del sistema prevede esplicitamente questa configurazione per i casi in cui le attività devono essere attivate con maggiore regolarità.

Siti con poco traffico e attività che devono partire puntualmente

È uno dei casi più chiari.

Poco traffico non è un problema in sé. Diventa un problema quando un’attività importante deve partire in un intervallo prevedibile ma il trigger dipende da visite che potrebbero non arrivare.

Un cron server elimina questa dipendenza.

WooCommerce e processi business-critical

Su un ecommerce il valore della prevedibilità aumenta.

Ordini, sottoscrizioni, sincronizzazioni, webhook, email e plugin commerciali possono utilizzare processi pianificati o code in background.

Non significa che ogni negozio debba necessariamente disabilitare WP-Cron, ma più il business dipende dal processing in background, più ha senso controllare esplicitamente quando il runner viene avviato.

La decisione va poi completata monitorando Action Scheduler: un trigger perfetto non risolve una coda composta da task che falliscono.

Siti ad alto traffico e controllo del carico

Un server cron permette di stabilire un ritmo più prevedibile per il controllo degli eventi invece di lasciare il trigger integrato nel normale flusso delle richieste WordPress.

Il vantaggio reale non è una promessa generica di “sito più veloce”.

È il controllo operativo.

Puoi decidere la frequenza, osservare il comando eseguito, integrare il processo nei sistemi di monitoraggio del server e ragionare separatamente sul carico generato.

Hosting che gestisce già WP-Cron lato server

Prima di modificare wp-config.php, controlla sempre il tuo hosting.

Alcune piattaforme WordPress gestite sostituiscono o controllano WP-Cron direttamente attraverso la propria infrastruttura. Aggiungere un secondo scheduler senza verificare ciò che sta già facendo il provider può complicare una configurazione che funzionava correttamente.

Se usi un pannello tradizionale, la nostra guida su cos’è cPanel e come funziona ti aiuta a orientarti fra gli strumenti di gestione disponibili, compresi i cron job.

Come sostituire WP-Cron con un cron job reale senza interrompere i task

La sequenza è importante.

Non iniziare da DISABLE_WP_CRON.

Prima crea e verifica il nuovo trigger. Solo dopo disabilita lo spawning automatico gestito dalle richieste WordPress.

Configurare prima il nuovo trigger

Un modo semplice è chiedere al cron del server di effettuare periodicamente una richiesta a wp-cron.php.

La documentazione ufficiale WordPress propone proprio il richiamo del file attraverso uno scheduler di sistema.

Un esempio concettuale con wget può essere:

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

Sostituisci example.com con il dominio corretto e non copiare automaticamente l’intervallo di cinque minuti.

La frequenza deve derivare dalle attività realmente presenti sul sito.

Prima di salvare la configurazione in produzione, esegui manualmente il comando e controlla che la richiesta termini correttamente.

Disabilitare il trigger automatico con DISABLE_WP_CRON

Dopo aver verificato che lo scheduler esterno funzioni, puoi impedire a WordPress di avviare WP-Cron attraverso il normale traffico.

Nel file wp-config.php aggiungi:

define( 'DISABLE_WP_CRON', true );

La documentazione ufficiale di wp-config.php prevede questa costante per disabilitare il cron automatico.

Se vuoi approfondire dove si trova il file e quali precauzioni adottare prima di modificarlo, trovi qui la nostra guida completa a wp-config.php.

La cosa importante è capire cosa stai disabilitando: non stai cancellando gli eventi registrati nel database e non stai dicendo ai plugin di smettere di programmare attività. Stai modificando il modo con cui viene avviato il runner.

Per questo il cron server deve essere già operativo.

Richiamare wp-cron.php dallo scheduler del server

Il metodo HTTP è facile da implementare perché riproduce il normale ingresso attraverso wp-cron.php.

In un pannello hosting dovrai normalmente configurare:

frequenza, comando e utente/ambiente con cui viene eseguito.

La sintassi concreta dipende dall’infrastruttura.

Dopo aver creato il job, non limitarti a verificare che compaia nel pannello. Controlla che venga realmente eseguito e che gli eventi scaduti avanzino.

Un cron configurato correttamente nell’interfaccia ma incapace di raggiungere il sito non risolve nulla.

Eseguire gli eventi con WP-CLI e wp cron event run --due-now

Se disponi di SSH e WP-CLI, puoi evitare la richiesta HTTP ed eseguire direttamente gli eventi dovuti.

Il comando centrale è:

wp cron event run --due-now

Può essere utilizzato anche da uno scheduler del server, specificando correttamente la directory WordPress e il percorso dell’eseguibile WP-CLI.

Un esempio da adattare all’ambiente potrebbe essere:

*/5 * * * * cd /percorso/del/sito && /usr/local/bin/wp cron event run --due-now --quiet

/percorso/del/sito e /usr/local/bin/wp sono soltanto esempi: verifica i path reali del server.

Questo approccio ha un vantaggio operativo: il cron server non deve effettuare una richiesta web verso il sito, ma può richiamare direttamente WP-CLI.

Serve però un ambiente in cui l’utente che esegue il cron abbia i permessi corretti e WordPress possa essere caricato normalmente da CLI.

Quanto spesso eseguire il cron: perché non esiste un intervallo universale

“Ogni cinque minuti” è una configurazione frequente, non una regola WordPress.

Un sito che esegue soltanto manutenzioni poco urgenti può tollerare intervalli più ampi.

Un ecommerce con azioni che devono essere prese in carico rapidamente può richiedere un controllo più frequente.

Prima di scegliere l’intervallo verifica almeno:

la frequenza degli eventi più importanti, quanto dura mediamente il processing e cosa succede se due finestre di esecuzione si avvicinano.

Ridurre arbitrariamente l’intervallo non rende automaticamente il sistema più affidabile. Se ogni ciclo genera più lavoro di quanto il server possa completare, stai soltanto aumentando la pressione sulla stessa coda.

Come verificare che il nuovo cron stia funzionando

Una migrazione non è completata quando hai salvato il cron job.

È completata quando hai verificato che le attività reali continuano a essere eseguite dopo aver disabilitato il trigger automatico.

Controllare il prossimo evento e gli eventi scaduti

Esegui:

wp cron event list

Prendi nota di uno o più eventi in arrivo e controlla cosa succede dopo l’intervento dello scheduler esterno.

Gli eventi dovuti dovrebbero essere processati senza dipendere dall’arrivo di una nuova visita al frontend.

Verificare nuovamente con WP-CLI

Qui serve una precisazione.

Se hai impostato:

define( 'DISABLE_WP_CRON', true );

il comando:

wp cron test

non deve più essere interpretato come test del nuovo cron server: quel comando verifica lo spawning WP-Cron standard e segnala correttamente che è stato disabilitato.

Dopo la migrazione devi quindi testare il meccanismo che hai realmente configurato.

Se usi WP-CLI nel cron server, esegui manualmente lo stesso comando.

Se usi wget, esegui manualmente la stessa richiesta.

Poi controlla la lista degli eventi e gli effetti prodotti.

Questo evita un errore diagnostico abbastanza comune: disabilitare volontariamente WP-Cron e poi considerare un errore il fatto che wp cron test rilevi DISABLE_WP_CRON.

Controllare Scheduled Actions su WooCommerce

Su WooCommerce torna alla schermata Scheduled Actions.

Controlla se:

le Pending vengono smaltite, le Failed aumentano e il backlog diminuisce o continua a crescere.

Se il cron server parte regolarmente ma le Failed continuano ad accumularsi, il nuovo scheduler sta probabilmente facendo il proprio lavoro. Il problema è più avanti nella catena.

Verificare log ed effetti reali del task, non soltanto il comando cron

La verifica migliore rimane sempre quella funzionale.

Se il task deve pubblicare un contenuto, controlla che venga pubblicato.

Se deve sincronizzare dati, controlla la sincronizzazione.

Se deve produrre un backup, verifica che il backup venga creato e sia utilizzabile.

Se deve processare una coda WooCommerce, controlla lo stato delle azioni.

Un exit code apparentemente corretto dello scheduler non dimostra da solo che il risultato applicativo atteso sia stato ottenuto.

Quando serve approfondire errori PHP o comportamenti anomali, puoi utilizzare anche la nostra guida al debug di WordPress.

Errori da evitare quando configuri WP-Cron

I problemi più seri nascono spesso da una modifica formalmente corretta applicata nel momento sbagliato.

Impostare DISABLE_WP_CRON senza un’alternativa

È l’errore principale.

Disabilitare il trigger standard senza predisporre un altro runner significa lasciare gli eventi registrati senza un meccanismo affidabile che li processi.

La sequenza corretta è:

configura → testa → disabilita lo spawning standard → verifica nuovamente.

Lasciare due scheduler che fanno inutilmente lo stesso lavoro

Durante la migrazione può esserci una breve sovrapposizione mentre verifichi il cron esterno.

Non trasformarla però nella configurazione permanente per “essere più sicuro”.

Il locking di WordPress limita le esecuzioni concorrenti, ma mantenere intenzionalmente più meccanismi di trigger senza necessità rende più difficile capire da dove arriva il carico e quale sistema stia realmente eseguendo il lavoro.

Meglio una configurazione chiara e monitorabile.

Usare una frequenza aggressiva senza considerare durata e sovrapposizione dei task

Un cron ogni minuto non è automaticamente migliore di uno ogni cinque minuti.

Se un gruppo di task impiega diversi minuti, aumentare la frequenza può accentuare il carico senza aumentare la quantità di lavoro completato.

Prima misura la coda e individua i processi lenti.

Poi scegli la frequenza.

Confondere WP-Cron con Action Scheduler

WP-Cron può avviare Action Scheduler, ma i due sistemi non coincidono.

Se un’azione WooCommerce è Failed, devi leggerne l’errore.

Se migliaia di azioni rimangono Pending, devi capire se il runner viene attivato e con quale capacità.

Se WP-Cron non parte, devi risolvere o sostituire il trigger.

Trattare tutto come un singolo “problema cron” rende la diagnosi più lunga.

Eliminare eventi sconosciuti senza identificare plugin e callback

Un hook apparentemente inutile potrebbe essere parte di un plugin ancora attivo.

Prima di rimuoverlo controlla chi lo registra e cosa dovrebbe eseguire.

Gli eventi realmente orfani esistono, ma evento che non riconosci ≠ evento inutile.

Usare ALTERNATE_WP_CRON come soluzione universale

WordPress supporta anche:

define( 'ALTERNATE_WP_CRON', true );

ma non è la prima modifica da applicare a ogni cron in ritardo.

La documentazione di WordPress descrive ALTERNATE_WP_CRON come un metodo alternativo basato su redirect e specifica che queste costanti non dovrebbero essere impostate senza una ragione concreta.

Se il tuo obiettivo è ottenere una pianificazione indipendente dal traffico, un cron server reale è concettualmente una soluzione diversa e più controllabile.

Conclusione

WP-Cron funziona bene quando accetti il suo modello: gli eventi vengono programmati da WordPress, ma il loro avvio dipende dal meccanismo con cui il sito mette in moto lo scheduler.

Per un normale sito con traffico regolare, task non critici e nessun segnale di errore, non c’è un motivo tecnico per disabilitarlo soltanto perché esiste un cron server.

La scelta cambia quando il timing diventa importante, il traffico è troppo scarso per fornire trigger prevedibili, vuoi controllare meglio il workload oppure WooCommerce e altri sistemi in background fanno parte di processi business-critical.

In quel caso la migrazione corretta non è “aggiungi DISABLE_WP_CRON”.

È:

diagnostica il problema → verifica gli eventi → prepara il cron server → testa il nuovo runner → disabilita lo spawning automatico → verifica gli effetti reali.

E se gli eventi continuano a fallire anche con un trigger affidabile, hai ottenuto un’informazione ancora più importante: il problema probabilmente non è più WP-Cron, ma il task che stai chiedendo al cron di eseguire.

Se stai gestendo un sito in produzione e il problema coinvolge task bloccati, WooCommerce, errori PHP o configurazione server, un intervento di assistenza WordPress può essere utile soprattutto quando serve distinguere rapidamente fra problema applicativo e infrastrutturale.