Discord Notifiche WordPress: Alert Sviluppo e Produzione

4 giugno 20268 minAutomazione
In breveAI

Sistema completo per integrare notifiche Discord in WordPress: monitora errori, deploy, backup e sicurezza con webhook configurabili per ambiente.

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.

Gestisci i siti WordPress dei tuoi clienti?

AgencyPilot ti dà report AI, uptime monitoring, backup e portale clienti in un’unica dashboard. Gratis per 3 siti.

Prova gratis
Leggi anche
Tutti gli articoli
Tutti gli articoli