{"id":348445,"date":"2026-08-07T07:48:19","date_gmt":"2026-08-07T07:48:19","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/fieldforge\/"},"modified":"2026-09-10T10:24:26","modified_gmt":"2026-09-10T10:24:26","slug":"fieldforge","status":"publish","type":"plugin","link":"https:\/\/lmo.wordpress.org\/plugins\/fieldforge\/","author":23513346,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.35","stable_tag":"1.0.35","tested":"7.1","requires":"6.5","requires_php":"7.4","requires_plugins":null,"header_name":"Field Forge \u2013 Custom Fields, Relational Fields & Builder","header_author":"Avakode","header_description":"Advanced custom fields with custom table storage, ACF compatibility, unlimited field groups, 31 field types (incl. relational), and a modern visual builder","assets_banners_color":"434459","last_updated":"2026-09-10 10:24:26","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/avakode.com","header_plugin_uri":"https:\/\/fieldforgewp.com","header_author_uri":"https:\/\/avakode.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":322,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.25":{"tag":"1.0.25","author":"avakodeforge","date":"2026-08-07 07:47:49","revision":3637549},"1.0.26":{"tag":"1.0.26","author":"avakodeforge","date":"2026-08-12 20:11:14","revision":3643946},"1.0.27":{"tag":"1.0.27","author":"avakodeforge","date":"2026-08-13 12:51:11","revision":3645358},"1.0.30":{"tag":"1.0.30","author":"avakodeforge","date":"2026-09-02 09:52:23","revision":3677660},"1.0.32":{"tag":"1.0.32","author":"avakodeforge","date":"2026-09-09 15:59:24","revision":3688618},"1.0.33":{"tag":"1.0.33","author":"avakodeforge","date":"2026-09-09 21:28:25","revision":3689023},"1.0.34":{"tag":"1.0.34","author":"avakodeforge","date":"2026-09-10 10:20:43","revision":3689715},"1.0.35":{"tag":"1.0.35","author":"avakodeforge","date":"2026-09-10 10:24:26","revision":3689723}},"upgrade_notice":{"1.0.35":"<p>Repairs nested Group, Repeater and Flexible Content records that older versions filed at the top level. Runs once, in the background, after the update.<\/p>","1.0.34":"<p>Fixes empty fields in the editor on sites migrated from ACF, and the blank page that followed the next Update.<\/p>","1.0.33":"<p>Fixes silent data loss: Group, Repeater and Flexible Content values were not saved from the post editor. Update, then re-save any compound field you edited since 1.0.25.<\/p>","1.0.17":"<p>Adds a Support menu, optional anonymous analytics (off by default), and dashboard Pro tips. New Pro Calculation field + cross-post totals.<\/p>","1.0.16":"<p>Accessibility fix for the Button Group field (keyboard \/ screen-reader support).<\/p>","1.0.14":"<p>Licensing and WordPress.org compliance improvements.<\/p>","1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3637549,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3637549,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3637549,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3637549,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.25","1.0.26","1.0.27","1.0.30","1.0.32","1.0.33","1.0.34","1.0.35"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3637549,"resolution":"1","location":"assets","locale":"","width":1200,"height":900},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3637549,"resolution":"2","location":"assets","locale":"","width":1200,"height":900},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3637549,"resolution":"3","location":"assets","locale":"","width":1200,"height":900},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3637549,"resolution":"4","location":"assets","locale":"","width":1200,"height":880},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3637549,"resolution":"5","location":"assets","locale":"","width":1200,"height":820}},"screenshots":{"1":"Field group editor","2":"Repeater field on post edit (Pro)","3":"Migration from ACF","4":"GraphQL schema preview (Pro)","5":"AI schema generator (Pro)"}},"plugin_section":[],"plugin_tags":[6410,2010,21028,9051,145281],"plugin_category":[],"plugin_contributors":[273812],"plugin_business_model":[],"class_list":["post-348445","plugin","type-plugin","status-publish","hentry","plugin_tags-builder","plugin_tags-custom-fields","plugin_tags-custom-table","plugin_tags-meta-fields","plugin_tags-relational-fields","plugin_contributors-avakodeforge","plugin_committers-avakodeforge"],"banners":{"banner":"https:\/\/ps.w.org\/fieldforge\/assets\/banner-772x250.png?rev=3637549","banner_2x":"https:\/\/ps.w.org\/fieldforge\/assets\/banner-1544x500.png?rev=3637549","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/fieldforge\/assets\/icon-128x128.png?rev=3637549","icon_2x":"https:\/\/ps.w.org\/fieldforge\/assets\/icon-256x256.png?rev=3637549","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/fieldforge\/assets\/screenshot-1.png?rev=3637549","caption":"Field group editor"},{"src":"https:\/\/ps.w.org\/fieldforge\/assets\/screenshot-2.png?rev=3637549","caption":"Repeater field on post edit (Pro)"},{"src":"https:\/\/ps.w.org\/fieldforge\/assets\/screenshot-3.png?rev=3637549","caption":"Migration from ACF"},{"src":"https:\/\/ps.w.org\/fieldforge\/assets\/screenshot-4.png?rev=3637549","caption":"GraphQL schema preview (Pro)"},{"src":"https:\/\/ps.w.org\/fieldforge\/assets\/screenshot-5.png?rev=3637549","caption":"AI schema generator (Pro)"}],"raw_content":"<!--section=description-->\n<p><strong>Field Forge<\/strong> is a modern custom-fields plugin. Fields live in dedicated tables (<code>wp_fieldforge_values<\/code>) instead of the bloated <code>wp_postmeta<\/code>, so listing pages stay fast even with 50+ fields per post. Drag-drop the field group editor, then read values via PHP or REST.<\/p>\n\n<h4>Free<\/h4>\n\n<ul>\n<li>Unlimited field groups<\/li>\n<li>31 field types \u2014 text, textarea, number, select, image, file, WYSIWYG, oEmbed, Gallery, Calculation, date\/time\/color pickers, Google Map, link, and the relational set (Relationship, Post Object, Page Link, Taxonomy, User)<\/li>\n<li>Location rules (post type, taxonomy, template, user role)<\/li>\n<li>ACF compatibility layer (import existing ACF groups + values)<\/li>\n<li>Custom-table storage (not <code>wp_postmeta<\/code>)<\/li>\n<li>Migration UI from ACF Free<\/li>\n<li>Visual field group builder<\/li>\n<li>Local JSON sync (write field groups to disk for version control)<\/li>\n<li>Options-page values via <code>get_field()<\/code> \/ <code>update_field()<\/code><\/li>\n<li>REST API field exposure<\/li>\n<li>Schema versioning + revision history for field groups<\/li>\n<\/ul>\n\n<h4>Field Forge Pro<\/h4>\n\n<p>Pro is a separate add-on plugin, distributed from https:\/\/fieldforgewp.com and not\nincluded in this download. Everything listed above is part of this plugin and works\nwithout it.<\/p>\n\n<ul>\n<li>Compound field types: Repeater, Group, Flexible Content, Clone<\/li>\n<li>Options pages management screen (creating and editing the pages themselves)<\/li>\n<li>PHP Blocks (register Gutenberg blocks from field groups)<\/li>\n<li>AI schema generator (describe the data \u2192 generates a field group)<\/li>\n<li>Native WPGraphQL schema + resolvers (no add-on plugin needed)<\/li>\n<li>TypeScript \/ JSON sync (export field groups to your repo)<\/li>\n<li>Bulk JSON export \/ import<\/li>\n<\/ul>\n\n<p>Part of the <strong>Forge Suite<\/strong> \u2014 bundle includes Lang Forge, Rank Forge, Form Forge.<\/p>\n\n<h3>Third-Party Services<\/h3>\n\n<p>Field Forge connects to one third-party service:<\/p>\n\n<ul>\n<li><strong>Avakode API<\/strong> (https:\/\/avakode.com) \u2014 validates your license and powers optional AI features. Your site URL and license key are sent when the license is checked; field or post content is sent only when you trigger an AI action. AI features require the separate Field Forge Pro add-on. Terms: https:\/\/avakode.com\/terms \u2014 Privacy: https:\/\/avakode.com\/privacy<\/li>\n<li><strong>Anonymous usage analytics (opt-in, OFF by default)<\/strong> \u2014 Only if you explicitly opt in from the Field Forge settings, the plugin sends anonymous product-usage telemetry to the Avakode API (https:\/\/avakode.com\/telemetry): a random install ID (UUID, not tied to your site URL or any account), your bucketed WordPress and PHP version ranges, the plugin version, and aggregate feature-usage event counters. It is sent ONLY after you opt in and can be disabled at any time. It never sends your site URL, email address, post or form content, or license key. Privacy: https:\/\/avakode.com\/privacy<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload <code>fieldforge<\/code> to <code>\/wp-content\/plugins\/<\/code>, or install via Plugins \u2192 Add New.<\/li>\n<li>Activate the plugin.<\/li>\n<li>Go to <strong>Field Forge \u2192 Field Groups \u2192 New Field Group<\/strong>.<\/li>\n<li>Read values in PHP: <code>$value = get_field('my_field', $post_id);<\/code><\/li>\n<li>Or via REST: <code>GET \/wp-json\/wp\/v2\/posts\/123\/fieldforge<\/code><\/li>\n<li>Or via GraphQL: <code>posts { nodes { fieldforge { myField } } }<\/code><\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"can%20i%20migrate%20from%20acf%3F\"><h3>Can I migrate from ACF?<\/h3><\/dt>\n<dd><p>Yes. Field Forge \u2192 Migration \u2192 ACF detects existing field groups + values and imports them into Field Forge tables. The ACF compat layer keeps your <code>get_field()<\/code> calls working during migration.<\/p><\/dd>\n<dt id=\"will%20it%20slow%20down%20my%20admin%3F\"><h3>Will it slow down my admin?<\/h3><\/dt>\n<dd><p>The opposite \u2014 values are not autoloaded from <code>wp_postmeta<\/code>. Listing 100 posts with 50 fields each loads in ms instead of seconds.<\/p><\/dd>\n<dt id=\"is%20graphql%20support%20a%20separate%20add-on%3F\"><h3>Is GraphQL support a separate add-on?<\/h3><\/dt>\n<dd><p>No. Native WPGraphQL schema is built-in (Pro). You don't need \"WPGraphQL for ACF\" or similar bridge plugins.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.35<\/h4>\n\n<ul>\n<li>Fixed: posts saved by 1.0.25\u20131.0.33 could hold a nested Group, Repeater or Flexible Content as a separate top-level field, which left it out of its parent group in the editor. Updating moves those records back where they belong, in the background. The repair only moves a record whose parent is unambiguous and already on the post; anything it cannot prove it leaves exactly as it is.<\/li>\n<\/ul>\n\n<h4>1.0.34<\/h4>\n\n<ul>\n<li>Fixed: on a site migrated from ACF the post editor drew every custom field empty while the site itself still rendered the values, and pressing Update then blanked the page. The editor now reads the same values the site reads, and the first save moves them into Field Forge's own storage.<\/li>\n<li>Fixed: a Repeater, Group or Flexible Content nested inside a group could be saved as a separate top-level field, so it disappeared from its parent.<\/li>\n<\/ul>\n\n<h4>1.0.33<\/h4>\n\n<ul>\n<li>Fixed: values in a Group, Repeater or Flexible Content field were dropped when a post was saved from the editor \u2014 an image picked into a group showed its preview and was empty again after Update. Simple fields were never affected. Introduced in 1.0.25; if you saved compound fields since then, re-enter and save those values once.<\/li>\n<\/ul>\n\n<h4>1.0.32<\/h4>\n\n<ul>\n<li>Forge Suite dashboard: results are the first screen \u2014 each tool's own results with window and completeness, detected and confirmed apart, a Needs-attention filter and a local CSV export for administrators.<\/li>\n<li>Set discounts in the Suite banner follow the three-step ladder (2 tools 15%, 3 tools 25%, 4 or more 35%).<\/li>\n<li>Translations refreshed for all catalogues.<\/li>\n<\/ul>\n\n<h4>1.0.31<\/h4>\n\n<ul>\n<li>Licensing no longer depends on a third-party SDK. The plugin asks avakode.com whether this site is licensed and caches the answer for a day; if the check cannot be completed \u2014 a network hiccup, a timeout, our own error \u2014 your paid features stay on. Only a clear \u201cthis licence is not active\u201d turns them off.<\/li>\n<li>Deactivating from the Forge Suite dashboard now releases the site slot directly, instead of the three-step fallback the old SDK needed when a licence had been cancelled server-side.<\/li>\n<li>Smaller package and one less admin surface: the SDK\u2019s own menu, opt-in screen and promotional notices are gone.<\/li>\n<\/ul>\n\n<h4>1.0.30<\/h4>\n\n<ul>\n<li>Forge Suite dashboard: names of the builder-rail tools (Clearway, Profit, Inclusive Forge) no longer truncate next to the \u201cNot installed\u201d badge.<\/li>\n<\/ul>\n\n<h4>1.0.29<\/h4>\n\n<ul>\n<li>The Forge Suite dashboard now shows the whole seven-tool line-up from the product registry \u2014 Clearway Forge, Profit Forge and Inclusive Forge join the four WordPress tools \u2014 counts active tools against seven, and its cross-sell banner points at the Forge Builder on avakode.com (one checkout, set discount up to 45%) instead of the retired Freemius bundle.<\/li>\n<\/ul>\n\n<h4>1.0.28<\/h4>\n\n<ul>\n<li>The shared inline assets (docs link, feedback widget) are now emitted as a literal nowdoc block instead of being assembled in an output buffer \u2014 the same hardening Lang Forge 1.0.31 and Rank Forge 1.1.3 received.<\/li>\n<li>Lang Forge is detected by its current class name (LANGFORGE_Core), so field-value language sync, the migration helper and the shared dashboard cards keep working with Lang Forge 1.0.31 and later.<\/li>\n<li>The Bundle License card no longer shows the Connect result twice; translations synced.<\/li>\n<\/ul>\n\n<h4>1.0.27<\/h4>\n\n<ul>\n<li>Declares support for WordPress 7.1. Checked against 7.1-RC3: the field-group builder's drag-and-drop still works there, jQuery UI having gone to 1.14.2.<\/li>\n<li>The sibling plugin formerly called SEO Forge is now Rank Forge, so the shared Forge screens and the cross-links name it correctly.<\/li>\n<\/ul>\n\n<h4>1.0.26<\/h4>\n\n<ul>\n<li>The directory listing now names what the plugin does alongside the brand, matching how Lang Forge is listed. The plugin, its folder and its URL are unchanged \u2014 only the displayed title.<\/li>\n<li>Japanese: parentheses in running text are half-width with a space outside, following the Japanese translation style guide. Chinese: parentheses are full-width, as the WordPress core Chinese catalogue writes them.<\/li>\n<\/ul>\n\n<h4>1.0.25<\/h4>\n\n<ul>\n<li>Fixed a database error printed on every activation. The longtext and text columns were declared with DEFAULT '', which MySQL does not allow on BLOB\/TEXT, so dbDelta kept trying to set it and failed loudly. Found by activating with WP_DEBUG on a clean install.<\/li>\n<\/ul>\n\n<h4>1.0.24<\/h4>\n\n<ul>\n<li>Local JSON now writes only to the uploads directory. A theme folder is no longer a write target even when the developer created one \u2014 wp-content\/themes is not a location a plugin may write to. Files already committed under a theme are still read, so existing setups keep working; a filtered save path that points at a theme, plugin or core directory falls back to uploads.<\/li>\n<li>The metabox save path no longer passes the whole request array on. Only this plugin's own submitted values are read, reduced to the fields that belong to the post, and each is sanitized by its declared field type before anything downstream sees it.<\/li>\n<li>Renamed the two ACF-migration options off the reserved \"<em>fdf<\/em>\" prefix onto \"fieldforge_\". Existing values, including the ACF-group id map, are carried over by a schema migration, so a site that already imported from ACF does not re-import duplicates.<\/li>\n<li>ACF's own hooks are consulted only when ACF is actually active.<\/li>\n<\/ul>\n\n<h4>1.0.23<\/h4>\n\n<ul>\n<li>The Gallery field and the Calculation field are now part of this plugin with no restriction. Both were marked Pro while their implementations shipped here, which meant built-in functionality was gated \u2014 that was wrong and is fixed.<\/li>\n<li>Options-page values, the Import \/ Export screen and the ACF importer are likewise unrestricted. Nothing shipped in this download is withheld any more: features that genuinely belong to the separate Pro add-on are detected by whether that plugin is installed, not by a licence check.<\/li>\n<li>Field definitions received over AJAX and REST are now sanitized key by key before storage, instead of only their conditional-logic block.<\/li>\n<li>oEmbed previews are escaped at the output site with an explicit tag allowlist.<\/li>\n<li>Local JSON now writes to the uploads directory by default and never creates a directory inside a theme. An existing \/fieldforge-json is still used when the developer has created one.<\/li>\n<li>Admin CSS moved out of inline  blocks into the enqueued stylesheet.<\/li>\n<li>Removed the red counter bubble on the License menu item \u2014 it reused core's update-notification styling.<\/li>\n<li>Field-group schema REST reads now require manage_options, and the aggregate endpoint no longer accepts an arbitrary post status.<\/li>\n<li>Dropped the load_plugin_textdomain() call; WordPress loads the translations by itself.<\/li>\n<\/ul>\n\n<h4>1.0.22<\/h4>\n\n<ul>\n<li>Security hardening: all dynamic output is now escaped late at the output site with the context-appropriate function (esc_html\/esc_attr\/esc_url, esc_html__ for translated strings used as format strings, and wp_kses for trusted pre-built admin\/field markup). No behavioural changes.<\/li>\n<\/ul>\n\n<h4>1.0.21<\/h4>\n\n<ul>\n<li>Local JSON sync is now available on the Free plan (like ACF's Local JSON) \u2014 enabled by the setting alone, no license required.<\/li>\n<li>ACF value migration (importing existing ACF field values) is now available on the Free plan.<\/li>\n<li>Field values are now exposed on the standard REST post endpoints for every plan (opt-in per field).<\/li>\n<li>Removed the leftover license-gated field-group count limit and its \"locked\" UI \u2014 Free has always supported unlimited field groups.<\/li>\n<\/ul>\n\n<h4>1.0.17<\/h4>\n\n<ul>\n<li>New: Support menu item that opens the Avakode support dashboard.<\/li>\n<li>New: Opt-in anonymous usage analytics (OFF by default) \u2014 see Third-Party Services.<\/li>\n<li>New: Contextual, dismissible Pro feature tips on the plugin dashboard (Free users only).<\/li>\n<li>New (Pro): Calculation field \u2014 compute a total from a formula over sibling fields ({price} * {qty}) or by summing a numeric sub-field across repeater rows, with number\/currency\/percentage formatting and a live per-keystroke preview.<\/li>\n<li>New (Free): [fieldforge_total] shortcode and fieldforge_aggregate_field() to total a numeric field across posts; REST \/aggregate and GraphQL fieldForgeAggregate (Pro).<\/li>\n<\/ul>\n\n<h4>1.0.16<\/h4>\n\n<ul>\n<li>Accessibility: Button Group field radios are now keyboard- and screen-reader-accessible. They were hidden with <code>display:none<\/code>, which removed them from the tab order and accessibility tree; they are now visually hidden the accessible way (the visible button label still toggles the selection).<\/li>\n<\/ul>\n\n<h4>1.0.14<\/h4>\n\n<ul>\n<li>WordPress.org compliance and licensing hardening.<\/li>\n<li>Pro entitlement is now resolved by the Field Forge Pro add-on; the free plugin bundles no licensing SDK.<\/li>\n<li>readme metadata cleanup.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Custom fields, ACF compatible, unlimited groups: custom-table storage and 31 field types including relational. ACF and Pods alternative.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/lmo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/348445","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lmo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/lmo.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/lmo.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=348445"}],"author":[{"embeddable":true,"href":"https:\/\/lmo.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/avakodeforge"}],"wp:attachment":[{"href":"https:\/\/lmo.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=348445"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/lmo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=348445"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/lmo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=348445"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/lmo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=348445"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/lmo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=348445"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/lmo.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=348445"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}