Этот документ описывает стабильный публичный API библиотеки wp-field.
Если вы интегрируете библиотеку в плагин или тему, начинайте отсюда.
Стабильными считаются только те контракты, которые зафиксированы в коде и используются как точка интеграции:
- фабрика
WpField\Field\Field; - интерфейсы
FieldInterface,ContainerInterface,StorageInterface; - контейнеры
MetaboxContainer,SettingsContainer,TaxonomyContainer,UserContainer; - storage-классы
PostMetaStorage,OptionStorage,TermMetaStorage,UserMetaStorage,CustomTableStorage; - conditional API
ConditionalLogic; - UI API
NavItem,AdminShell,AdminShellConfig,Wizard,WizardConfig,UIManager; - legacy entrypoint
WP_Field.phpиvanilla/WP_Field.phpкак слой совместимости.
Если контракт не описан здесь или не зафиксирован интерфейсом, считайте его внутренней реализацией.
use WpField\Field\Field;
use WpField\Container\MetaboxContainer;
$field = Field::text('email')
->label('Email')
->placeholder('user@example.com')
->required()
->email();
$container = new MetaboxContainer('contact_box', [
'title' => 'Контактные данные',
'post_types' => ['post'],
]);
$container->addField($field);
$container->register();Базовый поток такой:
- создайте поле через
Field; - добавьте его в контейнер;
- вызовите
register(); - контейнер встроит поле в WordPress lifecycle и сохранит значение через нужное storage;
- поле отвечает за описание, санитизацию и валидацию значения.
Field — основной вход для нового кода.
Field::text(string $name)Field::group(string $name)Field::repeater(string $name)Field::flexibleContent(string $name)Field::heading(string $name)Field::subheading(string $name)Field::notice(string $name)Field::content(string $name)Field::radio(string $name)Field::media(string $name)Field::fieldset(string $name)Field::legacy(string $type, string $name)Field::make(string $type, string $name)
Field::make() создаёт поддерживаемые типы и алиасы.
Сейчас он нормализует следующие значения:
date_timeиdatetime→datetime-localimagepicker→image_picker
Затем фабрика маршрутизирует типы к реальным классам, включая:
InputFieldдляpassword,email,url,tel,number,range,hidden,date,time,datetime-local;TextareaFieldдляtextarea;SelectFieldиmultiple()дляselectиmultiselect;CheckboxField,CheckboxGroupField,SwitcherField,SpinnerField,ButtonSetField,SliderField;ImageSelectField,ImagePickerField,ColorField,EditorField,ImageField,FileField,GalleryField;AccordionField,TabbedField,TypographyField,SpacingField,DimensionsField,BorderField,BackgroundField,LinkColorField,ColorGroupField,CodeEditorField,IconField,MapField,SortableField,SorterField,PaletteField,LinkField,BackupField.
Для неизвестных или кастомных legacy-типов используйте Field::legacy().
- используйте
Field::make()для поддерживаемых типов и алиасов; - используйте
Field::legacy()только для типов, которые не покрывает modern API; - не опирайтесь на внутренние классы как на публичный контракт, если их не возвращает фабрика.
Это минимальный стабильный контракт поля.
getName(): stringgetType(): stringtoArray(): arrayrender(): stringsanitize(mixed $value): mixedvalidate(mixed $value): boolgetAttribute(string $key, mixed $default = null): mixedvalue(mixed $value): staticgetValue(): mixed
На них можно опираться при интеграции:
label(string $label): staticplaceholder(string $placeholder): staticdescription(string $description): staticdefault(mixed $default): staticclass(string $class): staticid(string $id): staticdisabled(bool $disabled = true): staticreadonly(bool $readonly = true): staticsetAttribute(string $key, mixed $value): staticattribute(string $key, mixed $value): staticrequired(bool $required = true): staticmin(int|float $min): staticmax(int|float $max): staticpattern(string $pattern): staticemail(): staticurl(): staticwhen(string $field, string $operator, mixed $value): staticorWhen(string $field, string $operator, mixed $value): static
Не используйте методы traits как внешний контракт, если они не нужны для интеграции.
Для интеграции важен не полный список всех классов, а shape значения.
TextFieldRadioFieldMediaFieldFieldsetField
RepeaterField— массив элементов;FlexibleContentField— массив блоков, где layout хранится вacf_fc_layout;MapField— массив вида['lat' => string, 'lng' => string].
Поля вроде image, file, gallery, editor, color, link, icon и похожих могут подключать assets UI-слоя, но серверный контракт значения задаёт само поле.
LegacyWrapperField нужен как compat-обёртка для типов, которые ещё не переведены на modern API.
Если нужен полный список поддерживаемых типов, смотрите код Field::make() и матрицу поддерживаемых типов в документации проекта.
addField(FieldInterface $field): staticgetFields(): arrayregister(): voidrender(): voidsave(int|string $id): void
MetaboxContainer— post meta;SettingsContainer— options;TaxonomyContainer— term meta;UserContainer— user meta.
Контейнер:
- подключает поля к WordPress hooks;
- читает входные данные;
- вызывает
sanitize()иvalidate()в метабоксах, taxonomy и user flow; - использует
register_setting(..., sanitize_callback ...)в settings flow; - сохраняет значение через соответствующий storage.
Если вы используете контейнер, не сохраняйте поле вручную из $_POST.
get(string $key, int|string $id): mixedset(string $key, mixed $value, int|string $id): booldelete(string $key, int|string $id): boolexists(string $key, int|string $id): bool
PostMetaStorageOptionStorageTermMetaStorageUserMetaStorageCustomTableStorage
Storage хранит данные. Поле и контейнер отвечают за санитизацию и валидацию.
UI-слой нужен для сложных админ-экранов. Для обычных metabox и settings экранов он не обязателен.
NavItem строит дерево навигации для AdminShell.
Поддерживаются:
NavItem::leaf(string $id, string $label, ?array $panels = null)NavItem::group(string $id, string $label, array $children)NavItem::flatSections(array $sections)NavItem::collectLeaves(array $items)NavItem::firstLeafId(array $items)NavItem::findLeaf(array $items, string $id)NavItem::toJsonArray(array $items)
group служит контейнером для дочерних узлов. leaf может содержать вкладки через panels.
AdminShell::render() рисует admin layout с sidebar, tabs, панелями и одной формой вокруг всего экрана.
Поддерживаемые точки входа:
render(array $nav, string $active_segment, string $active_panel, string $page_title, string $action_url, string $nonce_field, callable $panel_renderer, AdminShellConfig $config = new AdminShellConfig): voidresolveFromRequest(array $nav, AdminShellConfig $config = new AdminShellConfig): array{segment: string, panel: string}
Wizard::render() рисует линейный пошаговый flow.
Поддерживаемые точки входа:
render(array $steps, string $active_step, string $action_url, string $nonce_field, callable $step_renderer, WizardConfig $config = new WizardConfig): voidresolveFromRequest(array $steps, WizardConfig $config = new WizardConfig): string
UIManager управляет режимом UI и подключением ассетов.
Поддерживаемые методы:
setMode(string $mode): voidgetMode(): stringisReactMode(): boolenqueueAssets(): voidinit(): void
Допустимые режимы:
vanillareact
enqueueAssets() подключает только те файлы, которые реально существуют на диске.
Legacy-слой нужен для совместимости с существующим кодом.
wp-field.php— canonical plugin bootstrap;WP_Field.php— compat-loader;vanilla/WP_Field.php— legacy runtime.
Используйте legacy только если:
- у вас уже есть старые массивы конфигурации;
- нужно поддержать существующий код без миграции;
- вы работаете с кастомным legacy-типом, который modern API не покрывает.
Для нового кода выбирайте Field и контейнеры.
Для внешнего кода достаточно трёх уровней:
Fieldописывает поле.Containerвстраивает его в WordPress lifecycle и сохраняет значение.Storageопределяет, где лежит значение.
Это и есть стабильная публичная поверхность библиотеки.