DB Privacy Hub
Open Source — GPL v2 DB Privacy Hub Hub privacy unificato per l’ecosistema plugin DB. Genera la Privacy Policy che…
Tracciamento visite server-side: nessun cookie, nessun servizio esterno, solo visite reali. I dati restano nel tuo database.
Versione 3.3.0 · Davide Bertolino · WordPress 5.8+ · PHP 7.4+ · GPL v2
Ho realizzato questo plugin per davidebertolino.it con un obiettivo preciso: misurare le visite al sito senza installare un singolo servizio di terze parti. Google Analytics profila gli utenti. Matomo è potente ma complesso. Plausible è a pagamento. Nessuno di questi era quello che cercavo per un sito personale di una scuola o di un piccolo professionista.
DB Site Analytics traccia le visite completamente lato server, usando l’hook template_redirect di WordPress. Nessuno script viene aggiunto alle pagine per contare le visite, gli ad-blocker non possono bloccarlo, le performance non vengono toccate. I dati finiscono nel database WordPress del sito — e solo lì. Niente cookie, niente dati a terzi: in genere non serve il banner di consenso.
⚠️ Google Analytics non è conforme al GDPR per i siti europei. Il Garante italiano, insieme alle autorità di Francia, Austria e altri paesi UE, ha stabilito che il trasferimento di dati personali (incluso l’indirizzo IP) verso server negli USA viola il GDPR perché non garantisce un livello di protezione adeguato. Per le scuole e le pubbliche amministrazioni italiane, usare Google Analytics senza le dovute cautele espone a sanzioni. DB Site Analytics non trasferisce nessun dato fuori dal tuo server — il problema non si pone.
La 3.3.0 è un aggiornamento dedicato all’accuratezza. Un contatore server-side vede ogni richiesta che arriva a WordPress, non solo le persone: nelle statistiche finivano scanner che cercavano /.env o /up.php, bot che martellavano la ricerca interna e perfino il sito stesso tra i primi referrer. Ora le statistiche contano solo visite reali.
Dopo l’aggiornamento visite e referral caleranno: è normale, quei numeri non misuravano visite vere. Il dettaglio completo è nel changelog.
La dashboard admin mostra tutto quello che serve per capire come viene usato il sito, senza diventare un cruscotto da data scientist.
Un contatore lato server riceve anche tutto ciò che non è una persona. Dalla versione 3.3.0 il plugin scarta le richieste che non corrispondono a una pagina visitata da un essere umano:
.env, wp-login.php o file PHP vulnerabili non finiscono più tra le pagineLa lista dei pattern bot è estendibile con il filtro dbsa_bot_patterns.
Il plugin è progettato per ridurre al minimo i dati personali. Non viene salvato nessun indirizzo IP, non vengono installati cookie, non viene inviato nulla a server di terze parti. Per contare i visitatori unici senza identificarli, viene usato un hash giornaliero:
visitor_hash = SHA256(IP + User-Agent + salt_giornaliero)
Il salt cambia a mezzanotte, nel fuso orario del sito, e quello del giorno precedente viene eliminato: da quel momento l’hash non è più ricollegabile a nessun visitatore. Durante la giornata è un dato pseudonimo, non anonimo; dopo la rotazione non esiste più modo di risalire alla persona.
In genere non serve il banner di consenso, perché non si usano cookie né altri strumenti sul dispositivo del visitatore. Il trattamento va comunque descritto nell’informativa privacy del sito.
Attivando il GeoIP, la dashboard mostra da quali paesi arrivano le visite. Il plugin scarica il database gratuito DB-IP Country Lite (~10 MB) direttamente sul tuo server e lo aggiorna ogni mese: il lookup avviene in locale, senza chiamate a servizi esterni durante il tracciamento.
Vuoi sapere quante volte viene scaricato un PDF o un file ZIP? Abilita il tracking dei download dalle impostazioni. Il plugin aggiunge un piccolo script (~1KB) nel frontend che intercetta i click sui link a file con estensioni configurabili.
navigator.sendBeacon — non blocca la navigazioneDue tipi di evento tracciabili, entrambi opzionali e attivabili separatamente dalle impostazioni.
requestAnimationFrameDue report che non richiedono nessuno script: il plugin li ricava direttamente dalle richieste che arrivano al server. Sono attivi di default e disattivabili dalle impostazioni.
I termini cercati possono contenere dati personali: se attivi il report, citalo nell’informativa privacy.
Le correzioni sull’accuratezza valgono dal momento dell’aggiornamento. Per ripulire anche i dati registrati in passato, in Analytics → Impostazioni c’è la sezione Bonifica storico:
Un backup del database prima di procedere resta comunque una buona idea.
Vuoi mostrare il numero di visite direttamente in una pagina o in un post? Usa lo shortcode [dbsa_views].
| Shortcode | Risultato |
|---|---|
[dbsa_views] | Visite alla pagina corrente, ultimi 30 giorni |
[dbsa_views period="7"] | Ultimi 7 giorni |
[dbsa_views page_id="123"] | Visite a una pagina specifica |
[dbsa_views type="visitors"] | Visitatori unici invece di pageview |
[dbsa_views format="compact"] | “1.234 visite” — numero + etichetta |
[dbsa_views format="number"] | Solo il numero |
Il plugin espone una REST API autenticata per integrare le statistiche in applicazioni esterne, dashboard personalizzate o script. Richiede il capability manage_options. Le date sono giorni nel fuso orario del sito.
GET /wp-json/dbsa/v1/stats?from=2026-09-01&to=2026-09-30
GET /wp-json/dbsa/v1/stats/pages?limit=10
GET /wp-json/dbsa/v1/stats/referrers
GET /wp-json/dbsa/v1/stats/devices
GET /wp-json/dbsa/v1/stats/daily
GET /wp-json/dbsa/v1/stats/downloads
GET /wp-json/dbsa/v1/stats/events
/stats/devices include il breakdown per paese; /stats/events restituisce link esterni, scroll depth, ricerche interne e anteprime di condivisione.
Tutti i dati sono esportabili in CSV direttamente dalla dashboard, filtrati per intervallo di date. I file usano il separatore ; e il BOM UTF-8 per la compatibilità con Excel italiano.
Il plugin si aggiorna direttamente dal pannello Plugin di WordPress, come quelli del repository ufficiale. Quando esce una nuova versione, ricevi la notifica e aggiorni con un clic. Niente download manuali, niente ZIP da ricaricare.
⚠️ Cache di pagina. Il conteggio delle pageview avviene in PHP: se usi una cache di pagina completa (WP Super Cache, LiteSpeed Cache, Cloudflare APO…), le pagine servite dalla cache non vengono contate. Download ed eventi, tracciati via JavaScript, non hanno questo limite.
| Funzionalità | Costo |
|---|---|
| Tracciamento pageview server-side | Gratis |
| Filtro bot, 404 e richieste non umane | Gratis |
| Dashboard con grafico e KPI | Gratis |
| Confronto periodi con variazione % | Gratis |
| Breakdown dispositivi, browser, OS | Gratis |
| Geolocalizzazione per paese | Gratis |
| Download tracking | Gratis |
| Tracking eventi (outbound + scroll) | Gratis |
| Ricerche interne e anteprime di condivisione | Gratis |
| Bonifica storico | Gratis |
Shortcode [dbsa_views] | Gratis |
| REST API | Gratis |
| Export CSV (pageview, download, eventi) | Gratis |
| Widget dashboard WordPress | Gratis |
| Aggiornamenti automatici da WordPress | Gratis |
| Versione “Pro” con funzionalità aggiuntive | Non esiste |
Il tracciamento delle pageview è attivo immediatamente dopo l’attivazione, insieme ai report di ricerche interne e condivisioni. Non è richiesta nessuna configurazione iniziale e le visite dello staff sono escluse di default. Per abilitare download, eventi e geolocalizzazione, vai su Analytics → Impostazioni.
Se aggiorni da una versione precedente, dai un’occhiata alla sezione Bonifica storico per ripulire anche i dati passati.
Per chi vuole capire cosa gira sotto il cofano.
Il plugin crea tre tabelle con prefisso {prefix}dbsa_:
dbsa_pageviews — ogni visita registrata, con dominio di provenienza normalizzato (referrer_host), paese e flag is_bot usato dalla bonifica; index su created_at, page_url e visitor_hash, created_atdbsa_downloads — click su file scaricabilidbsa_events — eventi (outbound, scroll, ricerche, condivisioni), con index su event_type, created_atLe tabelle vengono create con dbDelta() all’attivazione e aggiornate automaticamente quando cambia lo schema. Le migrazioni pesanti, come il ricalcolo del dominio di provenienza sullo storico, girano in background a blocchi tramite WP-Cron. Le date sono salvate in UTC e convertite nel fuso orario del sito solo in lettura. La pulizia dei dati scaduti avviene ogni notte, rispettando la retention configurata.
db-site-analytics/
├── db-site-analytics.php # Entry point: singleton, hook attivazione
├── uninstall.php # Rimozione completa di tabelle e opzioni
├── inc/
│ ├── class-db.php # Tabelle, query, migrazioni, bonifica storico
│ ├── class-tracker.php # Pageview, filtro bot e 404, ricerche, condivisioni
│ ├── class-visitor.php # Hash giornaliero, salt, IP, rate limiting
│ ├── class-geoip.php # Download e lookup database DB-IP
│ ├── class-mmdb-reader.php # Lettore MMDB in PHP puro
│ ├── class-downloader.php # Download tracking (JS + AJAX handler)
│ ├── class-events.php # Tracking eventi (JS + AJAX handler)
│ ├── class-shortcodes.php # Shortcode [dbsa_views]
│ ├── class-rest-api.php # REST API /wp-json/dbsa/v1/
│ ├── class-exporter.php # CSV export
│ ├── class-admin.php # Dashboard, menu, impostazioni, widget WP
│ └── class-updater.php # GitHub auto-updater
├── templates/admin/
│ ├── dashboard.php
│ ├── downloads.php
│ ├── events.php
│ ├── settings.php
│ └── widget.php
└── assets/
├── css/
│ ├── db-admin-ui.css # Design system admin condiviso
│ ├── admin.css # Stili plugin-specifici admin
│ └── frontend.css # Stili shortcode frontend
└── js/
├── admin.js # Grafici della dashboard
├── downloader.js # Frontend download tracker (~1KB)
├── events.js # Frontend events tracker (~1.5KB)
└── vendor/
└── chart.umd.min.js # Chart.js 4.4.0 (MIT), incluso nel plugin
.env, up.php, wp-login…), le richieste HEAD, il prefetch/prerender del browser, favicon, anteprime ed embeddbsa_bot_patternsreferrer_host, storico ricalcolato in backgroundsearches e share_previews nell’endpoint REST /stats/events[dbsa_views] senza attributi in errore fatale su WordPress ≤ 6.4//dominio non tracciati/stats/referrers il campo referrer contiene ora il dominio normalizzatocountries nell’endpoint REST /stats/devices/stats/downloads e /stats/events — la REST API copre ora tutte le metriche (7 endpoint)REMOTE_ADDR; gli header X-Forwarded-For/CF-Connecting-IP vengono usati solo se l’opzione è attivaSHOW TABLES a ogni pageview$wpdb restituisce stringhe, aggiunti cast espliciti prima di operazioni aritmetiche su browser, OS e scroll depthint|false) introdotti in PHP 8.0[dbsa_views]/stats, /stats/pages, /stats/referrers, /stats/devices, /stats/daily)[dbsa_views] con parametri page_id, period, type, formatdbsa_eventsGPL v2 or later. Sei libero di utilizzare, modificare e distribuire il plugin. Il codice sorgente è disponibile su GitHub.
Davide Bertolino — davidebertolino.it — info@davidebertolino.it
✅ Nessuna registrazione. Nessun reminder. Nessun trucco.
Scarica, installa, usa. Niente account, niente popup, niente “passa a Pro”, niente telemetria. Niente Google. Il codice è tuo, la licenza è GPL v2, le funzionalità sono tutte incluse. Fine.
Hai suggerimenti o hai trovato un bug? Contattami!
Open Source — GPL v2 DB Privacy Hub Hub privacy unificato per l’ecosistema plugin DB. Genera la Privacy Policy che…
Open Source — GPL v2 DB SEO Manager SEO completa per WordPress, costruita prima di tutto per il GDPR. Niente…
Open Source — GPL v2 DB Event Manager Gestione eventi con iscrizione, QR code personale, check-in da telefono e survey…