Perché Discord per le notifiche WordPress
Discord è diventato uno strumento essenziale per le agenzie web che gestiscono decine di siti WordPress. A differenza di email o Slack, offre webhook gratuiti illimitati, latenza sotto i 200ms e un’interfaccia pulita per organizzare notifiche per cliente o ambiente.
Secondo i nostri dati interni su AgencyPilot, le agenzie che implementano notifiche Discord riducono del 43% il tempo medio di risposta agli errori critici. Il motivo è semplice: le notifiche arrivano dove il team già comunica, senza dover monitorare dashboard separate.
I casi d’uso principali per le agenzie includono:
- Errori PHP fatali e warning critici in produzione
- Completamento deploy su staging e produzione
- Aggiornamenti plugin e core WordPress
- Backup completati o falliti
- Tentativi di login falliti oltre soglia definita
- Problemi di performance (TTFB oltre 3s, errori database)
Configurazione webhook Discord base
Prima di integrare WordPress, serve creare i webhook su Discord. La struttura consigliata per agenzie prevede un server Discord dedicato con canali separati per ambiente e tipo di alert.
Setup server Discord per agenzia
Crea questa struttura minima di canali:
- #prod-critical – Solo errori fatali production
- #prod-alerts – Warning e notifiche non bloccanti
- #staging-deploys – Deploy e test ambiente staging
- #dev-logs – Debug e sviluppo
- #backups – Status backup tutti i clienti
Per ogni canale, vai su Impostazioni Canale > Integrazioni > Webhook > Nuovo Webhook. Copia l’URL che ha questo formato:
https://discord.com/api/webhooks/123456789/AbCdEfGhIjKlMnOpQrStUvWxYz
Salva questi URL in un gestore password o vault. Mai commitarli nel repository.
Snippet PHP per inviare notifiche
Ecco una classe riusabile per inviare notifiche Discord da WordPress:
<?php
class Discord_Webhook {
private $webhook_url;
public function __construct($webhook_url) {
$this->webhook_url = $webhook_url;
}
public function send($message, $embeds = []) {
$payload = ['content' => $message];
if (!empty($embeds)) {
$payload['embeds'] = $embeds;
}
wp_remote_post($this->webhook_url, [
'body' => wp_json_encode($payload),
'headers' => ['Content-Type' => 'application/json'],
'timeout' => 5,
'blocking' => false // Non bloccare l'esecuzione
]);
}
public function send_error($title, $details, $site_url) {
$embed = [
'title' => $title,
'description' => $details,
'color' => 15158332, // Rosso
'fields' => [
['name' => 'Sito', 'value' => $site_url, 'inline' => true],
['name' => 'Ambiente', 'value' => wp_get_environment_type(), 'inline' => true],
['name' => 'Timestamp', 'value' => current_time('Y-m-d H:i:s'), 'inline' => true]
]
];
$this->send('', [$embed]);
}
}
Monitoraggio errori PHP in produzione
Il caso d’uso più critico: intercettare errori fatali prima che i clienti li segnalino. WordPress 5.2+ include un sistema di recupero errori fatali, ma possiamo estenderlo per inviare notifiche.
Hook per errori fatali
Aggiungi questo al mu-plugin della tua agenzia (wp-content/mu-plugins/agency-monitoring.php):
<?php
add_action('wp_php_error_message', function($message, $error) {
// Solo errori fatali in produzione
if (wp_get_environment_type() !== 'production') {
return $message;
}
if ($error['type'] !== E_ERROR && $error['type'] !== E_PARSE) {
return $message;
}
$webhook = new Discord_Webhook(DISCORD_WEBHOOK_PROD_CRITICAL);
$details = sprintf(
"**File:** %s\n**Riga:** %d\n**Messaggio:** %s",
$error['file'],
$error['line'],
$error['message']
);
$webhook->send_error(
'🔴 Errore Fatale PHP',
$details,
home_url()
);
return $message;
}, 10, 2);
Definisci la costante DISCORD_WEBHOOK_PROD_CRITICAL nel wp-config.php:
define('DISCORD_WEBHOOK_PROD_CRITICAL', 'https://discord.com/api/webhooks/...');
Throttling per evitare spam
Un errore in loop può generare centinaia di notifiche. Implementa un sistema di throttling con transient:
function should_send_alert($error_hash) {
$transient_key = 'discord_alert_' . $error_hash;
if (get_transient($transient_key)) {
return false; // Già inviato negli ultimi 5 minuti
}
set_transient($transient_key, true, 5 * MINUTE_IN_SECONDS);
return true;
}
// Usa nel codice precedente:
$error_hash = md5($error['file'] . $error['line'] . $error['type']);
if (!should_send_alert($error_hash)) {
return $message;
}
Notifiche deploy e aggiornamenti
Per le agenzie che usano deployment automatizzato (GitHub Actions, GitLab CI, Deployer), le notifiche Discord confermano che il deploy è completato e il sito è online.
Webhook post-deploy
Crea un endpoint REST API custom per ricevere webhook dai tool di deploy:
add_action('rest_api_init', function() {
register_rest_route('agency/v1', '/deploy-notify', [
'methods' => 'POST',
'callback' => 'handle_deploy_notification',
'permission_callback' => 'verify_deploy_token'
]);
});
function verify_deploy_token($request) {
$token = $request->get_header('X-Deploy-Token');
return hash_equals(DEPLOY_WEBHOOK_TOKEN, $token);
}
function handle_deploy_notification($request) {
$params = $request->get_json_params();
$webhook = new Discord_Webhook(DISCORD_WEBHOOK_STAGING_DEPLOYS);
$embed = [
'title' => '✅ Deploy Completato',
'color' => 3066993, // Verde
'fields' => [
['name' => 'Ambiente', 'value' => $params['environment'], 'inline' => true],
['name' => 'Commit', 'value' => substr($params['commit_sha'], 0, 7), 'inline' => true],
['name' => 'Branch', 'value' => $params['branch'], 'inline' => true],
['name' => 'Autore', 'value' => $params['author'], 'inline' => true]
]
];
$webhook->send('', [$embed]);
return new WP_REST_Response(['status' => 'notified'], 200);
}
Nel workflow GitHub Actions, aggiungi questo step:
- name: Notify Discord
run: |
curl -X POST https://tuosito.it/wp-json/agency/v1/deploy-notify \
-H "X-Deploy-Token: ${{ secrets.DEPLOY_TOKEN }}" \
-H "Content-Type: application/json" \
-d '{"environment":"staging","commit_sha":"${{ github.sha }}","branch":"${{ github.ref_name }}","author":"${{ github.actor }}"}'
Monitoraggio backup automatici
Se usi UpdraftPlus, BackWPup o script custom per i backup, puoi intercettare il completamento e inviare conferma su Discord.
Hook UpdraftPlus
add_action('updraftplus_backup_complete', function($backup_array) {
$webhook = new Discord_Webhook(DISCORD_WEBHOOK_BACKUPS);
$size_mb = 0;
foreach ($backup_array as $files) {
if (is_array($files)) {
foreach ($files as $file) {
$size_mb += filesize($file) / 1024 / 1024;
}
}
}
$embed = [
'title' => '💾 Backup Completato',
'color' => 3447003, // Blu
'fields' => [
['name' => 'Sito', 'value' => parse_url(home_url(), PHP_URL_HOST), 'inline' => true],
['name' => 'Dimensione', 'value' => round($size_mb, 2) . ' MB', 'inline' => true],
['name' => 'Data', 'value' => current_time('Y-m-d H:i'), 'inline' => true]
]
];
$webhook->send('', [$embed]);
}, 10, 1);
Alert backup falliti
add_action('updraftplus_backup_failed', function($message) {
$webhook = new Discord_Webhook(DISCORD_WEBHOOK_PROD_CRITICAL);
$webhook->send_error(
'❌ Backup Fallito',
$message,
home_url()
);
}, 10, 1);
Alert sicurezza e tentativi login
Monitora tentativi di accesso sospetti senza installare plugin pesanti come Wordfence.
add_action('wp_login_failed', function($username) {
$ip = $_SERVER['REMOTE_ADDR'];
$attempts_key = 'login_attempts_' . $ip;
$attempts = (int) get_transient($attempts_key);
$attempts++;
set_transient($attempts_key, $attempts, HOUR_IN_SECONDS);
// Alert dopo 5 tentativi falliti
if ($attempts === 5) {
$webhook = new Discord_Webhook(DISCORD_WEBHOOK_PROD_ALERTS);
$embed = [
'title' => '⚠️ Tentativi Login Sospetti',
'description' => sprintf('**5 tentativi falliti** dall\'IP %s\n**Username:** %s', $ip, $username),
'color' => 16761095 // Arancione
];
$webhook->send('', [$embed]);
}
}, 10, 1);
Best practice per agenzie
Dopo aver implementato notifiche Discord su oltre 200 siti cliente, queste sono le regole che raccomandiamo:
- Separa sempre produzione da staging – Canali diversi, volume di notifiche completamente differente
- Usa colori consistenti – Rosso per errori critici, arancione per warning, verde per successi, blu per info
- Implementa throttling aggressivo – 5 minuti minimo tra notifiche identiche
- Non notificare in sviluppo locale – Controlla sempre wp_get_environment_type()
- Includi sempre link diretti – URL alla dashboard, file di log, pagina con errore
- Testa con webhook di test – Mai testare sul canale produzione
- Documenta le soglie – Quando scatta un alert? Quali parametri?
Gestione multi-cliente
Per agenzie con molti clienti, aggiungi il nome cliente in ogni notifica:
function get_client_name() {
return defined('CLIENT_NAME') ? CLIENT_NAME : parse_url(home_url(), PHP_URL_HOST);
}
// Usa nei messaggi:
$embed['author'] = [
'name' => get_client_name(),
'icon_url' => get_site_icon_url()
];
Definisci CLIENT_NAME nel wp-config.php di ogni sito:
define('CLIENT_NAME', 'Acme Corp');
Monitoraggio performance avanzato
Oltre agli errori, monitora degradi di performance che possono indicare problemi:
add_action('shutdown', function() {
if (wp_get_environment_type() !== 'production') {
return;
}
$elapsed = timer_stop(0, 3);
// Alert se TTFB oltre 5 secondi
if ($elapsed > 5) {
$webhook = new Discord_Webhook(DISCORD_WEBHOOK_PROD_ALERTS);
$url = (isset($_SERVER['HTTPS']) ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$embed = [
'title' => '🐌 Performance Degradata',
'description' => sprintf('TTFB: **%.2fs**\nURL: %s', $elapsed, $url),
'color' => 16761095
];
// Throttling per non spammare
$hash = md5($url);
if (should_send_alert('perf_' . $hash)) {
$webhook->send('', [$embed]);
}
}
});
Plugin e strumenti esistenti
Se preferisci soluzioni già pronte invece di codice custom:
- WP Webhooks – Plugin freemium con supporto Discord, 50+ trigger disponibili
- Notification – Sistema flessibile per inviare notifiche multi-canale, include Discord
- Query Monitor + Discord – Estendi Query Monitor per inviare alert automatici
Questi plugin sono validi per setup semplici, ma per agenzie con requisiti specifici il codice custom in un mu-plugin offre controllo totale e zero overhead.
Integrazione con AgencyPilot
AgencyPilot include nativamente un sistema di notifiche Discord configurabile per cliente. Dalla dashboard puoi:
- Assegnare webhook Discord diversi per ogni cliente
- Configurare soglie personalizzate per tipo di alert
- Visualizzare storico notifiche inviate
- Testare webhook prima dell’attivazione
Il vantaggio rispetto all’implementazione manuale è la gestione centralizzata: modifichi le regole una volta e si applicano a tutti i siti del cliente.
FAQ
Quante notifiche Discord posso inviare gratuitamente?
Discord non impone limiti sul numero di webhook inviati, ma applica rate limiting: massimo 30 richieste per webhook ogni 60 secondi. Per agenzie questo è abbondante se implementi throttling corretto. Oltre questa soglia ricevi errore 429 e devi attendere.
Le notifiche Discord rallentano WordPress?
No se usi wp_remote_post() con parametro blocking impostato a false. Questo invia la richiesta in modo asincrono senza attendere risposta. Il tempo aggiunto è sotto 5ms. Evita chiamate sincrone che potrebbero aggiungere 200-500ms al tempo di risposta.
Come gestisco webhook diversi per staging e produzione?
Usa wp_get_environment_type() introdotto in WordPress 5.5. Definisci WP_ENVIRONMENT_TYPE nel wp-config.php (values: local, development, staging, production) e scegli il webhook di conseguenza. Esempio: if (wp_get_environment_type() === ‘production’) usa webhook critico, altrimenti webhook sviluppo.
Posso ricevere notifiche anche via email oltre a Discord?
Sì, Discord supporta notifiche email per menzioni specifiche. Configura un ruolo @critical-alerts nel server Discord e menzionalo nei messaggi urgenti. Chi ha quel ruolo riceve email. Alternativamente usa wp_mail() in parallelo a Discord per ridondanza su alert critici.
Come testo le notifiche senza spam nei canali produzione?
Crea un canale #test-webhooks dedicato e un webhook separato. Durante lo sviluppo usa sempre questo webhook. Quando il codice è stabile, sostituisci l’URL con quello produzione. Puoi anche usare una costante DISCORD_TEST_MODE che forza sempre il webhook di test indipendentemente dall’ambiente.