WP-Cron (wp-cron.php): disattivarlo e impostare il cron di sistema | Ottimizzazione delle prestazioni di WordPress

In WordPress i cron job sono una funzione che esegue automaticamente le attività pianificate per un orario o una data precisi. Girano tramite il file wp-cron.php, e WordPress richiama questo file a ogni caricamento di pagina per elaborare le attività pianificate. Questo approccio è semplice, ma sui siti molto trafficati può peggiorare le prestazioni.
Ⅰ. Come gira WP-Cron e i suoi problemi di prestazioni
Invece del tradizionale sistema cron dei server Linux, WordPress offre una propria funzione cron, WP-Cron. WP-Cron funziona tramite il file wp-cron.php: ⓐ ogni volta che un utente visita il sito, controlla se ci sono attività pianificate e le esegue, e ⓑ plugin come Rank Math e WP Rocket eseguono le proprie attività periodiche pianificate.
Al contrario, sui siti molto trafficati wp-cron.php può essere richiamato troppo spesso, sovraccaricando il server. Soprattutto quando molti utenti si collegano contemporaneamente, partono cron job duplicati, il che può portare a maggiore uso della CPU, risposte più lente, caricamento delle pagine più lento e problemi simili.
Questi limiti strutturali di WP-Cron possono ridurre le prestazioni di WordPress, e soprattutto su siti che richiedono prestazioni elevate, negozi online e portali di notizie possono causare gravi colli di bottiglia.
🔄 Come funziona ed è strutturato WP-Cron
Ⅱ. Ottimizzazione delle prestazioni di WordPress
Ci sono molti modi per ottimizzare le prestazioni di WordPress. Dopo aver ottimizzato cache, front-end e database, puoi migliorare ancora tramite le impostazioni di WP-Cron.
A ogni caricamento di pagina di WordPress si controllano gli eventi pianificati, e a causa delle attività periodiche dei plugin bisogna usare in modo più efficiente l'inefficiente WP-Cron.
1️⃣ Testare WP-Cron
Controllando i cron job con WP-CLI vedi gli eventi cron attivi in esecuzione. Si vedono plugin come Rank Math e WP Rocket eseguire attività pianificate ogni giorno o ogni pochi minuti.

2️⃣ Come configurare WP-Cron
WP-Cron è uno scheduler virtuale che gestisce le attività pianificate di WordPress; wp-cron.php si esegue quando gli utenti visitano il sito. Ma l'esecuzione basata sul traffico è inaffidabile e le chiamate eccessive possono caricare il server, quindi di solito si affianca un cron di sistema.
Se serve, l'approccio consigliato è impostare DISABLE_WP_CRON in wp-config.php per spegnere WP-Cron ed eseguirlo regolarmente con un cron di Linux.
|
Voce |
Disattivare WP-Cron + eseguire solo il cron di sistema |
|---|---|
|
Impostazioni |
Spegnere WP-Cron ed eseguire wp-cron.php dal cron di sistema |
|
Pro |
Nessuna esecuzione duplicata, esecuzione precisa a orario e basso carico sul server |
|
Contro |
Alcune funzioni dei plugin possono fermarsi, e un errore di configurazione rischia di far saltare attività |
|
Consigliato · Situazione |
Adatto a siti con molto traffico e molte attività pianificate |
Il metodo ① però ha uno svantaggio: disattiva la funzione di preload dei plugin di cache come WP Rocket, che ogni minuto costruisce la cache in anticipo prima che arrivino i visitatori.
⚙️ Modificare il file wp-config.php
Puoi impostarlo disattivando WP_CRON.
# Disattiva WP_CRON
define( 'DISABLE_WP_CRON', true );Mentre WP-Cron è in esecuzione, WP_CRON_LOCK_TIMEOUT fa da [blocco a tempo] che impedisce altri tentativi di esecuzione.
# 5 minuti = 300, ogni 60 minuti = 3600
define('WP_CRON_LOCK_TIMEOUT', 300);Per questi motivi, invece di disattivare solo WP-Cron nel file wp-config.php, consiglio di disattivarlo e poi aggiungere un job di System Cron , e anche il server che gestisco ora è impostato così.
⚙️ Attivare il cron di sistema su un server Linux [base]
Puoi attivarlo per dominio.
# Esegui ogni 5 minuti
*/5 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
# Esegui ogni 30 minuti
*/30 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
# Esegui ogni ora
0 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
# Esegui una volta al giorno
0 3 * * * curl -s https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1Le quattro righe sopra sono esempi per intervallo da aggiungere al crontab; a ogni orario impostato curl richiama l'URL [wp-cron.php], quindi le attività pianificate girano anche senza visitatori.
# Se il server è locale
*/5 * * * * php /path/to/wordpress/wp-cron.php > /dev/null 2>&1
# Esegui ogni 30 minuti
*/30 * * * * php /path/to/wordpress/wp-cron.php > /dev/null 2>&1
# Esegui ogni ora
0 * * * * php /path/to/wordpress/wp-cron.php > /dev/null 2>&1
# Esegui una volta al giorno
0 3 * * * php /path/to/wordpress/wp-cron.php > /dev/null 2>&1Se WP-CLI è installato, puoi impostare una sola riga per l'intervallo che vuoi. ▼
# Esegui ogni 5 minuti
*/5 * * * * cd /sites/example.com/files/ && flock -n ~/.wp_cron.lock /usr/local/bin/wp cron event run --due-now --quiet
# Esegui ogni 30 minuti
*/30 * * * * cd /sites/example.com/files/ && flock -n ~/.wp_cron.lock /usr/local/bin/wp cron event run --due-now --quiet
# Esegui ogni ora
0 * * * * cd /sites/example.com/files/ && flock -n ~/.wp_cron.lock /usr/local/bin/wp cron event run --due-now --quiet
# Esegui una volta al giorno
0 3 * * * cd /sites/example.com/files/ && flock -n ~/.wp_cron.lock /usr/local/bin/wp cron event run --due-now --quietCon questa impostazione WP-CLI esegue nel server solo le attività pianificate in scadenza, con l'opzione [--due-now], e [flock -n] salta una nuova esecuzione se la precedente non è finita.
⚙️ WP-CLI e cron di sistema ogni minuto, più la prevenzione dei cron job duplicati
Di default WP_CRON ignora (salta) le attività quando c'è molto lavoro e le riesegue più tardi. Spegni il WP-Cron predefinito e fai mantenere alle attività pianificate un blocco di 5 minuti, così il cron di sistema e WP-Cron non girano insieme.
define('DISABLE_WP_CRON', true); // spegne l'esecuzione automatica di WP-Cron
define('WP_CRON_LOCK_TIMEOUT', 300); // nessuna attesa → saltato; mantiene un blocco di 5 minuti mentre gira un'attività pianificata
/* That's all, stop editing! Happy publishing. */Aggiungi l'opzione flock -n al cron di sistema in modo che, lato cron di sistema, un'esecuzione che trova il blocco termini subito.
# impostazione wp cron: flock -n → nessuna attesa → esce subito
*/1 * * * * cd /sites/example.com/files/ && flock -n ~/.wp_cron.lock /usr/local/bin/wp cron event run --due-now --quietIl risultato di questa combinazione di impostazioni è:
- L'esecuzione automatica interna di WordPress è spenta → le attività pianificate girano indipendentemente dal numero di visitatori
- Il cron di sistema prova a eseguire ogni minuto → le attività pianificate girano se ce ne sono
- Una volta bloccato, niente riparte per 5 minuti → previene le esecuzioni duplicate (in pratica, con flock -n, WP_CRON_LOCK_TIMEOUT non serve davvero.)
Con la prevenzione delle esecuzioni duplicate, il flusso reale è:
- 08:00 → il cron di sistema richiama wp-cron.php
- L'attività pianificata A gira → blocco di 5 minuti impostato
- 08:01 → il cron di sistema richiama di nuovo
- L'attività A è bloccata → non gira
- 08:02–08:04 → uguale
- 08:05 → blocco rilasciato → la prossima attività pianificata gira, se c'è
Invece che WordPress esegua le attività in automatico, è il sistema a farsene carico. E WP_CRON_LOCK_TIMEOUT funziona come protezione di riserva contro le esecuzioni duplicate.
|
Voce |
WP_CRON_LOCK_TIMEOUT |
flock -n |
|---|---|---|
|
Tipo di blocco |
Dentro WordPress |
Livello di sistema |
|
Posizione del blocco |
Basato sul database: doing_cron in wp_options |
Basato su file di sistema: ~/.wp_cron.lock |
|
Attende? |
❌ Non attende → salta |
❌ Non attende → esce subito |
|
Prevenzione delle esecuzioni duplicate |
✅ Previene le esecuzioni duplicate |
✅ Previene le esecuzioni duplicate |
Alla fine puoi controllare con un comando WP-CLI che il cron funzioni ancora come prima.
wp cron event list+-------------------------------------------+---------------------+-----------------------+---------------+
| hook | next_run_gmt | next_run_relative | recurrence |
+-------------------------------------------+---------------------+-----------------------+---------------+
| rocket_saas_pending_jobs | 2026-10-17 12:00:57 | now | 1 minute |
| action_scheduler_run_queue | 2026-10-17 12:00:57 | now | 1 minute |
| action_scheduler_run_queue_rucss | 2026-10-17 12:00:58 | now | 1 minute |
| rocket_saas_on_submit_jobs | 2026-10-17 12:00:58 | now | 1 minute |
| rocket_preload_process_pending | 2026-10-17 12:00:59 | now | 1 minute |
| rocket_purge_time_event | 2026-10-17 12:16:59 | 15 minutes 8 seconds | 1 hour |
| wp_privacy_delete_old_export_files | 2026-10-17 12:28:46 | 26 minutes 55 seconds | 1 hour |
| wp_update_user_counts | 2026-10-17 20:15:52 | 8 hours 14 minutes | 12 hours |
| rocket_preload_revert_old_failed_rows | 2026-10-17 20:17:59 | 8 hours 16 minutes | 12 hours |
| wp_version_check | 2026-10-17 20:28:34 | 8 hours 26 minutes | 12 hours |
| wp_update_plugins | 2026-10-17 20:58:34 | 8 hours 56 minutes | 12 hours |
| wp_update_themes | 2026-10-17 21:28:34 | 9 hours 26 minutes | 12 hours |
| recovery_mode_clean_expired_keys | 2026-10-18 07:28:46 | 19 hours 26 minutes | 1 day |
| wp_privacy_personal_data_cleanup_requests | 2026-10-18 07:28:46 | 19 hours 26 minutes | 1 day |
| wp_scheduled_delete | 2026-10-18 08:15:52 | 20 hours 14 minutes | 1 day |
| delete_expired_transients | 2026-10-18 08:15:52 | 20 hours 14 minutes | 1 day |
| wp_scheduled_auto_draft_delete | 2026-10-18 08:15:54 | 20 hours 14 minutes | 1 day |
| wp_delete_temp_updater_backups | 2026-10-18 08:16:17 | 20 hours 14 minutes | 1 week |
| rocket_update_dynamic_lists | 2026-10-18 08:16:57 | 20 hours 15 minutes | 1 week |
| rocket_saas_clean_rows_time_event | 2026-10-18 08:16:57 | 20 hours 15 minutes | 1 week |
| rocket_performance_hints_cleanup | 2026-10-18 08:16:58 | 20 hours 15 minutes | 1 day |
| rocket_preload_clean_rows_time_event | 2026-10-18 08:26:57 | 20 hours 25 minutes | 1 week |
| rocket_database_optimization_time_event | 2026-10-18 09:34:25 | 21 hours 32 minutes | 1 day |
| wp_site_health_scheduled_check | 2026-10-19 07:28:46 | 1 day 19 hours | 1 week |
| rocket_remove_saas_failed_jobs | 2026-10-19 08:16:58 | 1 day 20 hours | 3 days |
+-------------------------------------------+---------------------+-----------------------+---------------+L'output mostra i nomi degli hook registrati, il prossimo orario di esecuzione e la ricorrenza, e le attività con [now] nella colonna [next_run_relative] vengono elaborate subito alla prossima esecuzione del cron.
Ⅲ. Quando le attività pianificate di WP-Cron non partono
È facile pensare che un'attività parta da sola all'orario previsto, ma WP-Cron controlla il lavoro da fare quando arriva una richiesta di pagina, non a un orario fisso. Un'attività programmata per le 14 parte alla prima richiesta delle 17, se prima non ne arrivano.
Quando le esecuzioni restano indietro, gli articoli programmati compaiono come [Pianificazione mancata] nell'elenco degli articoli. In [Miglioramenti consigliati] nella scheda Stato di [Strumenti › Salute del sito] compare [Un evento pianificato non è riuscito]. Anche le attività registrate dai plugin, come il precaricamento della cache, restano in attesa per lo stesso motivo.
Le attività pianificate girano in [wp-cron.php] dopo una richiesta di pagina, un controllo del lavoro da fare e una richiesta di loopback; se uno di questi anelli si rompe, non partono nemmeno dopo l'orario.
1️⃣ Quando non ci sono visite o risponde la cache delle pagine
WP-Cron controlla il lavoro da fare solo nelle richieste che fanno girare WordPress, quindi nelle ore senza visite le attività scadute si accumulano. Anche con le visite il risultato è lo stesso se risponde un file di cache delle pagine, perché WordPress non gira.
Su un WordPress con la cache delle pagine di WP Rocket attiva, aprire la home in cache non ha registrato chiamate a [wp-cron.php]. Aprendo un URL non in cache è stata registrata una chiamata nello stesso secondo, e le cinque attività in ritardo sono partite.
Puoi controllare le attività in ritardo filtrando l'elenco WP-CLI sulle righe in cui [next_run_relative] è [now].
wp cron event list --next_run_relative=now --fields=hook,next_run_gmt,next_run_relative+----------------------------------+---------------------+-------------------+
| hook | next_run_gmt | next_run_relative |
+----------------------------------+---------------------+-------------------+
| rocket_saas_pending_jobs | 2026-10-17 14:49:57 | now |
| action_scheduler_run_queue | 2026-10-17 14:49:57 | now |
| action_scheduler_run_queue_rucss | 2026-10-17 14:49:58 | now |
| rocket_saas_on_submit_jobs | 2026-10-17 14:49:58 | now |
| rocket_preload_process_pending | 2026-10-17 14:49:59 | now |
+----------------------------------+---------------------+-------------------+[now] significa che l'orario previsto è già passato. Anche questo comando di elenco carica WordPress, quindi se ci sono attività in ritardo richiama [wp-cron.php] appena finisce. Eseguendo subito di nuovo lo stesso comando, le attività appena viste sono sparite dall'elenco.
Per smaltire le attività in ritardo prima di correggere la causa, esegui subito con WP-CLI solo quelle scadute.
wp cron event run --due-nowExecuted the cron event 'rocket_saas_pending_jobs' in 0.005s.
Executed the cron event 'action_scheduler_run_queue' in 0.006s.
Executed the cron event 'action_scheduler_run_queue_rucss' in 0.006s.
Executed the cron event 'rocket_saas_on_submit_jobs' in 0.005s.
Executed the cron event 'rocket_preload_process_pending' in 0.007s.
Success: Executed a total of 5 cron events.Questo comando esegue le attività nel server senza richiesta HTTP; per elaborarle a intervalli fissi indipendentemente dalle visite, registra lo stesso comando nel cron di sistema.
2️⃣ Quando è attivo solo DISABLE_WP_CRON e non c'è un cron di sistema
Con [DISABLE_WP_CRON] su true, WP-Cron non controlla il lavoro da fare nemmeno quando arrivano richieste di pagina. Anche la documentazione ufficiale indica di registrare prima nel pianificatore di sistema e poi aggiungere questa costante; aggiungendo solo la costante, senza registrazione, non resta nulla che esegua le attività pianificate.
Con la costante attiva, un articolo programmato poco più di un minuto dopo è rimasto [Programmato] dopo l'orario, e la colonna data dell'elenco articoli mostrava [Pianificazione mancata]. Nel frattempo non è stata registrata nessuna chiamata a [wp-cron.php].
Puoi controllare se la costante è attiva con [wp cron test].
wp cron testError: The DISABLE_WP_CRON constant is set to true. WP-Cron spawning is disabled.Se compare questo errore, controlla se il cron di sistema ha una riga che richiama [wp-cron.php] o esegue [wp cron event run]. Se il crontab dell'account del sito è vuoto, si vede quanto segue.
crontab -lno crontab for exampleSe quella riga non c'è, registra un cron di sistema; se il tuo ambiente non lo permette, elimina la riga [DISABLE_WP_CRON] e usa di nuovo WP-Cron.
3️⃣ Quando la richiesta di loopback del server è bloccata
Quando c'è lavoro, WP-Cron fa inviare al server una richiesta a [wp-cron.php] sul proprio indirizzo per eseguire le attività; è la richiesta di loopback. Se una regola di sicurezza blocca [wp-cron.php], la richiesta di loopback torna con un 403 e le attività non partono.
Su un server con Nginx e Apache, limitare [wp-cron.php] all'apertura solo da 127.0.0.1 ha bloccato la richiesta di loopback con un 403. Questo perché la richiesta che il server invia al proprio dominio entra dall'IP pubblico, e [wp cron test] restituisce lo stesso codice di stato.
wp cron testError: WP-Cron spawn returned HTTP status code: 403 ForbiddenCon le attività in ritardo di oltre cinque minuti, aprendo la schermata [Salute del sito] sono comparsi insieme, in [Miglioramenti consigliati], un avviso di loopback e un evento pianificato non riuscito.

Rimossa la regola, [wp cron test] è tornato a riuscire. Se devi mantenere la regola, esegui le attività con WP-CLI dal cron di sistema. Un'esecuzione WP-CLI non passa da una richiesta HTTP, quindi le attività in ritardo sono state elaborate anche con la stessa regola.
🔢 FAQ & contenuti consigliati





ℹ️ Informativa sull'affiliazione
I contenuti di questo sito includono link di affiliazione. Se un visitatore acquista un prodotto o un servizio tramite uno di questi link, il sito riceve una commissione dal venditore. In questo processo l'importo pagato dall'acquirente (durante le promozioni l'importo scende↓) non aumenta. Prezzi, sconti e disponibilità indicati si riferiscono al momento della stesura e possono differire da quelli reali: prima di acquistare verifica sempre presso il venditore. I prodotti vengono scelti e valutati secondo criteri propri, e le commissioni non influiscono sull'ordine di presentazione né sul contenuto delle valutazioni.