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

Informativa sull'affiliazione v3.1
Informativa sull'affiliazione v3.2 (solo mobile)

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

WP-Cron
WP-Cron(wp-cron.php)
ⓐ Controlla le attività pianificate a ogni visita
ⓑ Attività ricorrenti dei plugin(Rank Math, WP Rocket e altri)
Problemi di prestazioni di WP-Cron
Dipendenza dal traffico
Sovraccarico del server da chiamate eccessive
Esecuzioni duplicate e colli di bottiglia
Come gira WP-Cron
Scheduler virtuale basato sul traffico
Come vengono eseguite le attività pianificate
Gira alle visite, non a orario

Ⅱ. Ottimizzazione delle prestazioni di WordPress

  • ↳ Ottimizzare con le impostazioni di WP-Cron

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.

WordPress
Ottimizzazione delle prestazioni
Cache del browser
Cache delle pagine
Plugin di cache(WP Rocket, W3 Total Cache e altri)
Ottimizzazione del front-end
Plugin correlati(Autoptimize, ShortPixel ecc.)
Pulizia del database
Rimuovere revisioni, spam e tabelle temporanee
Plugin di ottimizzazione del database(WP-Optimize e altri)
Impostazioni di WP-Cron
WP-Cron(wp-cron.php)
ⓐ Controlla le attività pianificate a ogni visita
ⓑ Attività ricorrenti dei plugin(Rank Math, WP Rocket ecc.)
Problemi di prestazioni di WP-Cron
Dipendenza dal traffico
Sovraccarico del server da chiamate eccessive
Esecuzioni duplicate e colli di bottiglia
Come gira WP-Cron
Scheduler virtuale basato sul traffico
Come vengono eseguite le attività pianificate
Gira alle visite, non a orario

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.

WP CLI- controllare gli eventi cron pianificati con il comando wp-cron event list_

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>&1

Le 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>&1

Se 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 --quiet

Con 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 --quiet

Il 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 è:

  1. 08:00 → il cron di sistema richiama wp-cron.php
    • L'attività pianificata A gira → blocco di 5 minuti impostato
  2. 08:01 → il cron di sistema richiama di nuovo
    • L'attività A è bloccata → non gira
  3. 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.

🧭 Come un'attività pianificata arriva a girare
Diagramma esplicativo
🔍 Situazione
🌐
Richiesta di pagina
Una visita che fa girare WordPress
✕ Non gira
→
🔎
Controllo del lavoro da fare
Se c'è un'attività scaduta
✕ Non controlla
→
🔁
Richiesta di loopback
Server → il proprio [wp-cron.php]
✕ 403
→
⚙️
Eseguire l'attività
[wp-cron.php] elabora le attività pianificate
✓ Gira
Quando arriva una richiesta che fa girare WordPress, si controllano le attività scadute e il server richiama [wp-cron.php] al proprio indirizzo per elaborarle.
Se non ci sono visite, o la risposta arriva da un file di cache delle pagine, WordPress non gira, quindi le attività scadute aspettano la richiesta successiva.
Se [DISABLE_WP_CRON] è true, niente controlla il lavoro da fare anche quando arrivano richieste, e senza cron di sistema non resta nulla che esegua le attività.
Se una regola di sicurezza blocca [wp-cron.php], la richiesta di loopback torna con un 403 e le attività non partono.

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-now
Executed 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 test
Error: 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 -l
no crontab for example

Se 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 test
Error: WP-Cron spawn returned HTTP status code: 403 Forbidden

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

Scheda Stato di Salute del sito con un evento pianificato non riuscito e un avviso sulla richiesta di loopback dopo che il loopback di WP-Cron è stato bloccato con un 403

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

I controlli degli aggiornamenti [wp_version_check], [wp_update_plugins] e [wp_update_themes] giravano ogni 12 ore sul sito di test. Lo svuotamento del cestino ([wp_scheduled_delete]) e l'eliminazione dei transient scaduti erano pianificati ogni giorno, e il controllo di Salute del sito ogni settimana. Lo svuotamento del cestino elimina definitivamente articoli e commenti che sono nel cestino da più di 30 giorni (predefinito), e se WP-Cron non gira, nemmeno queste attività partono all'orario previsto.

È l'hook con cui Action Scheduler, una libreria di code di lavoro inclusa nei plugin, elabora i job in attesa; sul sito di test era pianificato ogni minuto. Le FAQ ufficiali di Action Scheduler dicono che la coda parte di default da WP-Cron e alla fine delle richieste dell'amministrazione (hook [shutdown]). Sul sito di test con solo [DISABLE_WP_CRON] attivo e senza cron di sistema, anche questa riga è rimasta su [now] insieme all'articolo programmato.

Secondo la documentazione ufficiale c'è un'alternativa: impostare la costante [ALTERNATE_WP_CRON] su true in [wp-config.php]. Quando ci sono attività, reindirizza la richiesta GET del visitatore allo stesso URL con un valore [doing_wp_cron] aggiunto. [wp-cron.php] gira allora dentro la richiesta originale, senza passare dalla richiesta di loopback. La stessa documentazione avverte che non è il comportamento predefinito di WordPress e comporta rischi, quindi se puoi registrare un cron di sistema usa prima quello.

🧭 Contenuti consigliati: attività pianificate di WordPress 6 articoli · 4 fonti
🗂️ Attività pianificate di WordPress
📄 WP-Cron(wp-cron.php) 📄 Impostazioni di base di wp-config.php ⏳ Salute del sito di WP
📋 Configurazione di crontab 📄 Comando nice di Linux
📋 WP CLI: installazione e configurazione 📄 Trovare i pattern sincronizzati: WP-CLI
📡 About Cron 📡 Eventi di WP Cron 📡 Capire la pianificazione del cron 📡 Collegare WP-Cron al pianificatore di sistema
Nessun risultato trovato.

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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Dimostra di essere umano: 4   +   6   =