Come risolvere il problema del WP-Cron che non funziona in WordPress
Il WP-Cron è il sistema di pianificazione delle attività di WordPress. Gestisce la pubblicazione degli articoli programmati, i backup automatici, l’invio di email e molto altro. Quando smette di funzionare, gli articoli programmati non vengono pubblicati, i backup saltano e i plugin che dipendono dalla pianificazione si bloccano. In questa guida ti spiego perché succede e come risolverlo.
Come funziona WP-Cron
A differenza del cron di sistema che viene eseguito a intervalli regolari dal sistema operativo, il WP-Cron funziona in modo diverso: viene attivato dalle visite al sito. Ogni volta che un visitatore carica una pagina, WordPress controlla se ci sono attività pianificate in scadenza e le esegue. Questo significa che se nessuno visita il sito per un’ora, nessuna attività cron viene eseguita in quell’ora.
Questo meccanismo è un compromesso progettuale: WordPress funziona su qualsiasi hosting, anche quelli che non permettono di configurare cron job di sistema. Ma ha un difetto fondamentale: dipende dal traffico.
Perché WP-Cron smette di funzionare
Le cause più comuni sono:
- Poco traffico: se il sito riceve poche visite, le attività cron vengono eseguite in ritardo o non vengono eseguite affatto.
- Caching aggressivo: i plugin di caching o la cache del server (Varnish, Nginx FastCGI Cache) servono pagine statiche senza eseguire PHP. Se PHP non viene eseguito, WP-Cron non si attiva.
- ALTERNATE_WP_CRON attivo: questa costante è pensata per risolvere problemi di cron ma a volte li peggiora, specialmente con configurazioni di caching.
- Plugin che bloccano le richieste loopback: WP-Cron usa una richiesta HTTP a se stesso per eseguire le attività in background. Plugin di sicurezza o firewall possono bloccare queste richieste.
- SSL mal configurato: se il sito ha problemi con il certificato SSL, la richiesta loopback fallisce silenziosamente.
Verificare se WP-Cron funziona
Per verificare lo stato del WP-Cron, installa il plugin WP Crontrol. Questo plugin mostra tutte le attività cron pianificate, quando sono state eseguite l’ultima volta e quando è prevista la prossima esecuzione. Se vedi attività con orari di esecuzione nel passato, significa che il cron non sta funzionando.
Puoi anche testare manualmente visitando:
https://tuodominio.com/wp-cron.php
Se la pagina si carica senza errori (pagina bianca), il cron sta funzionando. Se ricevi un errore, c’è un problema di connessione.
Soluzione 1: usare il cron di sistema
La soluzione più affidabile è disabilitare il WP-Cron basato sulle visite e sostituirlo con un cron job di sistema. Aggiungi questa riga in wp-config.php:
define('DISABLE_WP_CRON', true);
Poi configura un cron job di sistema per chiamare wp-cron.php ogni 5 minuti. Da SSH:
crontab -e
Aggiungi:
*/5 * * * * wget -q -O - https://tuodominio.com/wp-cron.php > /dev/null 2>&1
Oppure, se hai WP-CLI installato (metodo più efficiente):
*/5 * * * * cd /percorso/wordpress && wp cron event run --due-now > /dev/null 2>&1
Il metodo WP-CLI è migliore perché non richiede una richiesta HTTP e funziona anche se il sito ha problemi di SSL o firewall.
Soluzione 2: risolvere il problema della richiesta loopback
Se il WP-Cron non funziona perché la richiesta loopback viene bloccata, verifica con questo test nella bacheca WordPress: vai in Strumenti → Salute del sito. Se vedi l’avviso “Le richieste loopback al sito non funzionano come previsto”, il problema è confermato.
Le cause comuni della richiesta loopback bloccata:
- Plugin di sicurezza: alcuni plugin bloccano le richieste provenienti dallo stesso server. Controlla le impostazioni del firewall del tuo plugin di sicurezza.
- Protezione HTTP Auth: se il sito è protetto con autenticazione HTTP (username e password del server), WP-Cron non può autenticarsi.
- Firewall del server: regole iptables o il modulo mod_security possono bloccare le richieste locali.
- DNS: se il server non riesce a risolvere il proprio dominio, la richiesta loopback fallisce. Aggiungi una riga nel file /etc/hosts: 127.0.0.1 tuodominio.com
Soluzione 3: gestire i conflitti con la cache
Se usi un plugin di caching o una cache server-side, assicurati che wp-cron.php non venga mai servito dalla cache. Per Nginx, aggiungi un’eccezione:
location = /wp-cron.php {
fastcgi_pass unix:/run/php/php-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
Per i plugin di caching, verifica che wp-cron.php sia nella lista delle esclusioni dalla cache.
Monitorare il cron con WP Crontrol
Il plugin WP Crontrol è essenziale per gestire il WP-Cron. Permette di:
- Vedere tutte le attività pianificate e i loro intervalli.
- Eseguire manualmente un’attività cron per testarla.
- Eliminare attività orfane lasciate da plugin disinstallati.
- Aggiungere nuove pianificazioni personalizzate.
Controlla periodicamente la lista delle attività cron. Plugin disinstallati possono lasciare attività orfane che consumano risorse inutilmente. Eliminale per mantenere pulito il sistema.
Serve assistenza?
Se il WP-Cron del tuo sito non funziona e gli articoli programmati non vengono pubblicati, il team di SoccorsoWP può diagnosticare il problema e configurare un cron job di sistema affidabile. Apri un ticket e risolvi il problema definitivamente.