WordPress headless signifie que WordPress sert de CMS et qu’un frontend JavaScript séparé (Next.js, Astro, Nuxt, etc.) rend les pages. Le frontend récupère le contenu via l’API REST ou WPGraphQL et l’affiche. Pour un contenu simple — titre, extrait, image à la une — les types TypeScript sont intégrés dans la plupart des SDK.
Les champs personnalisés sont le problème. Les champs personnalisés sont définis par des plugins, pas par le cœur de WordPress. TypeScript ne sait pas que votre groupe de champs “Section Héros” a un title: string, subtitle: string, background_image: WPImage, et cta_button: { text: string; url: string; }. Le code frontend qui accède à data.hero_title n’a pas de sécurité de type — les fautes de frappe, les champs manquants et les refactorisations de renommage de champs deviennent tous des erreurs d’exécution.
Les solutions qui existaient avant Field Forge :
any générique — contredit l’objectif de TypeScriptField Forge fournit un chemin plus simple : générer automatiquement des définitions TypeScript directement à partir de vos groupes de champs.
Vous concevez un groupe de champs dans le constructeur visuel — disons “Section Héros” avec des champs pour le titre, le sous-titre, l’image de fond et le bouton CTA.
Dans l’écran d’administration du groupe de champs, Field Forge a un bouton “Télécharger TypeScript” qui génère un fichier .d.ts contenant les définitions de type pour tous vos groupes de champs.
Engagez le fichier .d.ts dans votre dépôt frontend (ou copiez-collez dans un fichier de types existant). TypeScript sait maintenant la forme exacte des données de chaque groupe de champs.
“`typescript import { HeroSectionFields } from ‘./types/fieldforge.d.ts’;
function Hero({ data }: { data: HeroSectionFields }) { return (
{data.subtitle}
); } “`
TypeScript détecte les fautes de frappe, les champs manquants et les mauvais types au moment de la compilation. L’autocomplétion de l’IDE fonctionne. Le refactoring est sûr.
Chaque type de champ de Field Forge a un type TypeScript correspondant :
| Champ Field Forge | Type TypeScript | ||
|---|---|---|---|
| Texte | string |
||
| Textarea | string |
||
| Nombre | number |
||
| Plage | number |
||
string |
|||
| URL | string |
||
| Mot de passe | string (sensible) |
||
| Image | WPImage (interface intégrée) |
||
| Fichier | WPFile |
||
| WYSIWYG | string (HTML) |
||
| oEmbed | string (HTML intégré) |
||
| Galerie | WPImage[] |
||
| Sélection (unique) | `’option_a’ | ‘option_b’ | ‘option_c’` (union littérale de choix) |
| Sélection (multiple) | `Array<'option_a' | ‘option_b’>` | |
| Case à cocher | string[] |
||
| Radio | `’option_a’ | ‘option_b’` | |
| Vrai/Faux | boolean |
||
| Groupe de boutons | `’option_a’ | ‘option_b’` | |
| Relation | WPPost[] |
||
| Objet Post | WPPost |
||
| Lien de page | string (URL) |
||
| Taxonomie | WPTerm[] ou WPTerm (selon les paramètres) |
||
| Utilisateur | WPUser ou WPUser[] |
||
| Sélecteur de date | string (format ISO) |
||
| Sélecteur de temps | string |
||
| Sélecteur de couleur | string (hex ou rgba) |
||
| Répéteur | Array (type imbriqué) |
||
| Groupe | type imbriqué | ||
| Contenu flexible | `Array<LayoutA | LayoutB | LayoutC>` (union discriminée) |
| Clone | référence au groupe cloné |
Le .d.ts généré par Field Forge inclut des types d’assistance que vous utiliserez tout au long de votre frontend :
“`typescript interface WPImage { id: number; url: string; alt: string; width: number; height: number; sizes: { thumbnail: string; medium: string; large: string; full: string; }; }
interface WPFile { id: number; url: string; filename: string; mime_type: string; filesize: number; }
interface WPPost { id: number; title: string; slug: string; content: string; excerpt: string; date: string; modified: string; featured_image: WPImage | null; categories: WPTerm[]; tags: WPTerm[]; }
interface WPUser { id: number; name: string; email: string; avatar: string; }
interface WPTerm { id: number; name: string; slug: string; description: string; } “`
Un groupe de champs appelé “Section Héros” avec titre, sous-titre, image de fond et bouton CTA génère :
“typescript export interface HeroSectionFields { title: string; subtitle: string; background_image: WPImage; cta_button: { text: string; url: string; open_in_new_tab: boolean; }; } “
Utilisation dans un composant Next.js :
“`typescript import type { HeroSectionFields } from ‘@/types/fieldforge’;
interface Props { hero: HeroSectionFields; }
export function Hero({ hero }: Props) { return (
{hero.subtitle}
<a href={hero.cta_button.url} target={hero.cta_button.open_in_new_tab ? '_blank' : undefined}
{hero.cta_button.text}
); } “`
Chaque propriété est typée. TypeScript détecte hero.titel (faute de frappe), hero.background_image.URL (mauvaise casse), et hero.cta_button.open_new_tab (mauvais nom de champ) au moment de la compilation.
Les champs de répéteur deviennent Array. Les répéteurs imbriqués fonctionnent de manière récursive :
“typescript export interface TeamPageFields { team_members: Array<{ name: string; photo: WPImage; bio: string; skills: Array; }>; } “
TypeScript comprend l’imbrication. L’itération sur team_members puis sur skills est entièrement typée.
Les champs de contenu flexible génèrent des unions discriminées — la fonctionnalité native de TypeScript pour gérer des tableaux de plusieurs types :
“`typescript type HeroLayout = { acf_fc_layout: ‘hero’; title: string; subtitle: string; background_image: WPImage; };
type FeaturesLayout = { acf_fc_layout: ‘features’; section_title: string; features: Array; };
type CTALayout = { acf_fc_layout: ‘cta’; headline: string; button: { text: string; url: string }; };
export interface LandingPageFields { page_sections: Array; } “`
Dans votre composant frontend, utilisez un garde de type pour rendre la bonne mise en page :
“typescript function PageSections({ sections }: { sections: LandingPageFields['page_sections'] }) { return ( {sections.map((section, i) => { if (section.acf_fc_layout === 'hero') { return ; } if (section.acf_fc_layout === 'features') { return ; } if (section.acf_fc_layout === 'cta') { return ; } })} > ); } </code>“
À l’intérieur de chaque bloc if, TypeScript réduit section au bon type. Aucun casting nécessaire.
Lorsque vous modifiez des groupes de champs dans l’administration de Field Forge, les types changent. Pour garder votre frontend synchronisé :
.d.ts dans votre dépôt frontendOu automatisez-le via l’API REST de Field Forge :
“`bash
curl https://wp.example.com/wp-json/fieldforge/v1/typescript > types/fieldforge.d.ts “`
Ajoutez cela à votre pipeline de construction frontend et les types sont toujours à jour.
Les types TypeScript sont indépendants du framework. Les types générés par Field Forge fonctionnent avec :
Obtenez Field Forge — à partir de 35 $/an →
La génération TypeScript est incluse dans chaque plan payant. Aucun autre plugin de champs personnalisés WordPress n’a cette fonctionnalité.