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