Releases: Assistouest/Always-Analytics
V2.6.2
fix: dashboard vide avec les permaliens bruts (plain)
Problème
Le dashboard admin affichait des KPI vides et aucune donnée sur les nouvelles installations WordPress utilisant les permaliens par défaut (mode brut ?p=123).
Le tracking fonctionnait correctement (les hits et sessions étaient bien enregistrés en base), mais toutes les requêtes REST du dashboard échouaient silencieusement.
Cause
Avec les permaliens bruts, rest_url() génère une URL contenant déjà un ? :
https://example.com/index.php?rest_route=/always-analytics/v1/
Les fonctions apiFetch() concaténaient ensuite un second ? pour les paramètres de requête :
.../index.php?rest_route=/always-analytics/v1/overview?from=2026-03-17&to=2026-03-17
Résultat : from, to et tous les paramètres étaient absorbés dans la valeur de rest_route au lieu d'être interprétés comme des query params séparés. WordPress ne reconnaissait pas la route → réponse vide ou 404.
Sur les sites avec des jolis permaliens (/wp-json/...), le ? était bien le premier séparateur et tout fonctionnait normalement, ce qui expliquait pourquoi le bug n'apparaissait que sur les nouvelles installations.
Correctif
Détection du séparateur approprié (& si l'URL contient déjà ?, sinon ?) dans les deux fichiers concernés :
admin/js/always-analytics-admin.js
- fetch(API_BASE + endpoint + '?' + qs, {
+ var sep = API_BASE.indexOf('?') !== -1 ? '&' : '?';
+ fetch(API_BASE + endpoint + sep + qs, {admin/js/always-analytics-engagement.js
- fetch( API + endpoint + '?' + qs, {
+ var sep = API.indexOf('?') !== -1 ? '&' : '?';
+ fetch( API + endpoint + sep + qs, {Impact
- Corrige le dashboard vide sur toute installation avec permaliens bruts
- Aucun impact sur les sites utilisant les jolis permaliens
- Aucune modification côté PHP ou base de données
V2.6.1
fix: Correction d'un bug qui empêchait la table aa_hits d'être créée
Problème
Sur certaines installations (notamment sous LiteSpeed), la table wp_aa_hits n'était jamais créée, ce qui rendait le tracking totalement non fonctionnel : le endpoint /wp-json/always-analytics/v1/hit répondait 204 mais n'enregistrait aucune donnée. Les tables aa_sessions restaient également vides. Seule aa_scroll recevait des données car elle n'a pas de dépendance sur aa_hits.
Plusieurs bugs indépendants se combinaient pour produire ce résultat.
Corrections apportées
includes/class-always-analytics-activator.php
1. Espacement insuffisant dans les CREATE TABLE (cause racine)
dbDelta exige au minimum 2 espaces entre le nom d'une colonne et son type. Avec un seul espace, il échoue silencieusement et ne crée pas la table.
Colonnes corrigées :
| Table | Colonne |
|---|---|
| aa_hits | referrer_domain, browser_version |
| aa_sessions | max_scroll_depth |
| aa_daily | unique_visitors |
2. Colonne is_superseded absente du DDL
La colonne is_superseded était référencée dans un KEY du CREATE TABLE mais n'était pas déclarée comme colonne. dbDelta refusait silencieusement de créer l'index, et le tracker échouait à chaque INSERT avec Unknown column 'is_superseded'.
3. Verrou de version permanent
update_option('always_analytics_version', AA_VERSION) s'exécutait même lorsque dbDelta avait échoué. Lors des tentatives suivantes, maybe_update() voyait la version déjà à jour et ne relançait plus jamais create_tables(). Le site se retrouvait définitivement bloqué sans table.
Fix : update_option ne s'exécute désormais que si SHOW TABLES LIKE 'aa_hits' confirme que la table existe réellement.
4. activate() ne forçait pas la création des tables
activate() déléguait à maybe_update() qui vérifie la version stockée. Si une version était déjà enregistrée (suite à une tentative échouée), les tables n'étaient jamais recrées à la réactivation.
Fix : activate() appelle create_tables() directement, sans condition de version. L'activation crée toujours les tables.
5. $cols périmé dans la migration
Après l'ALTER TABLE ADD COLUMN hit_source, la variable $cols n'était pas rechargée. La vérification suivante de is_superseded utilisait un snapshot obsolète de la structure de table.
Fix : $cols est rechargé via DESCRIBE immédiatement après chaque ALTER TABLE ADD COLUMN.
6. Index composites créés avant la colonne qu'ils référencent
Les ALTER TABLE ADD INDEX idx_hit_at_ns (hit_at, is_superseded) pouvaient s'exécuter avant que la colonne is_superseded soit garantie présente, causant un refus silencieux de MySQL.
Fix : l'ordre est maintenant strict — colonne d'abord, index ensuite, avec un SHOW INDEX rechargé après les ALTER TABLE ADD COLUMN.
includes/class-always-analytics-tracker.php
7. SELECT COUNT(*) dans track_noscript
La déduplication noscript utilisait encore SELECT COUNT(*) … LIMIT 1 avec un test > 0, au lieu du pattern SELECT 1 … LIMIT 1 avec test !== null appliqué partout ailleurs (P-02).
Fichiers modifiés
includes/class-always-analytics-activator.phpincludes/class-always-analytics-tracker.php
Always Analytics V2.6.0
✨Améliorations de l’analyse d’engagement
Cette mise à jour améliore la lisibilité et la compréhension de l’engagement des visiteurs, avec une interface plus pédagogique et de nouveaux indicateurs pensés pour être accessibles aux débutants.
📊 Segmentation des comportements de lecture
Une nouvelle classification permet de mieux visualiser comment les visiteurs lisent une page :
- Zappeur – visiteurs quittant rapidement la page.
- Curieux – lecture partielle pour se faire une idée du contenu.
- Lecteur compulsif – lecture rapide et ciblée pour trouver une information précise.
- Super-lecteur – lecture complète indiquant un fort engagement.
Cette segmentation aide à comprendre rapidement si le contenu correspond aux attentes des visiteurs.
🧠 Wilson Engagement Score
L’interface du Wilson Engagement Score a été simplifiée pour mieux expliquer les signaux qui composent le score :
- Durée : temps passé sur la page.
- Scroll : profondeur de lecture.
- Engagement : sessions actives (visites non superficielles).
- Retour : visiteurs qui reviennent consulter la page.
- Profondeur : navigation vers d’autres pages après la lecture.
Ces indicateurs permettent d’évaluer la qualité réelle de l’engagement.
🔎 Transparence sur les sources de tracking
Un nouveau tableau indique l’origine des données collectées :
- JavaScript – méthode principale de tracking
- Pixel noscript – fallback pour les environnements sans JavaScript
- Pré-consentement – événements collectés avant validation du consentement
Cela permet de mieux comprendre d’où proviennent les statistiques et leur fiabilité.
V2.5 Automatisation du RGPD et amélioration de la qualité des stats
Automatisation du RGPD et amélioration de la qualité des stats
V2.4
Changements dans ce diff
- Remplacement de tous les emojis par des icônes Lucide SVG inline (onglets, bannière RGPD, en-têtes de cards, checklist, boutons, notes) — uniquement lorsque cela apporte une réelle valeur UX.
- Harmonisation typographique entre Dashboard / Engagement / Settings :
- Titres de section : 20px
- Headers de cards : 14px
- Texte de corps : 13px
- Valeurs KPI : 28px
- Déplacement du toggle de géolocalisation dans l’onglet Tracking :
- suppression de l’onglet dédié
- mise à jour de la logique JS
formTabs.
- Mise à jour de la checklist RGPD : la ligne « Politique de confidentialité » ne comporte plus le badge « Conforme » (non vérifiable).
Elle est remplacée par un lien violet direct versoptions-privacy.php?tab=policyguide.
Nouveautés
-
Mode Événements
- annotations de campagnes affichées sur le graphique
- modal de création d’événement
- liste des événements avec édition et suppression.
-
Filtrage des robots amélioré
- détection de Lighthouse, PageSpeed, GTmetrix
- Chrome Headless
- UptimeRobot, Pingdom
- Ahrefs, Semrush, Moz
- scans
xmlrpcetwp-login.
v2.3
[2.3.0] - 2026-03-10
✨ Nouveautés
Bloc Référents — refonte complète
- Nouveau système de filtrage par catégorie : Tous / Moteurs / Réseaux / IA / Sites
- Badges de comptage dynamiques sur chaque onglet
- Favicons via Google S2 avec fallback initiale colorée (suppression des emojis)
- Scroll interne (hauteur fixe 416px) — plus de troncature à 8 résultats
- Fichier source de vérité
data/referrer-sources.php— éditable sans toucher au code - Patterns regex ancrés
(^|\.)— zéro faux positif (ex:copilot.microsoft.comne matchait plustwitter\.)
Bloc Appareils & Navigateurs — refonte complète
- Nouveau système de filtrage par type d'appareil : Tous / Desktop / Mobile / Tablette
- Badges de comptage sur les onglets mis à jour dynamiquement
- Navigateurs et OS affichés avec favicon + fallback initiale colorée
- Scroll interne identique aux référents
- Titres de section sticky dans le scroll
Détection navigateurs & OS — couverture étendue
- Navigateurs ajoutés : Opera GX, Opera Mini, Samsung Browser, Yandex Browser, Brave, Vivaldi, DuckDuckGo, Puffin, UCBrowser, QQ Browser, Baidu Browser, Silk, Firefox Focus
- OS ajoutés : Windows 11, Windows Vista, Windows XP, Windows Phone, iPadOS, Ubuntu, Fedora, Debian, Linux Mint, BlackBerry, Symbian, KaiOS, Tizen, HarmonyOS
- Ordre de détection corrigé : iOS avant macOS, Copilot avant Bing, Chrome après tous les dérivés Chromium
🔧 Améliorations
Algorithme de score d'engagement — correction Wilson globale
- Avant : Wilson appliqué uniquement sur le signal Engagement (taux binaire), + signal Confiance à paliers arbitraires (8%)
- Après : Wilson appliqué sur P_brut global (synthèse pondérée des 5 signaux) — la pénalité d'incertitude s'applique à l'ensemble du score de façon continue et rigoureuse
- Signal "Confiance statistique" supprimé comme poids — remplacé par le facteur Wilson affiché en lecture seule (ratio S_final / P_brut, 100% = aucune pénalité)
- Poids renormalisés sur 5 signaux : Durée (~24%) • Scroll (~22%) • Engagement (~22%) • Fidélité (~20%) • Profondeur (~13%)
- Tooltips et en-têtes de colonnes mis à jour dans l'interface
🐛 Correctifs
- Faux positifs référents : patterns regex non ancrés causaient des matchs incorrects (ex:
copilot.microsoft.com→ "Twitter / X",www.reddit.com→ "Twitter / X") - Emojis hors-BMP (
𝕏U+1D54F) : suppression complète — plus de risque de corruption du parsing HTML viainnerHTML - Cache navigateur : versionnage des assets CSS/JS via
filemtime()— le navigateur charge toujours la dernière version
🔒 Confidentialité
- Nouvelle option fenêtre d'unicité cookieless (Réglages → Confidentialité & RGPD) :
daily(défaut) ousession— conforme aux recommandations CNIL pour le cookieless
V2.1.0
fix/dashboard-session-quality-metrics
fix(dashboard) : exclure les sessions sans données des métriques de qualité
Trois corrections ont été apportées dans api/class-always-analytics-rest.php :
1. engagement/pages : total_sessions aligné sur les sessions mesurables
Le comptage des sessions est ajusté pour ne prendre en compte que celles disposant d’une mesure temporelle (durée ou temps d’engagement). Ainsi, le dénominateur du score de confiance (signal 6) repose désormais uniquement sur des sessions réellement mesurables.
2. Graphique temporel (aujourd’hui) : sessions par heure
Le même filtrage est appliqué au comptage horaire : les sessions dont la durée = 0 et engagement_time = 0 sont exclues de la courbe.
3. Graphique temporel (plage de dates) : sessions par jour
La même correction est appliquée au comptage groupé par jour.
Note :
Le compteur « Sessions » de la carte du dashboard reste un comptage brut des visites.
Seules les métriques de qualité (durée moyenne, taux d’engagement, scores, etc.) excluent les sessions ne contenant aucune donnée mesurable.
Always-Analytics V2.0.0
Cette version marque une évolution importante du projet. Always-Analytics 2.0 introduit un modèle d’analyse plus robuste, orienté qualité de lecture et fiabilité statistique.
✨ Nouveautés
Score d’engagement avancé
Introduction d’un algorithme de scoring composite permettant d’évaluer la performance réelle des contenus en combinant plusieurs signaux comportementaux :
- temps de lecture
- profondeur de scroll
- engagement actif
- fidélité des visiteurs
- profondeur de navigation
Algorithme de qualité basé sur la loi de Wilson
Le classement des contenus intègre désormais la borne inférieure de l’intervalle de confiance de Wilson, ce qui permet de réduire les biais liés aux petits volumes de données.
🔒 Sécurité
Cette version corrige plusieurs vulnérabilités et renforce la sécurité générale du plugin.
Correctifs de sécurité
- Correction d’une faille XSS potentielle dans l’affichage de certaines données analytiques.
- Correction d’une faille CSRF sur certaines actions administrateur.
- Ajout de la vérification des nonces WordPress sur les requêtes sensibles.
- Correction d’un risque d’injection SQL sur certaines requêtes analytiques dynamiques.
Améliorations supplémentaires
- Durcissement global du traitement des données collectées.
- Réduction de la surface d’attaque sur les endpoints de collecte.
- Meilleure isolation entre données analytiques et interface d’administration.
🔄 Changement de nom
Le plugin Statify devient désormais Always-Analytics.
Ce changement de nom reflète l’évolution du projet : d’un simple outil de statistiques vers une solution d’analytics orientée qualité d’engagement et analyse comportementale.
Migration automatique
Lors de la mise à jour vers Always-Analytics v2.0.0, une migration automatique de la base de données est exécutée.
Cette migration permet de :
- conserver toutes vos données statistiques existantes
- adapter la structure de la base de données aux nouvelles fonctionnalités
- assurer une transition transparente entre Statify et Always-Analytics
Aucune action n’est requise de votre côté : la migration est exécutée automatiquement lors de l’activation de la nouvelle version.