vendredi 25 septembre 2026

À propos

Contact

Blocs Gutenberg

« Notion : validation, migration et récupération, souvent confondues »

Trois mécanismes internes du parser de blocs se confondent souvent quand un contenu ancien pose problème. Voici ce que chacun fait réellement, et où s'arrête sa responsabilité.

Par Clément Hadrot • 25 février 2026 • 4 min de lecture • Aucun commentaire
"Notion : validation, migration et récupération, souvent confondues"

« Le bloc a été migré automatiquement » entend-on parfois d’un client après un incident de contenu, alors qu’en réalité rien n’a été migré du tout, seulement invalidé. Cette confusion entre validation, migration et récupération revient souvent, y compris chez des développeurs expérimentés qui manipulent ces mécanismes sans toujours distinguer précisément où s’arrête la responsabilité de chacun.

La validation : un simple comparateur, jamais un correcteur

La validation de bloc consiste à recalculer le rendu attendu à partir des attributs actuels (via la fonction save active) et à le comparer au HTML réellement stocké dans post_content. Si les deux diffèrent au-delà d’une tolérance de normalisation d’espaces, le bloc est marqué invalide. C’est tout ce que fait la validation : elle constate un écart, elle ne modifie jamais le contenu stocké, et elle ne sait absolument rien de la cause de cet écart, qu’il s’agisse d’un vrai changement de structure ou d’une simple différence d’encodage de caractères.

La migration : transformer un ancien format vers le nouveau

La migration intervient dans le cadre du tableau deprecated de registerBlockType. Chaque entrée de ce tableau décrit un ancien schéma d’attributs et un ancien save, avec optionnellement une fonction migrate qui transforme les anciennes valeurs d’attributs vers le nouveau format actif. La migration ne s’exécute que lorsque l’éditeur détermine, via isEligible ou par correspondance de structure, qu’une entrée de déprécation correspond au contenu stocké.

const v1 = {
  attributes: { titre: { type: 'string', source: 'text', selector: 'h3' } },
  migrate({ titre }) {
    return { titre: titre.toUpperCase(), soulignement: false };
  },
  save({ attributes }) { /* ancien rendu */ },
};
L'essentiel à retenir : La validation compare, elle ne corrige jamais rien elle-même ; La migration transforme des attributs d'un ancien format vers un nouveau ; La récupération est une action manuelle proposée à l'utilisateur

Un point souvent mal compris : la migration ne s’exécute qu’au moment où l’éditeur charge et affiche ce bloc précis dans son interface. Un article jamais rouvert dans l’éditeur depuis la mise à jour du bloc conserve indéfiniment son ancien format d’attributs en base de données, migré uniquement « à la volée » en mémoire à chaque chargement, jusqu’à ce que l’article soit resauvegardé.

La récupération : une action manuelle, jamais automatique

La récupération (« Attempt Block Recovery » dans l’interface, aussi appelée « Tenter la récupération ») est le bouton proposé à l’utilisateur lorsque l’éditeur ne parvient à faire correspondre le contenu invalide à aucune entrée de déprécation connue. Contrairement à la migration, elle n’est jamais déclenchée automatiquement : c’est un choix explicite de l’utilisateur, qui accepte que l’éditeur retente de parser le contenu stocké avec la structure actuelle, au prix potentiel d’une perte de mise en forme si les deux structures divergent trop.

Où ces trois mécanismes s’articulent dans le temps

MécanismeDéclenchementModifie le contenu stocké ?
ValidationAutomatique, à chaque ouverture du blocNon, seulement un constat
MigrationAutomatique, si une entrée deprecated correspondEn mémoire seulement, jusqu’à resauvegarde
RécupérationManuelle, choix explicite de l’utilisateurOui, dès acceptation

Pièges fréquents

  • Croire qu’un bloc « invalidé » a perdu son contenu : le contenu original reste intact en base tant qu’aucune sauvegarde n’a eu lieu après une récupération acceptée.
  • Écrire une fonction migrate sans jamais la tester sur un contenu réel invalidé, en supposant à tort qu’elle s’exécute systématiquement au chargement de n’importe quel article.
  • Confondre l’absence d’entrée deprecated correspondante avec un bug de migration : sans entrée correspondante, il n’y a simplement rien à migrer, seulement une proposition de récupération.

Ces trois mécanismes ne se remplacent jamais l’un l’autre : la validation constate, la migration transforme un format connu, la récupération est un pari accepté par un humain.

Ce que cette notion ne couvre pas en détail

La syntaxe complète du tableau deprecated, ses champs isEligible, et la mécanique fine de résolution parmi plusieurs entrées candidates ont déjà été traitées en profondeur ailleurs. Cet article se limite à distinguer les trois concepts entre eux, pas à détailler chacun exhaustivement.

Pour aller plus loin

Comprendre cette distinction change la façon d’aborder un incident : face à un bloc invalidé en masse, la première question n’est jamais « pourquoi la migration a-t-elle échoué », mais « la validation a-t-elle raison de signaler un écart, et cet écart correspond-il à une perte réelle de donnée ou à une simple différence de sérialisation ».

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