Skip to content

V2.6.1

Choose a tag to compare

@Assistouest Assistouest released this 16 Mar 11:39
· 6 commits to main since this release
f767555

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.php
  • includes/class-always-analytics-tracker.php