Skip to content

Repeater Fields

A complete guide to setting up, using, and displaying repeater fields with sub-fields.

The Repeater field creates a dynamic list of rows, where each row contains a defined set of sub-fields. Users can add unlimited rows, remove them, and reorder them by dragging. This guide covers everything from setup to template output.


Setting Up a Repeater Field

Step 1 — In the builder, add a new field and select Repeater as the field type.

Step 2 — Set a Field Key (e.g. team_members) and a Label (e.g. Team Members).

Step 3 — Optionally set a custom Button Text for the “Add Row” button (default: Add Row).

Step 4 — Add Sub Fields — these are the fields that appear inside each row. Any field type can be used as a sub-field, including Image, Toggle, Select, and Checkbox.


Sub-Field Keys

Each sub-field has its own key. When you retrieve repeater data, rows are arrays keyed by these sub-field keys:

php

// Repeater key: team_members
// Sub-field keys: member_name, member_role, member_avatar

$rows = onemeta_get_meta( get_the_ID(), 'team_members' );

foreach ( $rows as $row ) {
    $name   = $row['member_name'];   // string
    $role   = $row['member_role'];   // string
    $avatar = $row['member_avatar']; // int (attachment ID)
}

Return Value

Returns an array of associative arrays — one per row:

php

[
    [
        'member_name'   => 'Faruk Ahmed',
        'member_role'   => 'Lead Developer',
        'member_avatar' => 123,
    ],
    [
        'member_name'   => 'Jane Smith',
        'member_role'   => 'Designer',
        'member_avatar' => 456,
    ],
]

Returns an empty array [] if no rows have been added.


Basic Template

php

<?php $team = onemeta_get_meta( get_the_ID(), 'team_members' ); ?>

<?php if ( is_array( $team ) && ! empty( $team ) ) : ?>
    <div class="team-grid">
        <?php foreach ( $team as $member ) : ?>
            <div class="team-card">

                <?php if ( ! empty( $member['member_avatar'] ) ) : ?>
                    <?php echo wp_get_attachment_image(
                        $member['member_avatar'],
                        'thumbnail',
                        false,
                        [ 'class' => 'team-card__avatar', 'alt' => esc_attr( $member['member_name'] ?? '' ) ]
                    ); ?>
                <?php endif; ?>

                <h3 class="team-card__name">
                    <?php echo esc_html( $member['member_name'] ?? '' ); ?>
                </h3>
                <p class="team-card__role">
                    <?php echo esc_html( $member['member_role'] ?? '' ); ?>
                </p>

            </div>
        <?php endforeach; ?>
    </div>
<?php endif; ?>

Common Use Cases

FAQ List

php

<?php $faqs = onemeta_get_meta( get_the_ID(), 'faqs' ); ?>

<?php if ( is_array( $faqs ) && ! empty( $faqs ) ) : ?>
    <div class="faq-accordion">
        <?php foreach ( $faqs as $faq ) : ?>
            <details>
                <summary><?php echo esc_html( $faq['question'] ?? '' ); ?></summary>
                <p><?php echo wp_kses_post( $faq['answer'] ?? '' ); ?></p>
            </details>
        <?php endforeach; ?>
    </div>
<?php endif; ?>

Pricing Tiers

php

<?php $plans = onemeta_get_meta( get_the_ID(), 'pricing_plans' ); ?>

<?php if ( is_array( $plans ) && ! empty( $plans ) ) : ?>
    <div class="pricing-grid">
        <?php foreach ( $plans as $plan ) : ?>
            <div class="pricing-card">
                <h3><?php echo esc_html( $plan['plan_name'] ?? '' ); ?></h3>
                <div class="price"><?php echo esc_html( $plan['plan_price'] ?? '' ); ?></div>
                <p><?php echo esc_html( $plan['plan_description'] ?? '' ); ?></p>
            </div>
        <?php endforeach; ?>
    </div>
<?php endif; ?>

Portfolio Items

php

<?php $projects = onemeta_get_user_meta( get_queried_object_id(), 'portfolio_items' ); ?>

<?php if ( is_array( $projects ) && ! empty( $projects ) ) : ?>
    <div class="portfolio-grid">
        <?php foreach ( $projects as $project ) : ?>
            <article class="portfolio-item">
                <?php if ( ! empty( $project['project_image'] ) ) : ?>
                    <?php echo wp_get_attachment_image( $project['project_image'], 'medium' ); ?>
                <?php endif; ?>
                <h3><?php echo esc_html( $project['project_title'] ?? '' ); ?></h3>
                <a href="<?php echo esc_url( $project['project_url'] ?? '' ); ?>">View Project</a>
            </article>
        <?php endforeach; ?>
    </div>
<?php endif; ?>

Notes

  • Always use is_array() before looping — the value may be empty on new posts
  • Use the null coalescing operator ?? '' when accessing sub-field values to avoid undefined index errors
  • Sub-fields can use any of the 13 other field types including Image, Toggle, Select, Checkbox, and URL
  • Row order is preserved exactly as set by the user in the editor
  • Repeater fields work on both Post Meta and User Meta field groups

Was this article helpful?

On This Page