Advanced Custom Fields · Secure Custom Fields

Advanced Custom Fields · Secure Custom Fields

Design your pages with your own custom data. Mosaic reads your Advanced Custom Fields and Secure Custom Fields groups and turns every field into a variable you can drop anywhere — no code, no shortcodes.

Mosaic reads your ACF and SCF field groups and turns every field into a variable you can drop anywhere where variables are supported. You don’t need to write any code or shortcodes.

This page lists exactly what Mosaic supports, which variables each field type produces, and whether a field gives you a simple variable or a loop.

Supported plugins

PluginSupported
Advanced Custom Fields (free)Yes
Advanced Custom Fields PROYes
Secure Custom Fields (SCF)Yes

Mosaic works the same way with all three. It doesn’t matter which one you use. Mosaic detects whichever is active and reads its field groups.

A few field types (Repeater, Flexible Content, Gallery, Clone) and Options Pages are only available in ACF PRO. Secure Custom Fields includes all of them for free, so if you’re on SCF everything on this page is available to you.

Mosaic Pro is required to output custom field values. In Mosaic Free the ACF/SCF variables still show up in the variable picker, but they appear locked and resolve to an empty value.

What Mosaic supports

Custom post types and taxonomies

Post types and taxonomies you register with ACF/SCF (or with any other plugin, or with code) are picked up by Mosaic automatically. Each one becomes its own dynamic source, so you can build a loop over it, sort it, filter it, and use its archive as a template.

The only requirement is that the post type or taxonomy is registered as public. Private, admin-only post types are intentionally left out of the list.

Custom fields

Mosaic reads ACF/SCF fields in these places:

Where your field group is shownSupportedNotes
Posts, pages, and any custom post typeYesIncludes location rules such as post type, specific post, category, page template, post format, post status
Taxonomy termsYesCategory, tag, and any custom taxonomy
UsersYesUser profile fields
Navigation menusYesMenu-level fields
Navigation menu itemsYesPer-menu-item fields
Options pagesYesOptions pages can usually be accessed through the Dynamic sources field. See Options pages.
Attachments (media)YesFields on media items. See Attachments
CommentsNot supported
WidgetsNot supported
BlocksNot supportedOur Post Content element can render the Gutenberg blocks, but we don’t modify the block. So this integration is not relevant for Mosaic.

Attachments

Fields you add to media items work like any other post fields. Media is a post type, so you can build a loop over your media library and your attachment fields show up inside it, and they’re available when you’re working with a single attachment too. Ordering and filtering a media loop by one of these fields works the same way it does for posts.

One difference from the WordPress admin: ACF lets you limit an attachment field group to certain file types (“Attachment is equal to image/png”). Mosaic offers those fields on every attachment. A media loop can hold a mix of file types, and the field list has to be settled before Mosaic knows which file each row holds, so restricting by file type would mean the first item in the loop decided which fields existed for all the others. A field that doesn’t apply to a given file simply resolves to an empty value, so it’s safe to bind. If you want to hide it, use a condition.

Options pages

Mosaic lists every ACF/SCF options page that stores its values the normal way (in the WordPress options table). If you changed an options page to save into a different place (for example into a specific post or user via Permissions > Custom Storage), Mosaic doesn’t list that page as an options page. Those values are stored as custom fields of that post or user, so you can read them there instead.

Editor vs. front end

In the Mosaic editor, Mosaic deliberately shows you a slightly wider set of fields than the front end will show a visitor. If a field group is limited to certain user roles or logged-in users, you can still build with it in the editor, but at render time it only resolves for visitors who match the rule. That’s how ACF’s own rules work, and it means you can design for a state you’re not currently in.

Beyond outputting values

Your ACF/SCF fields are also available in these Mosaic features:

  • Order by: order a post, term, user, or menu loop by a custom field. Mosaic knows the field type, so numbers sort as numbers and dates sort as dates instead of as text.
  • Loop filters: show only the posts, terms, users, or menus whose custom field matches a condition.
  • Conditions: show or hide any element based on a custom field value.
  • @ATTACHMENT(): turn an attachment ID from an Image, File, Gallery, or Icon Picker field into a URL, optionally at a specific WordPress image size.

Important: ordering and loop filtering both work on the raw value stored in the database, not on the value the variable outputs. The two are often different, because ACF/SCF formats the value when it’s read. An Image field stores an attachment ID but outputs a URL; a Post Object field stores a post ID but can output a title; a Select field stores the option key but can output the label. So compare against what’s stored, not against what you see on the page. See Sorting and filtering by a custom field for the details.

How your fields appear in Mosaic

Variable names and labels

Every field becomes one or more variables. In the variable picker they’re labeled with an ACF prefix and the field’s own label, so they’re easy to find:

ACF / Subtitle
ACF / Hero image
ACF / Hero image / ID

The variable name behind the label is built from the field name:

ContextVariable name
Post, term, user, menu, menu item fieldsmeta_<field name>
Options page fieldsoption_<field name>

When a field produces more than one variable, the extra ones get a suffix, for example meta_hero_image__id, meta_page_link__title, meta_location__city. The main variable of a field never carries a suffix.

Simple variables vs. loops

This is the most important distinction on this page.

  • A simple variable holds one value. You drop it straight into a text element, an image, a link, a background, or anywhere else Mosaic accepts a variable.
  • A loop holds a list of values. Typically you need to add these as a loop, and Mosaic repeats its content once per item. Inside the loop you use the row’s own variables.

Whether a field is a simple variable or a loop depends on the field type, and for some types on the field’s own settings (for example, a Select with Multiple turned on becomes a loop).

Every loop also gives you a Record index variable, so you can number your items.

Value types

Each variable carries a type, which tells Mosaic where it can be used: Text, HTML, URL, Image URL, or Number. An Image URL variable can be dropped directly onto an image element; an HTML variable is output without escaping; a Number variable sorts numerically.

Field type reference

Mosaic supports every field type ACF and SCF offer, with these exceptions, which are layout-only and store no value at all, so there is nothing to output:

  • Message
  • Accordion
  • Tab
  • Separator

If you use a custom or third-party ACF field type that Mosaic doesn’t know, you still get one simple text variable holding the raw stored value.

Basic fields

Field typeSimple variable or loopVariablesValue type
TextSimplemeta_<field>Text
Text AreaSimplemeta_<field>Text
NumberSimplemeta_<field>Number
RangeSimplemeta_<field>Number
EmailSimplemeta_<field>Text
URLSimplemeta_<field>URL
PasswordSimplemeta_<field>Text

Content fields

Field typeSimple variable or loopVariablesValue type
WYSIWYG EditorSimplemeta_<field>HTML
oEmbedSimplemeta_<field>HTML (the embed code)
ImageSimplesee belowsee below
FileSimplemeta_<field>Number (attachment ID) or URL
GalleryLoopsee belowsee below

Image. What you get depends on the field’s Return Format:

Return FormatVariables
Image Arraymeta_<field>: the image URL (Image URL)
meta_<field>__id: the attachment ID (Number)
Image IDmeta_<field>: the image URL (Image URL)
meta_<field>__id: the attachment ID (Number)
Image URLmeta_<field>: the image URL (Image URL)

With the Array and ID formats, Mosaic derives the URL from the attachment ID at full size. If you need a specific WordPress image size, use the ID variable with @ATTACHMENT().

File. With the File Array and File ID formats you get the attachment ID; with File URL you get the file URL. There’s no separate URL companion variable for files, because the attachment ID already resolves to the file. Use @ATTACHMENT() if you need the URL.

Gallery is always a loop, whatever its Return Format. Each row gives you:

Return FormatRow variables
Image Array / Image IDvalue: the image URL (Image URL)
value__id: the attachment ID (Number)
Image URLvalue: the image URL (Image URL)

Choice fields

All four of these share the same behavior. With the Return Format set to Value or Label you get one variable holding that string. With Both (Array) you get the stored value plus its human-readable label.

Field typeSimple variable or loop
SelectLoop when Multiple is on, otherwise simple
CheckboxLoop (always)
Radio ButtonSimple
Button GroupSimple
Return FormatVariables (simple)Row variables (loop)
Value or Labelmeta_<field>: Textvalue: Text
Both (Array)meta_<field>: the stored value (Text)
meta_<field>__label: the label (Text)
value: the stored value
value__label: the label

True / False is a separate case: it’s a simple variable holding 1 or 0 as a Number, so an unchecked field outputs 0 rather than nothing.

Relational fields

These fields point at another object. The main variable is always the object’s ID. Where ACF hands Mosaic the whole object (that is, where the Return Format is set to the object rather than the ID), you also get its name and its URL for free, with no extra database queries.

Field typeSimple variable or loopVariables
Post ObjectLoop when Multiple is on, otherwise simplemeta_<field> (ID), and with the Post Object return format also meta_<field>__label (Title) and meta_<field>__url
RelationshipLoop (always)value (ID), and with the Post Object return format also value__label (Title) and value__url
Page LinkLoop when Multiple is on, otherwise simplemeta_<field>: the page URL
TaxonomyLoop when the appearance is Checkbox or Multi Select, otherwise simplemeta_<field> (Term ID), and with the Term Object return format also meta_<field>__label (Name) and meta_<field>__url
UserLoop when Multiple is on, otherwise simplemeta_<field> (User ID), and with the User Array or User Object return format also meta_<field>__label (Name) and meta_<field>__url (author archive)

When one of these fields is a loop, the row variables are value, value__label, and value__url instead of the meta_... names.

If the Return Format is set to the plain ID, Mosaic gives you the ID variable only. It doesn’t look up each object to fill in a name and a URL, so a long list of references stays fast.

Advanced fields

Field typeSimple variable or loopVariables
LinkSimplesee below
Color PickerSimplemeta_<field>: Text
Date PickerSimplemeta_<field>: Text
Date Time PickerSimplemeta_<field>: Text
Time PickerSimplemeta_<field>: Text
Google MapSimple (many variables)see below
Icon PickerSimple (one variable per tab)see below
Nav MenuSimplesee below

Link.

Return FormatVariables
Link Arraymeta_<field>: the URL (URL)
meta_<field>__title: the link text (Text)
meta_<field>__target: the target, e.g. _blank (Text)
Link URLmeta_<field>: the URL (URL)

Color Picker. Hex String and RGBA String are passed through as they are. RGBA Array is converted into a ready-to-use CSS color: rgb(1, 2, 3) when the color is fully opaque, rgba(18, 171, 52, 0.5) when it isn’t.

Date, Date Time, and Time Picker output the value using the field’s own Return Format setting, so what you see in Mosaic is what you configured in ACF. For sorting, Mosaic still treats these as real dates and times rather than as text.

Google Map produces one variable per address part. There’s no single “main” variable, so pick the parts you need:

meta_<field>__address, __lat, __lng, __zoom, __place_id, __name, __street_number, __street_name, __street_name_short, __city, __post_code, __country, __country_short

Latitude, longitude, and zoom are Numbers; the rest are Text. If another plugin adds extra data to the ACF map field, a developer can extend this list with a filter.

Icon Picker (Array return format) gives you one variable per tab the field has enabled:

VariableHolds
meta_<field>__dashiconsthe Dashicon class name
meta_<field>__media_librarythe attachment ID of the chosen image
meta_<field>__urlthe icon URL

Only the variable matching the tab the icon was picked from has a value; the others are empty. That’s what lets you build one layout that handles every icon source. To render a media library icon, pass meta_<field>__media_library through @ATTACHMENT().

With the String return format the Icon Picker is a single Text variable instead.

Nav Menu. The field’s Save Format decides what you get: Nav Menu Object and Nav Menu ID both give you the menu ID as a text variable, and Nav Menu (HTML) gives you the rendered menu markup as HTML.

Repeater, Group, Flexible Content, and Clone

These four field types hold other fields, so they always become loops. Add the loop, and inside it every sub-field is available as its own variable, named value_<sub-field name> (plus the same suffixes described above: __id, __label, __url, and so on).

Field typeBecomesRows
RepeaterLoopOne row per repeater row
GroupLoopExactly one row
Clone (Group display)LoopExactly one row
Clone (Seamless display)Not a loopIts sub-fields appear as normal top-level fields
Flexible ContentLoopOne row per layout row

Group and Clone (Group) hold a single set of values, so they’re loops with exactly one row. Adding them as a loop is what gives you access to their sub-fields.

Clone (Seamless) is flattened: its sub-fields show up alongside your other fields, exactly as they do in the WordPress editor. Clone’s “Prefix Field Names” option is handled for you, so you’ll see the original field names.

Flexible Content rows can each come from a different layout, so Mosaic gives every layout’s sub-fields their own variables, labeled with the layout name:

Layout A / Heading    →  value_layout_a_heading
Layout B / Image      →  value_layout_b_image

You also get a Flexible Content Layout Name variable (value_acf_fc_layout) holding the layout of the current row. Use it with a condition to render each layout differently. A layout’s variables resolve only on rows that actually use that layout, so two layouts can safely reuse the same sub-field name.

Nesting works. A Repeater inside a Repeater, a Group inside a Flexible Content layout, a Gallery inside a Repeater: each nested field becomes a nested loop inside its parent’s loop, as deep as you need.

Sorting and filtering by a custom field

You can order a post, term, user, or menu loop by any ACF/SCF field, and filter a loop by one. Mosaic uses the field type to compare values correctly:

Field typeSorted as
Number, RangeNumber
Date Picker, Date Time PickerDate and time
Time PickerTime
Everything elseText

There’s also an Auto option, which inspects the stored values and picks the comparison for you.

A note on Repeater, Group, Flexible Content, and Clone: sorting and filtering work on single field values. The sub-values inside these container fields aren’t offered as sort or filter targets.

These work on the stored value, not the output

Ordering, filtering, and conditions are resolved in the database, against the value ACF/SCF saved. Variables are different: they’re resolved when the page is built, and ACF/SCF formats the value on the way out based on the field’s Return Format. So the value you filter against is often not the value you see rendered.

Here’s what’s actually stored for the field types where this catches people out:

Field typeWhat’s storedWhat the variable outputs
Image, File, GalleryThe attachment IDA URL (depending on Return Format)
Post Object, Relationship, Page LinkThe post IDThe ID, and optionally the title or URL
TaxonomyThe term IDThe ID, and optionally the name or URL
UserThe user IDThe ID, and optionally the name or URL
Select, Checkbox, Radio, Button GroupThe option keyThe key or the label, depending on Return Format
Date PickerYmd, for example 20260819The date in your Return Format
Date Time PickerY-m-d H:i:sThe date and time in your Return Format
Time PickerH:i:sThe time in your Return Format
True / False1, or empty when unchecked1 or 0

The date and time formats above are what ACF/SCF always saves, whatever display or Return Format you picked. So to filter for posts dated after August 19, 2026, compare a Date Picker against 20260819, not against 19/08/2026.

A few field types can’t be filtered or sorted usefully at all:

  • Multi-value fields: a Checkbox, Gallery, Relationship, or a Select with Multiple stores its whole list as one serialized value. Comparisons against it are unreliable, so filter on something else.
  • Repeater stores only its row count, and Flexible Content stores only the list of layout names used. Their actual content lives under separate keys.
  • Sub-fields inside a Repeater, Group, Flexible Content, or Clone aren’t offered as sort or filter targets. You can still output them inside the loop, and you can use a condition inside the loop to skip rows you don’t want.

Limitations at a glance

  • Custom field values require Mosaic Pro. In Mosaic Free the variables are visible but locked.
  • Message, Accordion, Tab, and Separator fields store no value, so they produce no variables.
  • Field groups shown on comments, widgets, or Blocks aren’t read.
  • An attachment field group limited to certain file types is offered on every attachment, not only on files of that type. It resolves to an empty value where it doesn’t apply.
  • Options pages that were changed to save their values somewhere other than the WordPress options table aren’t listed as options pages. Read those values from the post or user they’re saved on.

Last updated: September 8, 2026

Still have more questions? Let us help!

Your cookie preferences

We use cookies to improve your experience, analyze traffic, and personalize content. By clicking "Accept all" you agree to storing them on your device. Read our privacy policy.