samedi 26 septembre 2026

À propos

Contact

Tests

Snapshot tester la sortie fusionnée de plusieurs fichiers theme.json superposés

Thème, thème enfant et préférences utilisateur se superposent en un seul jeu de réglages. Un test snapshot garantit que cette fusion reste stable après chaque changement.

Par Clément Hadrot • 5 avril 2023 • 4 min de lecture • Aucun commentaire
Snapshot tester la sortie fusionnée de plusieurs fichiers theme.json superposés

Un thème enfant que nous maintenons pour un réseau de boutiques de décoration surcharge la palette de couleurs et l’échelle typographique définies par le thème parent, via son propre theme.json. Lors d’une mise à jour du thème parent, une restructuration de la clé settings.color.palette a silencieusement cassé la fusion : le thème enfant continuait de déclarer ses couleurs à l’ancien format, et l’éditeur de site affichait une palette incohérente, mélangeant anciennes et nouvelles couleurs sans qu’aucune erreur ne soit visible.

Vérifier chaque fichier theme.json séparément n’aurait rien révélé : le problème n’existait que dans le résultat de la fusion des deux fichiers, une étape interne à WordPress qu’il faut donc tester directement en sortie, pas en entrée.

Comprendre ce que WordPress fusionne réellement

WordPress construit l’arbre de réglages final en superposant, dans cet ordre de priorité croissante, le theme.json du thème parent, celui du thème enfant s’il existe, puis les réglages personnalisés enregistrés par l’utilisateur via l’éditeur de site. La fonction WP_Theme_JSON_Resolver::get_merged_data() expose précisément ce résultat fusionné, sous forme d’un objet WP_Theme_JSON :

$donnees_fusionnees = WP_Theme_JSON_Resolver::get_merged_data();
$reglages = $donnees_fusionnees->get_settings();

Écrire le test snapshot

Un test snapshot compare une sortie générée à une version de référence enregistrée précédemment, et signale toute différence. PHPUnit ne propose pas nativement ce mécanisme, mais il se construit simplement avec un fichier JSON de référence versionné dans le dépôt :

class Test_Fusion_Theme_Json extends WP_UnitTestCase {

    public function test_fusion_reglages_couleur_stable(): void {
        switch_theme('theme-enfant-deco');

        $reglages = WP_Theme_JSON_Resolver::get_merged_data()->get_settings();
        $palette_fusionnee = $reglages['color']['palette']['theme'] ?? [];

        $chemin_snapshot = __DIR__ . '/snapshots/palette-fusionnee.json';

        if (!file_exists($chemin_snapshot)) {
            file_put_contents($chemin_snapshot, json_encode($palette_fusionnee, JSON_PRETTY_PRINT));
            $this->markTestSkipped('Snapshot initial créé, à valider manuellement avant relance.');
        }

        $snapshot_reference = json_decode(file_get_contents($chemin_snapshot), true);

        $this->assertEquals($snapshot_reference, $palette_fusionnee);
    }
}
L'essentiel à retenir : WordPress fusionne trois niveaux de theme.json en un seul arbre de réglages ; Un snapshot capture cet arbre fusionné, pas chaque fichier isolément ; Une différence de snapshot inattendue signale une régression de fusion

La création automatique du snapshot au premier passage évite d’avoir à l’écrire à la main, mais impose une relecture humaine avant de le committer — un snapshot généré sans validation ne prouve rien, il fige simplement l’état actuel, bugué ou non.

Mettre à jour le snapshot volontairement

Quand une évolution du thème modifie légitimement la palette fusionnée, le snapshot doit être régénéré consciemment, jamais silencieusement par un test qui l’écraserait automatiquement en cas d’échec :

rm tests/snapshots/palette-fusionnee.json
phpunit --filter test_fusion_reglages_couleur_stable
git diff tests/snapshots/palette-fusionnee.json

La revue de ce git diff avant de committer le nouveau snapshot est l’étape qui aurait intercepté la régression décrite en introduction : la différence inattendue de structure aurait sauté aux yeux du relecteur, au lieu de rester invisible dans l’éditeur de site.

Étendre le test à d’autres sections de réglages

  • La typographie fusionnée (settings.typography.fontSizes), particulièrement sensible aux changements d’échelle fluide introduits en 6.1.
  • Les styles globaux de blocs (styles.blocks), souvent oubliés alors qu’ils suivent la même logique de superposition à trois niveaux.
  • Les réglages de mise en page (settings.layout.contentSize, wideSize), qui influencent directement le rendu visuel de chaque page construite avec l’éditeur de site.

Un snapshot n’a de valeur que si quelqu’un le relit vraiment au moment où il change — sinon, il ne fait que déplacer le bug d’un endroit silencieux à un autre endroit silencieux, juste versionné.

Ce sujet ne couvre pas

Cette approche porte spécifiquement sur la fusion de theme.json entre plusieurs niveaux de thème. Les tests snapshot appliqués au rendu HTML de blocs individuels ou de shortcodes répondent à un besoin voisin mais distinct, déjà traité séparément, où l’objet snapshoté est un fragment de rendu plutôt qu’un arbre de configuration.

En résumé

Tester chaque fichier theme.json isolément ne protège en rien contre une régression de fusion, puisque le bug n’existe que dans le résultat combiné que WordPress construit à l’exécution. Un test snapshot sur la sortie de get_merged_data(), relu consciemment à chaque mise à jour volontaire, transforme une classe de régression auparavant invisible en une différence de texte que n’importe quel relecteur peut immédiatement interpréter.

Partager :

À propos de l'auteur

Clément Hadrot

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi