Безголова WordPress означає, що WordPress служить як CMS, а окремий JavaScript фронтенд (Next.js, Astro, Nuxt тощо) рендерить сторінки. Фронтенд отримує контент через REST API або WPGraphQL і відображає його. Для простого контенту — заголовка, анотації, зображення — типи TypeScript вбудовані в більшість SDK.
Проблема полягає в кастомних полях. Кастомні поля визначаються плагінами, а не ядром WordPress. TypeScript не знає, що ваша група полів “Hero Section” має title: string, subtitle: string, background_image: WPImage та cta_button: { text: string; url: string; }. Код фронтенду, який отримує доступ до data.hero_title, не має типізації — помилки в написанні, відсутні поля та рефакторинг перейменувань полів стають помилками під час виконання.
Рішення, які існували до Field Forge:
any — знецінює мету TypeScriptField Forge пропонує простіший шлях: автоматично генерувати визначення TypeScript безпосередньо з ваших груп полів.
Ви проектуєте групу полів у візуальному конструкторі — скажімо, “Hero Section” з полями для заголовка, підзаголовка, фонової картинки та кнопки CTA.
На екрані адміністрування групи полів Field Forge має кнопку “Завантажити TypeScript”, яка генерує файл .d.ts, що містить визначення типів для всіх ваших груп полів.
Збережіть файл .d.ts у вашому репозиторії фронтенду (або скопіюйте-вставте в існуючий файл типів). Тепер TypeScript знає точну структуру даних кожної групи полів.
“`typescript import { HeroSectionFields } from ‘./types/fieldforge.d.ts’;
function Hero({ data }: { data: HeroSectionFields }) { return (
{data.subtitle}
); } “`
TypeScript виявляє помилки в написанні, відсутні поля та неправильні типи під час компіляції. Автозаповнення IDE працює. Рефакторинг безпечний.
Кожен тип поля Field Forge має відповідний тип TypeScript:
| Поле Field Forge | Тип TypeScript | ||
|---|---|---|---|
| Текст | string |
||
| Текстова область | string |
||
| Число | number |
||
| Діапазон | number |
||
| Електронна пошта | string |
||
| URL | string |
||
| Пароль | string (чутливий) |
||
| Зображення | WPImage (вбудований інтерфейс) |
||
| Файл | WPFile |
||
| WYSIWYG | string (HTML) |
||
| oEmbed | string (вбудований HTML) |
||
| Галерея | WPImage[] |
||
| Вибір (один) | `’option_a’ | ‘option_b’ | ‘option_c’` (літеральний союз виборів) |
| Вибір (багато) | `Array<'option_a' | ‘option_b’>` | |
| Чекбокс | string[] |
||
| Радіо | `’option_a’ | ‘option_b’` | |
| Так/Ні | boolean |
||
| Група кнопок | `’option_a’ | ‘option_b’` | |
| Взаємозв’язок | WPPost[] |
||
| Об’єкт поста | WPPost |
||
| Посилання на сторінку | string (URL) |
||
| Таксономія | WPTerm[] або WPTerm (залежно від налаштувань) |
||
| Користувач | WPUser або WPUser[] |
||
| Вибір дати | string (ISO формат) |
||
| Вибір часу | string |
||
| Вибір кольору | string (hex або rgba) |
||
| Повторювач | Array (вкладений тип) |
||
| Група | вкладений тип | ||
| Гнучкий контент | `Array<LayoutA | LayoutB | LayoutC>` (дискримінований союз) |
| Клон | посилання на клоновану групу |
Сгенерований .d.ts Field Forge включає допоміжні типи, які ви будете використовувати у всьому вашому фронтенді:
“`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; } “`
Група полів під назвою “Hero Section” з заголовком, підзаголовком, фоновим зображенням та кнопкою CTA генерує:
“typescript export interface HeroSectionFields { title: string; subtitle: string; background_image: WPImage; cta_button: { text: string; url: string; open_in_new_tab: boolean; }; } “
Використання в компоненті 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}
); } “`
Кожна властивість має тип. TypeScript виявляє hero.titel (помилка в написанні), hero.background_image.URL (неправильний регістр) та hero.cta_button.open_new_tab (неправильна назва поля) під час компіляції.
Поля повторювача стають Array. Вкладені повторювачі працюють рекурсивно:
“typescript export interface TeamPageFields { team_members: Array<{ name: string; photo: WPImage; bio: string; skills: Array; }>; } “
TypeScript розуміє вкладеність. Ітерація по team_members і потім skills повністю типізована.
Поля гнучкого контенту генерують дискриміновані союзи — рідна функція TypeScript для обробки масивів з кількома типами:
“`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; } “`
У вашому компоненті фронтенду використовуйте охорону типу, щоб відобразити правильний макет:
“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>“
Всередині кожного блоку if TypeScript звужує section до правильного типу. Кастинг не потрібен.
Коли ви редагуєте групи полів у адмініструванні Field Forge, типи змінюються. Щоб зберегти ваш фронтенд у синхронізації:
.d.ts у вашому репозиторії фронтендуАбо автоматизуйте це через REST API Field Forge:
“`bash
curl https://wp.example.com/wp-json/fieldforge/v1/typescript > types/fieldforge.d.ts “`
Додайте це до вашого конвеєра збірки фронтенду, і типи завжди будуть актуальними.
Типи TypeScript є незалежними від фреймворку. Сгенеровані типи Field Forge працюють з:
Отримайте Field Forge — від $35/рік →
Генерація TypeScript включена в кожен платний план. Жоден інший плагін кастомних полів WordPress не має цієї функції.