DB Debug Manager releasesself-updates
My personal Swiss knife for solving Wordpress Problems
by Davide Bertolino · github.com/dadebertolino/db-debug-manager · website
Install
The author publishes release zips, so WP-CLI can install straight from GitHub:
wp plugin install https://github.com/dadebertolino/db-debug-manager/releases/download/v1.3.2/db-debug-manager-1.3.2.zipShips its own WordPress updater (built-in updater), so new versions show up under Dashboard → Updates.
Readme
DB Debug Manager
Plugin WordPress per gestire il debug direttamente dal pannello di amministrazione, senza più aprire l'FTP per modificare wp-config.php o scaricare debug.log. Include un sistema di accesso emergency standalone che funziona anche quando WordPress è crashato.
Autore: Davide Bertolino · davidebertolino.it Versione: 1.3.2 Licenza: GPL v2 or later
Cosa fa
Gestione debug standard
- Toggle delle costanti (
WP_DEBUG,WP_DEBUG_LOG,WP_DEBUG_DISPLAY,SCRIPT_DEBUG,SAVEQUERIES) con salvataggio diretto inwp-config.php. - Viewer del
debug.login tempo reale, con filtro, auto-refresh ogni 5 secondi, download e svuotamento. - Query Monitor: snapshot delle query SQL eseguite sull'ultima pagina frontend. Evidenzia le query lente (>50ms) e mostra il caller stack.
- Backup automatico di
wp-config.phpprima di ogni modifica (nella cartella privata randomizzata, deny-all). - Validazione sintattica PHP pre-salvataggio (aborta se la modifica genererebbe parse error).
Emergency Access (v1.1.0)
- File standalone (
emergency.php) che non carica WordPress: funziona anche quando il sito è crashato. - Connessione PDO diretta al DB usando credenziali estratte da
wp-config.php. - Autenticazione con password (hash bcrypt), rate-limit, log accessi, CSRF.
- Azioni disponibili: vedere
debug.log, vedere il PHP error log del server, disattivare tutti i plugin, disattivare un singolo plugin, cambiare al tema default, svuotare i transient, toggle delle costanti debug.
Preflight Snapshots (novità v1.2.0)
- Cattura lo stato del sito (plugin attivi + tema + versioni di tutti i plugin/temi installati).
- Tre trigger: manuale dal pannello, automatico quando attivi l'Emergency Access, automatico dopo ogni aggiornamento completato da WordPress.
- Storico degli ultimi 5 snapshot (FIFO, deduplicazione se lo stato non è cambiato).
- Diff visuale rispetto allo stato attuale: plugin attivati/disattivati, plugin aggiornati con versioni from/to, tema cambiato.
- Rollback selettivo: scegli se ripristinare solo i plugin attivi, solo il tema o entrambi.
- Disponibile anche dall'Emergency standalone — puoi ripristinare uno snapshot anche quando WordPress è down.
Installazione
- Carica lo ZIP da Plugin → Aggiungi nuovo → Carica.
- Attiva il plugin.
- Vai su Strumenti → Debug Manager.
Requisiti
- WordPress 5.8+
- PHP 7.4+
wp-config.phpscrivibile (permessi 0644 consigliati)- Per l'emergency access: estensione
pdo_mysqlattiva
Utilizzo
Tab Costanti
Spunta/deseleziona le costanti e premi Salva. Le modifiche hanno effetto al caricamento successivo di qualsiasi pagina. Se wp-config.php non è scrivibile, i toggle sono disabilitati e compare un alert con il percorso rilevato.
Tab Debug Log
La prima volta che viene generato un errore con WP_DEBUG_LOG attiva, il file /wp-content/debug.log viene creato automaticamente da WordPress.
- Seleziona numero di righe (100–5000).
- Usa il campo Filtra per trovare righe specifiche (
Fatal,Notice, nome file). - Auto-refresh 5s per monitoraggio live.
- Scarica / Svuota in un click.
Tab Query SQL
Attiva SAVEQUERIES dalla tab Costanti, poi visita una pagina frontend. Torna in Debug Manager → Query SQL per vedere SQL eseguite, tempi e caller. Snapshot conservato 1 ora come transient.
Tab Snapshots
Flusso tipico di uso:
- Stai per aggiornare un plugin critico (es: WooCommerce) → vai in Debug Manager → Snapshots → premi "Crea snapshot adesso" con nota
"pre-update WooCommerce 9.3". - Fai l'aggiornamento.
- Se tutto OK: niente da fare, lo snapshot rimane nello storico in caso di problemi scoperti in seguito.
- Se qualcosa si rompe: torna in Snapshots → clicca "Ripristina" sullo snapshot di prima → il DB viene riportato allo stato precedente.
In aggiunta agli snapshot manuali, il plugin crea snapshot automaticamente:
- Quando attivi l'Emergency Access (utile perché tipicamente lo attivi proprio prima di un intervento rischioso).
- Quando WordPress completa un aggiornamento di plugin, tema o core.
Cosa ripristina e cosa no:
- ✅ Lista dei plugin attivi nel DB (
active_plugins) - ✅ Tema attivo (
stylesheet,template) - ❌ Non ripristina i file dei plugin/temi: se il bug è nella nuova versione del file, devi reinstallare la versione vecchia via FTP o via rollback manuale del plugin dalla sua interfaccia.
- ❌ Non ripristina le option custom di configurazione
Gli snapshot mostrano il diff rispetto allo stato attuale (quale plugin è stato aggiornato, da che versione a che versione), così capisci a colpo d'occhio cosa è cambiato.
Uso dall'Emergency standalone: se il sito è down e non puoi accedere al pannello WP, apri emergency.php, fai login, e in fondo alla dashboard trovi la sezione "Snapshot disponibili" con gli stessi controlli di ripristino.
Tab Emergency
- Vai in Debug Manager → Emergency.
- Imposta una password forte (minimo 12 caratteri, con maiuscole/minuscole/numeri). Salvata come hash bcrypt, non recuperabile in chiaro.
- Spunta "Attiva accesso emergency" e salva.
- Tieni in un password manager l'URL:
https://tuosito.com/wp-content/plugins/db-debug-manager/emergency.php
Quando il sito è giù:
- Apri l'URL dell'emergency.
- Inserisci la password.
- Dalla dashboard:
- Ultimi 64KB di
debug.loge PHP error log del server - Disattivare tutti i plugin (per isolare un fatal)
- Disattivare un singolo plugin dall'elenco
- Cambiare al tema default (cerca
twentytwentyfive→twentytwenty) - Svuotare tutti i transient
- Toggle costanti debug (es: attivare
WP_DEBUG_LOGper vedere l'errore)
- Ultimi 64KB di
Sicurezza dell'emergency:
- Default disattivato. Finché non lo attivi esplicitamente,
emergency.phprisponde con errore anche con password giusta. - Dopo 5 tentativi falliti, IP bloccato per 15 minuti. L'IP è
REMOTE_ADDR(non falsificabile); se il sito è dietro proxy/CDN, attiva l'opzione dedicata per usare gli header del proxy. - Ogni tentativo (login, successo, blocco, azione) viene loggato con IP e User-Agent.
- Sessione 30 minuti, cookie HttpOnly + SameSite=Strict.
- CSRF token su ogni azione distruttiva.
- File interni (log, rate-limit, snapshot, backup) in una cartella a nome casuale
private-{token}con.htaccessdeny-all: protetti anche su Nginx. <meta name="robots" content="noindex, nofollow">.
Quando il sito funziona bene, disattiva l'emergency. È una feature da tenere spenta di default e accendere solo nei momenti di crisi.
Note di sicurezza
- Tutte le azioni admin protette da nonce +
manage_options. WP_DEBUG_DISPLAYva tenuto disattivato in produzione.SAVEQUERIESimpatta le performance: solo in debug attivo.- Il backup di
wp-config.php(private-{token}/wp-config.dbdm-bak) viene sovrascritto a ogni modifica; ne esiste sempre solo l'ultimo. - L'emergency access è ad alto rischio: chiunque ottenga la password ha accesso a operazioni distruttive. Trattala come chiave master.
Struttura file
db-debug-manager/
├── db-debug-manager.php # Bootstrap singleton
├── emergency.php # Accesso standalone (no WP)
├── .htaccess # Protezione file sensibili
├── README.md
├── assets/
│ ├── css/
│ │ ├── admin.css
│ │ └── db-admin-ui.css # Design system condiviso
│ └── js/
│ └── admin.js
├── inc/
│ ├── class-admin.php
│ ├── class-config.php # Parser wp-config (WP side)
│ ├── class-emergency.php # Password/log emergency (WP side)
│ ├── class-log.php
│ ├── class-queries.php
│ ├── class-snapshots.php # Preflight capture & rollback
│ ├── class-standalone-config.php # Parser wp-config (no WP deps)
│ └── class-updater.php # GitHub auto-updater
├── index.php # Anti directory-listing
├── private-{token}/ # Auto-creata (nome casuale), log + snapshot + backup
│ ├── .htaccess # Deny all
│ └── index.php
└── templates/
├── page.php
├── tab-config.php
├── tab-log.php
├── tab-queries.php
├── tab-snapshots.php
└── tab-emergency.php
Changelog
1.3.2 — 2026-07-17
- CI/QA: aggiunti GitHub Actions: lint PHP su 7.4 e 8.3, PHPCS con ruleset WPCS (
phpcs.xml.dist: sicurezza ed escaping bloccanti, stile del progetto preservato) e workflow di release che builda lo ZIP con la cartelladb-debug-manager/e lo allega alla Release (richiesto dall'auto-updater, che preferisce l'asset .zip allo zipball). - Conformità WPCS: aggiunti
wp_unslash/sanitizzazione sugli input,esc_html__neiwp_die, rinominate variabili che sovrascrivevano global WordPress ($status,$s,$m,$descriptions), eliminati short ternary. Nessun cambiamento funzionale (suite di regressione completa verde). - Il workflow di release verifica che la versione del tag coincida con header e
DBDM_VERSION.
1.3.1 — 2026-07-16
- Fix: falsi "Errore di sintassi rilevato" su hosting PHP-FPM:
PHP_BINARYpuntava a php-fpm, che non supporta il lint e falliva su qualsiasi contenuto, bloccando ogni salvataggio delle costanti. Il binario di lint viene ora calibrato (deve accettare codice valido e rifiutare codice rotto) con fallback alphpCLI di sistema; se nessun binario è utilizzabile il lint viene saltato (best effort, come conexecdisabilitata).
1.3.0 — 2026-07-16
- Pulizia: rimosso il codice morto della gestione sessioni su file (
session_path(),emergency-sessions.json): l'emergency usa le sessioni PHP native da sempre. - Hardening: token CSRF escapato con
htmlspecialcharsin tutti i campi hidden di emergency.php (coerenza con il resto dell'output). - Fix: un
WP_DEBUG_LOGimpostato a un path custom (stringa) non viene più sovrascritto o azzerato dal salvataggio delle costanti: viene mostrato come attivo con il path visibile, il toggle off lo memorizza in wp_options e il toggle on lo ripristina. Anche la dashboard emergency ora riconosce i path stringa. - Sicurezza: la validazione sintattica PHP pre-salvataggio di
wp-config.phpora è attiva anche nel toggle costanti dall'Emergency standalone (prima solo dal pannello WP). Logica di sostituzione/inserimento e lint consolidate inDBDM_Standalone_Config: un'unica implementazione condivisa dai due contesti. - Sicurezza: la cartella dei file interni (log accessi, snapshot, backup wp-config) ora ha un nome casuale (
private-{token}) non indovinabile: i file restano protetti anche su Nginx, dove l'.htaccessviene ignorato. Migrazione automatica dalla vecchiaprivate/; il token è in wp_options ed è letto anche dall'emergency standalone. Aggiuntoindex.phpnella root del plugin contro il directory listing. - Sicurezza: su server non-Apache il pannello mostra un avviso con lo snippet Nginx per il deny esplicito.
- Sicurezza (importante): il backup di
wp-config.phpviene ora salvato inprivate/wp-config.dbdm-bak(cartella con deny-all) invece che accanto awp-config.php, dove poteva essere scaricato come testo semplice esponendo le credenziali del database. - Sicurezza (importante): il rate-limit dell'emergency access ora usa
REMOTE_ADDRinvece degli headerX-Forwarded-For/CF-Connecting-IP, che sono falsificabili dal client e permettevano di aggirare il blocco tentativi. Se il sito è dietro un proxy/CDN fidato, attiva la nuova opzione nella tab Emergency per usare gli header del proxy (viene letto l'ultimo hop di X-Forwarded-For, non il primo). - Migrazione: il vecchio backup
wp-config.php.dbdm-baknella webroot viene eliminato automaticamente alla prima apertura del pannello o alla prima modifica delle costanti. Se hai usato versioni ≤ 1.2.0, verifica comunque che il file non sia più presente.
1.2.0 — 2026-04-16
- Nuovo: tab Snapshots — preflight capture dello stato del sito (plugin attivi + tema + versioni) con rollback selettivo.
- Nuovo: snapshot automatici su attivazione Emergency e dopo ogni aggiornamento completato da WordPress (
upgrader_process_complete). - Nuovo: diff visuale snapshot vs stato corrente (plugin attivati/disattivati, versioni from→to, tema cambiato).
- Nuovo: ripristino snapshot anche dall'Emergency standalone — il file JSON è condiviso tra i due contesti.
- Nuovo: deduplicazione snapshot identici entro 60 secondi.
1.1.0 — 2026-04-16
- Nuovo: tab Emergency Access con password protetta.
- Nuovo: file standalone
emergency.phpfunzionante senza WordPress caricato. - Nuovo: azioni di ripristino dalla dashboard emergency.
- Nuovo: sicurezza: rate-limit 5/15min, log tentativi, CSRF token, sessione 30min cookie HttpOnly+SameSite=Strict.
- Nuovo: cartella
private/auto-creata con.htaccessdeny-all.
1.0.0 — 2026-04-16
- Prima release.
- Toggle costanti
WP_DEBUGet al. con salvataggio inwp-config.php. - Viewer log con filtro, auto-refresh, download, svuotamento.
- Query monitor con cattura snapshot frontend.
- Backup automatico + lint PHP pre-salvataggio.
- Auto-updater da GitHub Releases.
Licenza
GPL v2 or later. Niente registrazioni, niente nag, niente trucchi.
Read the full README on GitHub →