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);
}
}

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.