Aggiornare WordPress Senza Rompere Nulla: La Procedura che Usiamo su 40+ Siti
L’aggiornamento è la singola azione di sicurezza più importante su WordPress. Il 60% dei siti hackerati non era aggiornato. Ma l’aggiornamento fatto male è la singola causa più comune di downtime auto-inflitto.
Il paradosso: devi aggiornare per la sicurezza, ma ogni aggiornamento può rompere qualcosa. La soluzione non è “non aggiornare” (il che è peggio). La soluzione è una procedura che minimizza il rischio.
Questa è la procedura che usiamo su 40+ siti WordPress in produzione. Non è teoria. È il risultato di centinaia di aggiornamenti (e qualche rollback).
La Classificazione degli Aggiornamenti
Non tutti gli aggiornamenti sono uguali. La procedura cambia in base al tipo:
| Tipo | Esempio | Rischio | Procedura |
|---|---|---|---|
| Core minor | 6.5.1 → 6.5.2 | Bassissimo | Automatico, nessun test |
| Core major | 6.5 → 6.6 | Medio | Staging first, test completo |
| Plugin patch | 3.2.1 → 3.2.2 | Basso | Backup + aggiorna + verifica |
| Plugin minor | 3.2 → 3.3 | Medio | Leggi changelog + backup + aggiorna |
| Plugin major | 3.x → 4.0 | Alto | Staging + test completo + rollback plan |
| Tema | Qualsiasi | Medio-alto | Solo se tema child, staging first |
| PHP version | 8.1 → 8.3 | Alto | Staging obbligatorio + PHP Compatibility Checker |
La Procedura Step-by-Step
Step 1: Backup completo (2 minuti)
Prima di qualsiasi aggiornamento. Sempre. Non “di solito”. Sempre.
# Con WP-CLI
wp db export /tmp/backup-pre-update-$(date +%Y%m%d).sql
# File backup (solo wp-content che contiene le customizzazioni)
tar -czf /tmp/wp-content-backup-$(date +%Y%m%d).tar.gz wp-content/
# Oppure con UpdraftPlus
wp updraftplus backup
Verifica che il backup sia leggibile. Un backup corrotto è peggio di nessun backup (ti dà una falsa sicurezza).
Step 2: Leggi il changelog (5 minuti)
Per aggiornamenti minor e major di plugin critici, leggi il changelog. Cerca:
- “Breaking change” o “breaking” (incompatibilità)
- “Deprecated” (funzionalità rimossa in futuro)
- “Requires PHP” o “Requires WordPress” (cambio requisiti)
- “Security fix” (aggiorna subito, non aspettare)
Se il changelog menziona breaking changes e il plugin è critico (WooCommerce, page builder, SEO plugin), vai allo Step 2b (staging).
Step 2b: Test in Staging (per aggiornamenti rischiosi)
# Crea un clone rapido per il test
# Opzione 1: WP-CLI + plugin (WP Staging, Jeep)
wp staging create --name=update-test
# Opzione 2: rsync + database clone manuale
rsync -a /var/www/produzione/ /var/www/staging/
mysqldump prod_db | mysql staging_db
# Aggiorna wp-config.php dello staging con il DB corretto
Nello staging: applica l’aggiornamento e testa le funzionalità chiave (form, checkout, pagine principali, area admin).
Step 3: Aggiorna (1 minuto per plugin)
# Singolo plugin
wp plugin update plugin-name
# Tutti i plugin con aggiornamenti disponibili
wp plugin update --all
# Core WordPress (minor)
wp core update --minor
# Core WordPress (major, solo dopo staging test)
wp core update
Per agenzie con 30 siti, WP-CLI via SSH è l’unico modo scalabile. Un webhook può notificarti il risultato automaticamente.
Step 4: Verifica post-aggiornamento (5 minuti)
Checklist rapida dopo ogni aggiornamento:
- ✅ Homepage carica correttamente
- ✅ wp-admin accessibile
- ✅ Nessun errore PHP nel debug.log
- ✅ Form principale funziona (invia un test)
- ✅ Se e-commerce: aggiungi al carrello + checkout test funziona
- ✅ Se ha cache: svuota la cache e verifica
# Verifica rapida da CLI
wp eval 'echo "WP OK: " . get_bloginfo("version");'
# Controlla errori PHP
tail -20 wp-content/debug.log 2>/dev/null || echo "No debug log"
# Test HTTP della homepage
curl -s -o /dev/null -w "HTTP %{http_code} | %{time_total}s\n" https://tuosito.com
Step 5: Rollback (se necessario)
# Ripristina il database
wp db import /tmp/backup-pre-update-*.sql
# Ripristina i file
tar -xzf /tmp/wp-content-backup-*.tar.gz -C /var/www/html/
# Svuota la cache
wp cache flush
Il rollback deve essere possibile in meno di 5 minuti. Se richiede più tempo, la procedura di backup è inadeguata.
Automazione per Agenzie
Script per aggiornamento batch di tutti i siti
#!/bin/bash
# update-all-sites.sh
SITES=(
"/var/www/site1"
"/var/www/site2"
"/var/www/site3"
)
LOG="/var/log/wp-updates-$(date +%Y%m%d).log"
for site in "${SITES[@]}"; do
name=$(basename "$site")
echo "=== $name ===" >> "$LOG"
cd "$site"
# 1. Backup DB
wp db export "/tmp/backup-${name}-$(date +%Y%m%d).sql" 2>> "$LOG"
# 2. Aggiorna plugin (solo patch e minor)
wp plugin update --all 2>> "$LOG"
# 3. Aggiorna core minor
wp core update --minor 2>> "$LOG"
# 4. Verifica
status=$(curl -s -o /dev/null -w "%{http_code}" "https://${name}.com")
if [ "$status" != "200" ]; then
echo "⚠️ $name: HTTP $status dopo update!" >> "$LOG"
# Rollback automatico
wp db import "/tmp/backup-${name}-$(date +%Y%m%d).sql" 2>> "$LOG"
echo "Rollback eseguito per $name" >> "$LOG"
else
echo "✅ $name: OK (HTTP $status)" >> "$LOG"
fi
echo "" >> "$LOG"
done
# Invia report
mail -s "WordPress Update Report $(date +%Y-%m-%d)" admin@agenzia.com < "$LOG"
Questo script: fa backup, aggiorna, verifica, e se qualcosa va storto fa rollback automatico. Lo scheduliamo con cron il martedì mattina alle 6:00 (fuori orario business, ma durante la settimana per poter intervenire).
Quando NON Aggiornare
- Venerdì pomeriggio: mai aggiornare prima del weekend. Se qualcosa si rompe, devi intervenire nel weekend
- Durante un lancio o campagna: se il cliente ha una campagna marketing attiva, l'aggiornamento può aspettare 1-2 giorni
- Senza backup verificato: se il backup è fallito o non verificato, sistema prima il backup
- Plugin con 0 test su nuova versione: se un plugin major è uscito oggi, aspetta 3-5 giorni per vedere se emergono bug. Le prime 48 ore sono le più rischiose
Eccezione: security patch critiche. Se WPScan segnala una vulnerabilità attivamente sfruttata, aggiorna subito, indipendentemente dal giorno.
FAQ
Posso abilitare gli auto-update per tutti i plugin?
Per plugin piccoli e non critici, sì. Per plugin critici (WooCommerce, page builder, SEO plugin), no. Un aggiornamento automatico di WooCommerce che rompe il checkout alle 3 di notte è il tipo di incidente che vuoi evitare. La schedulazione con cron reale ti dà più controllo.
Ogni quanto aggiornare?
Plugin: settimanalmente. Core minor: appena disponibile (automatico). Core major: entro 2 settimane dal rilascio (dopo test in staging). PHP: durante una finestra di manutenzione pianificata, con test completo.
Come gestire plugin premium senza auto-update?
I plugin premium (Elementor Pro, ACF Pro, Gravity Forms) non hanno auto-update dal repository WordPress. Opzioni: 1) Configura la licenza nel plugin per ricevere gli aggiornamenti dalla dashboard. 2) Usa WP-CLI con il token del vendor. 3) Script che scarica l'ultima versione dalla API del vendor e la installa.