

Field groups list — field counts, storage engine and REST status at a glance.
Fieldstone is a content-modeling plugin for WordPress: build field groups, custom post types and taxonomies from a clean visual editor, then read the values in your theme with simple template functions.
What makes Fieldstone different is where your data lives. Field values are stored in dedicated, indexed database tables — one row per post — instead of scattering several rows per field across wp_postmeta. That means faster queries and no postmeta bloat. A postmeta mirror (on by default) keeps a plain copy of every value where the rest of the ecosystem expects it, so your SEO, backup, export and search plugins keep working untouched.
Already using Advanced Custom Fields? Fieldstone imports your ACF field groups in one click and copies the values ACF saved with a second, warning in plain English about anything that can’t map one-to-one. It only reads your ACF data, so you can run both side by side while you check. The template API is familiar too — fstn_get_field() and fstn_the_field() work the way you’d expect.
fstn_form() with validation, a honeypot and rate limiting.Try it before you install — click Live Preview above to open Fieldstone in a sandboxed WordPress right in your browser.
fstn_form() renders a group on the front of the site and accepts the submission, with validation, a honeypot and rate limiting. What the form targets is stored on the server, never in the page, so a submission cannot be edited into writing somewhere else.[fieldstone field="subtitle"] prints a value anywhere, always escaped.wp fstn acf copy-values.wp fstn json status|sync, wp fstn mirror rebuild, wp fstn table status.fstn_get_field(), fstn_the_field() (escaped by default), fstn_update_field(), fstn_register_field_group(), and a stable extension contract for custom field types.Fieldstone is fully functional on its own — the free plugin above is everything you need to model content and read it in your theme. Fieldstone Pro is an optional upgrade that adds the advanced, repeatable and relational field types, all with the same fast custom-table storage, plus automatic updates and priority support.
Website: https://fieldstonewp.com/ — Plans & pricing: https://fieldstonewp.com/pricing/ — Documentation: https://fieldstonewp.com/docs/
The free plugin includes:
Fieldstone Pro adds:
Plans scale from a single site to unlimited production sites. Staging and development sites are always free, and every plan comes with a 30-day money-back guarantee. See plans and pricing at https://fieldstonewp.com/pricing/.
fstn_get_field( $name, $context, $format ) — returns a field value (formatted by default). You escape the output.fstn_the_field( $name, $context ) — echoes the value already escaped with esc_html(). Best for plain text.fstn_get_fields( $context ) — returns all values for an object as a name => value array.fstn_update_field( $name, $value, $context ) — sanitizes and stores a value.fstn_delete_field( $name, $context ) — deletes a value.
$context defaults to the current post in The Loop. It also accepts a post ID (123), 'option' for site-wide values, 'user_5' for a user, 'term_12' for a term, or a WP_Post / WP_User / WP_Term object.
Text / Textarea / Email — returns a string ('' when empty).
<p><?php fstn_the_field( 'headline' ); ?></p>
URL — returns an escaped URL string.
<a href="<?php echo esc_url( fstn_get_field( 'website' ) ); ?>">Visit</a>
Number — returns an int (or float when decimals are enabled), null when empty.
<?php $price = fstn_get_field( 'price' ); ?>
<span>$<?php echo esc_html( number_format( $price, 2 ) ); ?></span>
True / False — returns a bool.
<?php if ( fstn_get_field( 'is_featured' ) ) : ?><span class="badge">Featured</span><?php endif; ?>
Select / Radio — returns the chosen value as a string. A select with “Allow multiple” returns an array of strings.
<?php foreach ( (array) fstn_get_field( 'tags' ) as $tag ) : ?>
<li><?php echo esc_html( $tag ); ?></li>
<?php endforeach; ?>
Checkbox — returns an array of the checked values.
<?php foreach ( fstn_get_field( 'features' ) as $feature ) : ?>
<li><?php echo esc_html( $feature ); ?></li>
<?php endforeach; ?>
Image — return format is a per-field setting: array (default) returns id, url and alt; url returns the URL string; id returns the attachment ID.
<?php $img = fstn_get_field( 'headshot' ); ?>
<?php if ( $img ) : ?>
<img src="<?php echo esc_url( $img['url'] ); ?>" alt="<?php echo esc_attr( $img['alt'] ); ?>" />
<?php endif; ?>
With return format id, use core helpers for responsive images: echo wp_get_attachment_image( fstn_get_field( 'headshot' ), 'large' );
File — same formats as image; the default array carries id, url and filename.
<?php $file = fstn_get_field( 'brochure' ); ?>
<a href="<?php echo esc_url( $file['url'] ); ?>" download><?php echo esc_html( $file['filename'] ); ?></a>
WYSIWYG — returns formatted HTML. Print with wp_kses_post().
<div class="content"><?php echo wp_kses_post( fstn_get_field( 'body' ) ); ?></div>
Date — returns a string in the field’s return format (default Y-m-d), null when empty.
<?php $date = fstn_get_field( 'event_date' ); ?>
<time datetime="<?php echo esc_attr( $date ); ?>"><?php echo esc_html( date_i18n( 'F j, Y', strtotime( $date ) ) ); ?></time>
Color — returns a hex string: #rrggbb, or #rrggbbaa when opacity is below 100%.
<span style="background: <?php echo esc_attr( fstn_get_field( 'brand_color' ) ); ?>;"></span>
Post Link (relationship) — returns a WP_Post object by default, or the post ID with return format id.
<?php $related = fstn_get_field( 'related_project' ); ?>
<?php if ( $related ) : ?>
<a href="<?php echo esc_url( get_permalink( $related ) ); ?>"><?php echo esc_html( get_the_title( $related ) ); ?></a>
<?php endif; ?>
<?php $f = fstn_get_fields(); ?>
<h2><?php echo esc_html( $f['full_name'] ?? '' ); ?></h2>
<?php echo esc_html( fstn_get_field( 'company_tagline', 'option' ) ); ?>
<?php echo esc_html( fstn_get_field( 'twitter', 'user_' . get_the_author_meta( 'ID' ) ) ); ?>
<?php echo esc_html( fstn_get_field( 'icon', 'term_' . $term_id ) ); ?>
The oEmbed field turns a URL you paste into an embed, exactly as pasting the
same URL into the post editor does. When such a field is displayed, WordPress
asks that provider (YouTube, Vimeo, Spotify, X and the rest of its built-in
list) for the embed markup, and caches the answer. Only the URL saved in the
field is sent, and only to the provider that URL points at. If you never use an
oEmbed field, no such request is ever made.
Fieldstone can optionally connect to the Anthropic API (api.anthropic.com) to power its two AI features: “Generate with AI” and “Suggest fields”.
Without an API key, no AI features are shown and the plugin makes no external requests at all.