Gli errori 404 sono una di quelle cose che sembrano piccole, ma in realtà possono raccontare molto sullo stato di salute di un sito web.
Un errore 404 si verifica quando un utente, o un bot, prova a visitare un URL che non esiste più, che è stato scritto male, che è stato spostato oppure che non è mai esistito. In pratica, WordPress risponde dicendo: “questa pagina non la trovo”.
Il punto è questo: se nessuno ti avvisa, potresti accorgertene troppo tardi.
Magari hai eliminato un vecchio articolo. Magari hai cambiato la struttura dei permalink. Magari hai modificato lo slug di una pagina importante. Oppure, più semplicemente, qualcuno ha condiviso un link sbagliato verso il tuo sito.
In tutti questi casi, ricevere una email automatica quando qualcuno arriva su una pagina 404 può essere molto utile. Ti permette di intervenire rapidamente, capire cosa sta succedendo e decidere se creare un redirect, correggere un link interno o lasciare tutto com’è.
In questo articolo vediamo come creare una notifica email automatica per gli errori 404 in WordPress, senza installare plugin pesanti, usando un semplice snippet PHP.
Perché monitorare gli errori 404
Un errore 404 non è sempre un problema grave. Anzi, è normale che ogni sito ne abbia qualcuno.
Il problema nasce quando gli errori 404 riguardano pagine importanti, URL che ricevevano traffico, vecchi articoli indicizzati su Google o link presenti in menu, pulsanti, articoli, newsletter e pagine esterne.
Un 404 può dipendere da tante situazioni:
- hai cancellato una pagina;
- hai modificato uno slug;
- hai cambiato la struttura dei permalink;
- hai rimosso un articolo;
- un sito esterno ti linka con un URL sbagliato;
- Google ha ancora in memoria un vecchio indirizzo;
- un bot sta cercando file o percorsi inesistenti;
- un utente ha digitato male l’indirizzo.
Dal punto di vista SEO, un 404 occasionale non distrugge un sito. Però, se un contenuto importante non è più raggiungibile, rischi di perdere traffico, autorevolezza e continuità nell’esperienza utente.
Dal punto di vista dell’utente, invece, un 404 è semplicemente un’interruzione. La persona voleva raggiungere qualcosa e non ci riesce. Se la pagina 404 è fatta bene, può recuperare la navigazione. Ma se l’URL era davvero importante, sarebbe meglio sistemarlo.
Ecco perché una notifica email può diventare uno strumento molto pratico.
L’idea dello snippet
L’obiettivo è semplice: quando qualcuno visita un URL del sito che restituisce errore 404, WordPress invia una email al proprietario del sito.
La mail contiene alcune informazioni utili:
- l’URL che ha generato errore 404;
- l’eventuale pagina di provenienza;
- lo User Agent del browser o del bot;
- un messaggio chiaro che segnala il problema.
Lo snippet è pensato per essere inserito in Code Snippets oppure nel file functions.php del child theme.
Personalmente, per questo tipo di interventi, preferisco Code Snippets: è più ordinato, puoi attivare e disattivare il codice facilmente e riduci il rischio di rompere il tema durante un aggiornamento.
Il codice completo
Ecco lo snippet:
/**
* Notifica email quando un utente visita un URL che restituisce 404.
*
* Da inserire in Code Snippets oppure nel functions.php del child theme.
*/
add_action( 'template_redirect', 'sergio_notifica_email_404' );
function sergio_notifica_email_404() {
/*
* Esegui solo sulle vere pagine 404 del frontend.
*/
if ( ! is_404() ) {
return;
}
/*
* Evita richieste admin, AJAX, REST API e CRON.
*/
if (
is_admin() ||
wp_doing_ajax() ||
wp_doing_cron() ||
defined( 'REST_REQUEST' )
) {
return;
}
/*
* Recupera l'URL richiesto.
*/
$request_uri = isset( $_SERVER['REQUEST_URI'] ) ? sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ) : '';
if ( empty( $request_uri ) ) {
return;
}
/*
* Costruisce l'URL completo.
*/
$url_404 = home_url( $request_uri );
/*
* Evita notifiche inutili per file comuni richiesti da browser/bot.
*/
$estensioni_da_ignorare = array(
'.ico',
'.png',
'.jpg',
'.jpeg',
'.gif',
'.webp',
'.svg',
'.css',
'.js',
'.map',
'.txt',
'.xml',
'.json',
'.woff',
'.woff2',
'.ttf',
'.eot',
);
foreach ( $estensioni_da_ignorare as $estensione ) {
if ( str_ends_with( strtolower( parse_url( $url_404, PHP_URL_PATH ) ), $estensione ) ) {
return;
}
}
/*
* Evita di ricevere email ripetute per lo stesso URL.
* In questo esempio: massimo una email ogni 6 ore per lo stesso URL 404.
*/
$transient_key = 'sergio_404_mail_' . md5( $url_404 );
if ( get_transient( $transient_key ) ) {
return;
}
set_transient( $transient_key, true, 6 * HOUR_IN_SECONDS );
/*
* Dati email.
*/
$destinatario = 'TUA_EMAIL@TUA_EMAIL.IT';
$oggetto = 'Errore 404 rilevato su sergiopinna.it';
$messaggio = "Un utente ha cercato questo URL:\n\n";
$messaggio .= $url_404 . "\n\n";
$messaggio .= "ma gli è stato restituito un errore 404.\n\n";
$messaggio .= "Pagina di provenienza: ";
if ( ! empty( $_SERVER['HTTP_REFERER'] ) ) {
$messaggio .= esc_url_raw( wp_unslash( $_SERVER['HTTP_REFERER'] ) );
} else {
$messaggio .= 'Non disponibile';
}
$messaggio .= "\n\n";
$messaggio .= "User Agent:\n";
if ( ! empty( $_SERVER['HTTP_USER_AGENT'] ) ) {
$messaggio .= sanitize_text_field( wp_unslash( $_SERVER['HTTP_USER_AGENT'] ) );
} else {
$messaggio .= 'Non disponibile';
}
$headers = array(
'Content-Type: text/plain; charset=UTF-8',
);
/*
* Invio email.
*/
wp_mail( $destinatario, $oggetto, $messaggio, $headers );
}
Prima di usarlo, devi modificare questa riga:
$destinatario = 'TUA_EMAIL@TUA_EMAIL.IT';
Inserendo il tuo indirizzo email reale, per esempio:
$destinatario = 'info@sergiopinna.it';
Puoi personalizzare anche l’oggetto della mail:
$oggetto = 'Errore 404 rilevato su sergiopinna.it';
Come funziona il codice
Lo snippet viene agganciato a template_redirect, un hook di WordPress che viene eseguito quando il CMS ha già capito quale contenuto dovrebbe mostrare.
In pratica, a quel punto WordPress sa già se la richiesta riguarda una pagina valida, un articolo, un archivio, una categoria oppure una pagina 404.
Questa riga avvia il controllo:
add_action( 'template_redirect', 'sergio_notifica_email_404' );
Quando WordPress arriva al momento giusto, esegue la funzione:
function sergio_notifica_email_404() {
Da lì parte tutta la logica.
Il primo controllo: eseguire il codice solo sulle vere pagine 404
La parte più importante è questa:
if ( ! is_404() ) {
return;
}
Significa: se la pagina visitata non è una 404, non fare nulla.
Questo è fondamentale. Non vogliamo eseguire il codice su ogni pagina del sito. Non avrebbe senso inviare email quando un utente visita la home, il blog, il portfolio o una pagina normale.
Lo snippet deve attivarsi solo quando WordPress restituisce davvero un errore 404.
Escludere admin, AJAX, REST API e CRON
Subito dopo troviamo questo blocco:
if (
is_admin() ||
wp_doing_ajax() ||
wp_doing_cron() ||
defined( 'REST_REQUEST' )
) {
return;
}
Qui il codice evita di funzionare in contesti dove non serve.
Non vogliamo ricevere notifiche per richieste dell’area amministrativa, chiamate AJAX, processi CRON o richieste REST API.
Questo rende lo snippet più pulito e più sicuro, perché lo limita al frontend pubblico del sito.
In altre parole: ci interessano gli utenti, o i bot, che arrivano su URL pubblici inesistenti. Non ci interessano processi tecnici interni a WordPress.
Recuperare l’URL che ha generato il 404
Questa parte recupera l’indirizzo richiesto:
$request_uri = isset( $_SERVER['REQUEST_URI'] ) ? sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ) : '';
$_SERVER['REQUEST_URI'] contiene il percorso richiesto dall’utente.
Per esempio, se qualcuno prova ad aprire:
https://www.sergiopinna.it/blog/articolo-che-non-esiste/
La variabile può contenere:
/blog/articolo-che-non-esiste/
Il codice usa anche wp_unslash() e sanitize_text_field() per ripulire il dato prima di usarlo. È una buona abitudine, perché tutto ciò che arriva da $_SERVER va trattato con prudenza.
Subito dopo c’è un controllo:
if ( empty( $request_uri ) ) {
return;
}
Se per qualche motivo l’URL richiesto è vuoto, il codice si ferma.
Costruire l’URL completo
A questo punto lo snippet ricostruisce l’URL completo:
$url_404 = home_url( $request_uri );
Così, invece di ricevere solo:
/blog/articolo-che-non-esiste/
riceverai in email un indirizzo completo come:
https://www.sergiopinna.it/blog/articolo-che-non-esiste/
Questo è molto più comodo, perché puoi cliccarlo, copiarlo, controllarlo e decidere cosa farne.
Evitare notifiche inutili per immagini, CSS, JS e file tecnici
Uno dei problemi più fastidiosi di questo tipo di snippet è il rischio di ricevere troppe email.
Molti bot cercano continuamente file inesistenti. A volte possono esserci richieste verso vecchie immagini, file CSS mancanti, file .map, font, icone o risorse tecniche.
Per questo il codice include una lista di estensioni da ignorare:
$estensioni_da_ignorare = array(
'.ico',
'.png',
'.jpg',
'.jpeg',
'.gif',
'.webp',
'.svg',
'.css',
'.js',
'.map',
'.txt',
'.xml',
'.json',
'.woff',
'.woff2',
'.ttf',
'.eot',
);
Se l’URL 404 termina con una di queste estensioni, lo snippet non invia nessuna email.
Per esempio, se qualcuno cerca:
https://www.sergiopinna.it/wp-content/uploads/vecchia-immagine.jpg
il codice la ignora.
Questo è utile perché l’obiettivo non è trasformare la casella email in una discarica di notifiche tecniche. L’obiettivo è intercettare gli URL davvero interessanti: pagine, articoli, sezioni del sito, vecchi contenuti e link rotti importanti.
Attenzione a str_ends_with
Nel codice viene usata questa funzione:
str_ends_with()
È una funzione disponibile da PHP 8. Se il tuo hosting usa una versione moderna di PHP, non ci sono problemi.
Se invece il sito gira ancora su una versione vecchia di PHP, lo snippet potrebbe generare errore. In quel caso conviene aggiornare PHP dal pannello hosting oppure sostituire quella parte con un controllo compatibile con versioni più vecchie.
Per un sito WordPress professionale, comunque, usare una versione PHP aggiornata è sempre consigliabile, sia per prestazioni sia per sicurezza.
Limitare le email ripetute con i transient
Questa è una delle parti più intelligenti dello snippet:
$transient_key = 'sergio_404_mail_' . md5( $url_404 );
if ( get_transient( $transient_key ) ) {
return;
}
set_transient( $transient_key, true, 6 * HOUR_IN_SECONDS );
Il problema è semplice: se un URL inesistente viene visitato 100 volte, non vogliamo ricevere 100 email.
Per evitarlo, il codice usa i transient di WordPress.
Un transient è una piccola informazione temporanea salvata nel database. In questo caso, viene creato un identificatore unico per quello specifico URL 404.
La chiave viene costruita così:
'sergio_404_mail_' . md5( $url_404 )
md5() trasforma l’URL in una stringa più corta e adatta a essere usata come chiave.
Poi il codice controlla se esiste già un transient per quell’URL. Se esiste, significa che la notifica è già stata inviata da poco, quindi lo snippet si ferma.
Se invece non esiste, il transient viene creato per 6 ore:
set_transient( $transient_key, true, 6 * HOUR_IN_SECONDS );
Risultato: per lo stesso URL 404 riceverai al massimo una email ogni 6 ore.
Questo è molto utile per non intasare la casella di posta, soprattutto se il sito riceve molto traffico o se un bot insiste sullo stesso indirizzo.
Preparare il contenuto della email
La mail viene costruita in modo semplice e leggibile.
Il destinatario è questo:
$destinatario = 'TUA_EMAIL@TUA_EMAIL.IT';
L’oggetto è questo:
$oggetto = 'Errore 404 rilevato su sergiopinna.it';
Il corpo del messaggio viene composto un pezzo alla volta:
$messaggio = "Un utente ha cercato questo URL:\n\n";
$messaggio .= $url_404 . "\n\n";
$messaggio .= "ma gli è stato restituito un errore 404.\n\n";
Quindi l’email ti dirà chiaramente quale URL è stato richiesto e che cosa è successo.
Inserire la pagina di provenienza
Questa parte è interessante:
if ( ! empty( $_SERVER['HTTP_REFERER'] ) ) {
$messaggio .= esc_url_raw( wp_unslash( $_SERVER['HTTP_REFERER'] ) );
} else {
$messaggio .= 'Non disponibile';
}
HTTP_REFERER indica, quando disponibile, la pagina da cui proveniva l’utente.
Per esempio, se una persona era su un vecchio articolo e ha cliccato un link rotto, potresti vedere nella mail la pagina di partenza.
Questo dato è molto utile perché ti aiuta a capire dove si trova il problema.
Se il referrer è una pagina interna del tuo sito, probabilmente hai un link rotto da correggere.
Se invece il referrer è un sito esterno, magari qualcuno ti sta linkando con un indirizzo sbagliato. In quel caso potresti creare un redirect o, se ha senso, contattare il proprietario del sito.
Non sempre il referrer è disponibile. Alcuni browser, impostazioni privacy o passaggi diretti possono nasconderlo. Per questo il codice prevede anche il messaggio:
Non disponibile
Inserire lo User Agent
Lo snippet aggiunge anche lo User Agent:
if ( ! empty( $_SERVER['HTTP_USER_AGENT'] ) ) {
$messaggio .= sanitize_text_field( wp_unslash( $_SERVER['HTTP_USER_AGENT'] ) );
} else {
$messaggio .= 'Non disponibile';
}
Lo User Agent indica, in modo tecnico, quale browser, dispositivo o bot ha fatto la richiesta.
Può aiutarti a capire se il 404 è stato generato da un utente reale, da Googlebot, da Bingbot, da un browser mobile oppure da uno scanner automatico.
Non bisogna basarsi ciecamente su questo dato, perché può essere manipolato, ma resta comunque utile per una prima valutazione.
Invio della mail con wp_mail
Alla fine il codice prepara gli header:
$headers = array(
'Content-Type: text/plain; charset=UTF-8',
);
E invia la mail:
wp_mail( $destinatario, $oggetto, $messaggio, $headers );
wp_mail() è la funzione standard di WordPress per inviare email.
Se il sito invia correttamente le email di sistema, lo snippet dovrebbe funzionare senza problemi. Se invece non ricevi nulla, il problema potrebbe non essere il codice, ma la configurazione email del sito o dell’hosting.
In quel caso conviene configurare un plugin SMTP, così WordPress invia le email attraverso un servizio più affidabile.
Dove inserire lo snippet
Hai due possibilità principali.
La prima è usare il plugin Code Snippets. È la soluzione più comoda, soprattutto se non vuoi toccare direttamente i file del tema.
La seconda è inserire il codice nel file functions.php del child theme.
Io eviterei di inserirlo nel functions.php del tema principale, perché al primo aggiornamento rischi di perdere la modifica.
Con Code Snippets puoi creare un nuovo snippet, incollare il codice, sostituire l’indirizzo email e attivarlo solo sul frontend del sito.
Come testare se funziona
Per testare lo snippet basta visitare un URL inesistente del tuo sito.
Per esempio:
https://www.tuosito.it/test-errore-404-prova/
Se quella pagina non esiste, WordPress dovrebbe mostrare la pagina 404 e lo snippet dovrebbe inviarti una email.
Naturalmente devi controllare anche la cartella spam.
Se non ricevi niente, verifica questi punti:
- l’indirizzo email è corretto;
- lo snippet è attivo;
- il sito restituisce davvero una pagina 404;
- WordPress riesce a inviare email;
- non hai già visitato lo stesso URL negli ultimi 6 ore;
- il tuo hosting non blocca
wp_mail; - non stai testando un file con estensione ignorata, come
.jpg,.csso.js.
Per fare più test, cambia ogni volta URL. Per esempio:
/test-404-uno/
poi:
/test-404-due/
poi:
/test-404-tre/
Così eviti il blocco temporaneo del transient.
Cosa fare quando ricevi una email 404
Ricevere la mail non significa automaticamente che devi intervenire.
La prima cosa da fare è guardare l’URL.
Se è un URL assurdo, generato da bot o tentativi casuali, puoi ignorarlo.
Se invece è un vecchio articolo, una vecchia pagina, un servizio, un progetto del portfolio o una risorsa importante, allora conviene analizzarlo.
Puoi fare tre cose.
La prima: correggere il link interno se il problema nasce dal tuo sito.
La seconda: creare un redirect 301 verso la pagina più pertinente.
La terza: ricreare il contenuto, se era una risorsa utile e riceveva traffico.
Il redirect non va fatto sempre e comunque. Va fatto quando esiste una destinazione sensata.
Se un vecchio articolo parlava di “come creare un sito WordPress” e oggi hai una nuova guida aggiornata sullo stesso tema, un redirect può avere senso.
Se invece l’URL era spazzatura o non ha nessuna pagina equivalente, puoi anche lasciarlo in 404.
Un 404 non è un mostro. È un segnale. Sta a te capire se merita attenzione.
Perché questo snippet è utile in ottica SEO
Dal punto di vista SEO, monitorare i 404 ti aiuta a mantenere pulita la struttura del sito.
Non serve inseguire ogni singolo errore, ma serve accorgersi dei casi importanti.
Per esempio, se ricevi una notifica relativa a un vecchio articolo che avevi eliminato, potresti scoprire che Google lo aveva ancora indicizzato o che un altro sito lo stava linkando.
In quel caso, creare un redirect verso un contenuto aggiornato può aiutarti a recuperare traffico e a migliorare l’esperienza dell’utente.
Lo stesso vale se hai cambiato la struttura dei permalink. Dopo una modifica importante, le notifiche 404 possono aiutarti a intercettare velocemente gli URL che non sono stati reindirizzati correttamente.
Naturalmente questo snippet non sostituisce strumenti come Google Search Console, Screaming Frog o altri crawler SEO. Però ha un vantaggio: ti avvisa in modo diretto, nel momento in cui qualcuno incontra davvero il problema.
È una specie di piccolo sensore installato nel sito.
Attenzione a non esagerare con le notifiche
Questo tipo di funzione è molto utile, ma va usata con criterio.
Su un sito molto trafficato, o molto bersagliato dai bot, potresti comunque ricevere tante email. Per questo il filtro sulle estensioni e il blocco temporaneo di 6 ore sono importanti.
Volendo, puoi aumentare il tempo di blocco.
Per esempio, invece di 6 ore:
set_transient( $transient_key, true, 6 * HOUR_IN_SECONDS );
puoi impostare 24 ore:
set_transient( $transient_key, true, DAY_IN_SECONDS );
Così riceverai al massimo una email al giorno per lo stesso URL.
Oppure puoi impostare 12 ore:
set_transient( $transient_key, true, 12 * HOUR_IN_SECONDS );
La scelta dipende dal sito.
Per un piccolo sito professionale, 6 ore può andare bene.
Per un sito più trafficato, meglio 12 o 24 ore.
Possibile miglioramento: ignorare alcuni percorsi
Oltre alle estensioni, potresti voler ignorare alcuni percorsi specifici.
Per esempio:
/wp-content/
/wp-includes/
/xmlrpc.php
Molte richieste strane arrivano da bot che cercano file tecnici, vulnerabilità o vecchi percorsi standard di WordPress.
Una versione più evoluta dello snippet potrebbe includere anche una lista di parole o percorsi da ignorare.
Questo rende il sistema ancora più pulito e riduce il rumore.
Possibile miglioramento: salvare i 404 nel database
La notifica email è comoda, ma non è l’unica strada.
In alternativa, potresti salvare gli errori 404 nel database, magari in una tabella personalizzata o in un log interno. Così avresti uno storico consultabile senza riempire la casella email.
Però questa soluzione è più complessa e richiede più attenzione: bisogna gestire la pulizia dei dati, evitare di salvare troppe informazioni e non appesantire il sito.
Per molti siti vetrina, portfolio, blog professionali o piccoli siti aziendali, la semplice email è più che sufficiente.
Aspetti privacy
Lo snippet inserisce nella mail l’URL richiesto, l’eventuale pagina di provenienza e lo User Agent.
Non salva dati personali nel database, almeno non in modo permanente, a parte il transient tecnico collegato all’URL 404. Tuttavia è sempre buona norma essere prudenti.
Lo User Agent e il referrer possono essere considerati informazioni tecniche di navigazione. Per questo conviene usare lo snippet solo per finalità di sicurezza, manutenzione e miglioramento tecnico del sito.
Se vuoi essere ancora più prudente, puoi evitare di inserire lo User Agent nella mail oppure puoi limitarti al solo URL 404.
Per esempio, potresti rimuovere questa parte:
$messaggio .= "User Agent:\n";
if ( ! empty( $_SERVER['HTTP_USER_AGENT'] ) ) {
$messaggio .= sanitize_text_field( wp_unslash( $_SERVER['HTTP_USER_AGENT'] ) );
} else {
$messaggio .= 'Non disponibile';
}
In questo modo riceveresti una notifica più essenziale.
Quando usare questo sistema
Questo snippet è particolarmente utile se:
- hai appena cambiato i permalink;
- hai eliminato vecchie pagine;
- hai fatto una migrazione del sito;
- hai rifatto la struttura del blog;
- hai spostato articoli o categorie;
- vuoi intercettare link rotti importanti;
- vuoi controllare meglio cosa succede sul tuo sito;
- non vuoi installare un plugin solo per monitorare qualche 404.
È molto utile anche dopo un restyling, perché spesso i 404 emergono proprio quando si cambia struttura, si riorganizzano contenuti o si sistemano gli URL.
Quando invece non basta
Questo snippet non è pensato per fare un audit SEO completo.
Se devi analizzare centinaia o migliaia di URL, ti servono strumenti più specifici.
Per esempio, se stai lavorando su un sito grande, dovresti usare anche:
- Google Search Console;
- un crawler SEO;
- i log server;
- un plugin di redirect;
- strumenti di monitoraggio uptime;
- analisi dei link interni.
La notifica email è uno strumento agile, non una piattaforma completa di diagnostica.
È perfetta per sapere: “Qualcuno ha appena cercato una pagina che non esiste”.
Poi starà a te decidere se quell’informazione è importante.
Conclusione
Ricevere una email quando un utente finisce su una pagina 404 è un modo semplice per tenere sotto controllo la salute del sito WordPress.
Non serve installare plugin complessi. Con poche righe di PHP puoi intercettare gli errori più interessanti, ricevere una notifica chiara e intervenire quando serve.
Lo snippet visto in questo articolo è leggero, controllato e abbastanza prudente: funziona solo sulle vere pagine 404, evita admin, AJAX, REST API e CRON, ignora file tecnici come immagini e script, e usa i transient per non inviare email ripetute sullo stesso URL.
È una piccola automazione, ma può fare una grande differenza.
Perché un sito professionale non è solo quello che appare bello quando tutto funziona. È anche quello che ti aiuta ad accorgerti rapidamente quando qualcosa non sta funzionando.



