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