10+
October 6, 2026
March 18, 2026
Native Custom Fields is a modern WordPress plugin for creating custom content types, meta fields, and options pages using WordPress’ own native component system.
Instead of shipping a proprietary UI framework or custom database structure, Native Custom Fields leverages WordPress core technologies such as:
This ensures a seamless, future-proof experience that evolves together with WordPress core.
Most custom field plugins introduce their own UI systems, internal data storage layers, or hidden configuration post types.
Native Custom Fields follows a different philosophy:
• Uses WordPress native UI components
• Stores configuration in wp_options
• Stores data in postmeta, termmeta, and usermeta
• Does not create unnecessary database tables
• Does not register hidden configuration post types
• Follows WordPress coding standards
The result is a clean, lightweight, and maintainable solution.
Create field groups and attach them to:
* Post Types
* Taxonomies
* User Profiles
* Options Pages
Custom Components:
* Repeater
* Group
Built using official WordPress packages:
Assets:
Composer Packages:
It is available on GitHub:
* GitHub: https://github.com/Arkenon/native-custom-fields
If you want to contribute to the plugin:
1) Download the source code and run npm install to install the development dependencies.
2) To install composer dependencies, run composer install.
3) Run npm start to start the development server.
4) To build the plugin, run npm run build.
/wp-content/plugins/native-custom-fieldsNative Custom Fields is built primarily for WordPress developers, agencies, and users who want full control over structured data while staying aligned with WordPress core standards.
Native Custom Fields uses WordPress’ official component system instead of a custom-built admin UI framework.
It follows WordPress data architecture and avoids unnecessary database layers.
No. Configuration is stored in wp_options, and data is stored in standard WordPress meta tables.
Yes. The plugin is built around the Block Editor architecture and uses native WordPress components.
Yes. The free version has Repeater and Group fields. These are custom components built using WordPress native components recursively or grouped.
default, so an AI agent giving a number field a numeric default (10) or a toggle field a boolean default (true) had the call rejected by schema validation. default now also accepts numbers and booleans. The value is still sanitized according to the field type, and string defaults keep working.default types.list-post-types, get-post-type, list-taxonomies, get-taxonomy, list-post-meta-fields, get-post-meta-fields, list-term-meta-fields, get-term-meta-fields, get-user-meta-fields, list-options-pages and get-options-page. The get-* abilities return the configuration in the same shape the matching update-* / save-* abilities accept, so an AI agent can read a configuration, change it and save it back. Each result also reports builder_state, which shows whether the builder screens have data to load.create-options-page, update-options-page and save-options-page-fields abilities was listed and rendered correctly, but its Edit and Fields screens in the Options Page Builder opened empty. The abilities stored the builder form state under the wrong option name, and never stored it at all for the fields. They now write it where the builder reads it. Re-run the abilities for an existing page to repair it.native_custom_fields_create_options_page entry in such an option can be removed.notice field through the abilities put the message in the label, so the notice rendered empty. The ability schema did not list notice, heading or text_highlight or say where their content goes. The schema now documents it (children for notice, text for heading and text highlight), and a message given as message, or only in the label, is mapped to the right property. A notice that already exists with its text in the label needs the message entered in the builder.notice, heading and text_highlight field types.combobox field now searches server side when its options come from a dynamic token. What is typed in the field is sent to the REST API as the search argument, so collections larger than a single REST response stay fully reachable. Previously the typed text only filtered the records that had already been fetched.per_page above 100, or -1, made the whole request fail with rest_invalid_param and the field rendered no options at all. Such values are now capped at the REST maximum of 100, and per_page=all is accepted as a spelling of the same thing.{{menus}} raised a TypeError on any navigation menu without a title.{{roles}} token from the options help text and the documentation. It was never implemented and always resolved to an empty list.{{posts?type=slug}} pattern for querying a custom post type. That pattern was supported but undocumented, so there was no way to populate a field from a custom post type without reading the source. The text is also grouped into sections and rendered with its line breaks intact.roles (plural, role slugs) rather than role, and author takes a user ID rather than a login name.suggestions is a literal list and does not support the {{token}} syntax.repeater and group fields can now be defined through the field abilities (save-post-meta-fields, save-term-meta-fields, save-user-meta-fields, save-options-page-fields) using the new fields property on a field definition. Up to two levels of nesting are supported. Previously only the container field could be created and its contents had to be added in the field builder.size prop is deprecated and has no effect as of WordPress 7.1. A value stored by an earlier version is now ignored instead of being passed to the control.__unstable-large) choice from the input field “Size” setting. The remaining choices are default, small and compact.__next40pxDefaultSize prop from every control. The 40px default height rollout is complete in WordPress 7.1 and the prop no longer has any effect.Fixed: Repeater, group, file and multiple select fields were registered with the wrong meta type, so register_meta raised a “you must specify the schema for each array item” notice and dropped the meta from the REST API.
Fixed: The native_custom_fields_register_post_meta_type and native_custom_fields_register_term_meta_type filters received the meta key instead of the meta type as their filtered value.
Added: Array and object meta are now registered with a REST schema generated from the field configuration.
Updated: Hooks documentation now describes how the meta type is derived and when a custom schema is required.
Fixed: Repeater default values were not rendered on options pages until the section was reset.
Fixed: “Reset All” on an options page cleared repeater defaults instead of restoring them.
Fixed: Array defaults were flattened to an empty string for fields registered through the Abilities API.
Updated: Repeater control documentation now covers the default parameter.
Fixed: Post type archive did not work when “Has Archive” was enabled without a custom archive slug.
Fixed: Query var fell back incorrectly when no custom query var slug was provided.
Fixed: Endpoint mask normalization broke post types registered with rewrite disabled.
Updated: Post type template field now documents the correct block array format.
Fixed: Missing required field controls in Post Meta, Term Meta, User Meta and TreView forms.
Added: ncf_sanitize_field_value hook to override field sanitization.
Fixed: Sanitization issue for multine line text field.
| Version | Download | Type |
|---|---|---|
| 1.4.2 | Download | Stable |
| 1.4.1 | Download | Stable |
| 1.4.0 | Download | Stable |
| 1.3.9 | Download | Stable |
| 1.3.8 | Download | Stable |
| 1.3.7 | Download | Stable |
| 1.3.6 | Download | Stable |
| 1.3.5 | Download | Stable |
| 1.3.3 | Download | Stable |
| 1.3.2 | Download | Stable |
| 1.3.1 | Download | Stable |
| 1.2.8 | Download | Stable |
| 1.2.7 | Download | Stable |
| 1.2.6 | Download | Stable |
| 1.2.2 | Download | Stable |
| 1.2.1 | Download | Stable |
| 1.2.0 | Download | Stable |
| 1.0.8 | Download | Stable |
| 1.0.7 | Download | Stable |
| 1.0.6 | Download | Stable |
| 1.0.5 | Download | Stable |
| 1.0.4 | Download | Stable |
| 1.0.3 | Download | Stable |
| 1.0.2 | Download | Stable |
| Development | Download | Trunk |