> For the complete documentation index, see [llms.txt](https://docs.uichemy.com/llms.txt).
> Use it to discover all available pages before exploring further.

# JetEngine Custom Fields

Use JetEngine meta fields in UiChemy's dynamic tags and Twig expressions to surface custom field data anywhere in a Composer widget.


JetEngine by Crocoblock is a popular custom fields and content modelling plugin. UiChemy integrates with it via three dynamic tags and through the standard `post.meta()` Twig expression, letting you surface JetEngine field values in any Composer widget without writing PHP.

<Callout kind="info">
The **JetEngine dynamic tags** (no-code panel) require JetEngine to be installed and active, plus **UiChemy Pro**, they only appear in Elementor when JetEngine is active. Reading the same fields via **`post.meta()` in Twig** only requires Pro, not JetEngine itself, JetEngine custom fields are stored as plain post or user meta underneath, so `post.meta('key')` reads them with JetEngine deactivated too.
</Callout>

### JetEngine Dynamic Tags

Dynamic tags bind JetEngine field values to Elementor widget controls, text, images, URLs, without writing code. In the Elementor panel, look for the dynamic tag icon on a field, click it, and choose from the JetEngine group.

| Tag | Use for |
|---|---|
| JetEngine Field | Any text, number, date, select, or textarea field |
| JetEngine URL | URL or media fields where you need the link |
| JetEngine Image | Media/image fields (binds to image controls) |

**Source option.** All three tags have a **Source** setting:

| Source | What it reads |
|---|---|
| Post | The field value on the current post |
| Post Author | The field value on the current post's author (user meta) |

**Field picker.** When JetEngine exposes its registered fields via its API, the tag shows a dropdown populated with your field names. When the API isn't available, the tag shows a text input, enter the meta key manually.

### JetEngine Fields in Twig

Inside a Composer widget's HTML panel, access JetEngine field values using `post.meta()`:

```twig
{{ post.meta('field_key') }}
```

Use the meta key, the field name you defined in JetEngine's meta box builder, not the label.

**Text and number fields:**

```twig
<p>{{ post.meta('years_of_experience') }} years of experience</p>
<span>{{ post.meta('job_title') }}</span>
<a href="{{ post.meta('portfolio_url') }}">View Portfolio</a>
```

**Conditional output:**

```twig
{% if post.meta('is_featured') %}
  <span class="badge">Featured</span>
{% endif %}

{% if post.meta('deadline') %}
  <p class="text-label">Deadline: {{ post.meta('deadline') }}</p>
{% endif %}
```

**Author meta fields.** For fields attached to users via JetEngine:

```twig
{{ post.author.meta('expertise_area') }}
{{ post.author.meta('social_twitter') }}
```

**Image fields.** JetEngine image/media fields typically return the attachment ID or URL, use accordingly:

```twig
{# If the field returns an attachment ID #}
{% set photo_id = post.meta('team_photo') %}
{% if photo_id %}
  <img src="{{ photo_id|wp_image_src('medium') }}" alt="{{ post.meta('team_member_name') }}">
{% endif %}

{# If the field returns a direct URL #}
<img src="{{ post.meta('logo_url') }}" alt="Company Logo">
```

For reliable image binding in Elementor widget image controls, use the JetEngine Image dynamic tag instead.

**Repeater fields.** JetEngine repeater fields return arrays, iterate over them in Twig:

```twig
{% for item in post.meta('service_features') %}
  <li>{{ item.feature_name }}</li>
{% endfor %}
```

### Combining JetEngine With `get_posts` Loops

JetEngine data works inside `get_posts` loops. Each iteration gives you the loop post's meta:

```twig
{% for post in get_posts({
  post_type: 'team_member',
  posts_per_page: 12,
  orderby: 'menu_order',
  order: 'ASC'
}) %}
  <div class="team-card">
    <img
      src="{{ post.thumbnail.src('medium') }}"
      alt="{{ post.title }}"
    >
    <h3>{{ post.title }}</h3>
    <p class="text-label">{{ post.meta('job_title') }}</p>
    <p>{{ post.meta('bio_short') }}</p>
    {% if post.meta('linkedin_url') %}
      <a href="{{ post.meta('linkedin_url') }}">LinkedIn</a>
    {% endif %}
  </div>
{% endfor %}
```

This works with any JetEngine custom post type, the `post_type` parameter matches your registered CPT slug.

### Use Cases

- **Surfacing a JetEngine custom field** (post or user meta) inside a Composer widget without writing PHP.
- **Binding a field with no code**, via the dynamic tags panel, once JetEngine and Pro are both active.
- **Reading a field with JetEngine deactivated**, `post.meta()` in Twig still works since the data is stored as plain meta underneath.

### Frequently Asked Questions

<ExpandableGroup>
  <Expandable title="Can I filter get_posts by a JetEngine meta field?" default-open="false">
    Yes. JetEngine stores its field values as standard WordPress post meta, so all standard `WP_Query` meta filtering works:

    ```twig
    {% for post in get_posts({
      post_type: 'listing',
      posts_per_page: 10,
      meta_key: 'availability',
      meta_value: 'available'
    }) %}
    ```
  </Expandable>

  <Expandable title="The field picker shows a text input instead of a dropdown." default-open="false">
    JetEngine's field-select API isn't available in your current setup. Enter the meta key manually, it's the Field Key you defined in JetEngine's meta box builder (shown when you edit a meta box field in JetEngine → Meta Boxes).
  </Expandable>

  <Expandable title="Can I access JetEngine Relations or Options fields?" default-open="false">
    JetEngine Relations return post IDs or objects that require PHP traversal. For simple text/image/URL fields, `post.meta()` works directly. For complex relational structures, the dynamic tag approach is more reliable.
  </Expandable>
</ExpandableGroup>

### Related

<Columns cols={2}>
  <Card title="Dynamic Content Overview" href="/uichemy-composer/design-data/overview">
    See how JetEngine fits among the other data options.
  </Card>
  <Card title="Twig" href="/uichemy-composer/design-data/twig">
    See the full `post.meta()` syntax JetEngine fields use.
  </Card>
  <Card title="Dynamic Tags" href="/uichemy-composer/design-data/dynamic-tags">
    See the no-code panel these JetEngine tags live in.
  </Card>
  <Card title="Loops" href="/uichemy-composer/design-data/loops">
    Loop over a JetEngine custom post type.
  </Card>
  <Card title="ACF" href="/uichemy-composer/design-data/acf">
    See the same pattern applied to ACF fields instead.
  </Card>
</Columns>
