This plugin provides a set of simple, powerful helper functions to reduce boilerplate code and streamline the process of retrieving and displaying ACF field values in your templates. It includes helpers for getting single values (with support for nested groups), and for easily looping over repeater fields. The plugin is built with security and best practices in mind, ensuring that all output can be properly escaped.
get_acf(): A versatile function to get any field value. It supports dot notation for nested group fields and automatically handles get_sub_field() context within repeaters.repeater(): A clean way to loop through repeater fields with callbacks. Includes optional callbacks for before and after the main loop, and allows passing an arguments array to the row callback. (Requires ACF Pro)get_repeater_field(): Fetch a specific sub-field value from a specific row, or an array of all values for a sub-field across all rows. (Requires ACF Pro)This is your main function for retrieving any ACF field value.
Basic Usage: Get the value of a text field named page_headline.
<h1><?php echo get_acf('page_headline'); ?></h1>
Providing a Default Value: If the page_subtitle field might be empty, provide a fallback.
<h2><?php echo get_acf('page_subtitle', 'This is a default subtitle'); ?></h2>
Escaping HTML: When outputting a value inside an HTML attribute, always escape it.
<?php
$alt_text = get_acf('image_alt_text', 'Default alt text', 'attr');
echo '<img src="..." alt="' . $alt_text . "'>";
Other escape options: html, url, js, text.
Getting a Value from an Options Page: To get a field value from an ACF Options Page, pass option as the $post_id.
<?php
$footer_copyright = get_acf('footer_copyright_text', '', 'html', 'option');
Getting a Value from a Nested Group Field: Use dot notation to access fields inside a group.
<?php
$phone = get_acf('contact_details.phone_number');
Automatic Sub Field Usage: Inside a standard ACF have_rows loop, get_acf() automatically uses get_sub_field() so you don’t have to change your function calls.
<?php
if (have_rows('team_members')) :
while (have_rows('team_members')) : the_row();
// This correctly gets the 'member_name' sub field for the current row.
echo '<h3>' . get_acf('member_name', '', 'html') . '</h3>';
endwhile;
endif;
This function simplifies looping over repeater fields.
Basic Repeater Loop: To display a list of testimonials from a repeater named testimonials with a sub-field testimonial_text:
<?php
repeater('testimonials', function($index) {
echo '<blockquote>' . get_acf('testimonial_text', '', 'html') . '</blockquote>';
});
Using Before and After Callbacks: To wrap your repeater output in <ul> and <li> tags.
<?php
repeater(
'service_list',
function($index) { // Main row callback
echo '<li>' . get_acf('service_name') . '</li>';
},
[], // No args needed for this example
function() { // Before callback
echo '<ul>';
},
function() { // After callback
echo '</ul>';
}
);
Passing Arguments to the Callback: To make your repeater template more reusable, pass in arguments.
<?php
$args = [
'item_class' => 'faq-item',
'heading_level' => 'h3'
];
repeater(
'faqs',
function($index, $args) {
printf('<div class="%s">', esc_attr($args['item_class']));
printf(
'<%s>%s</%s>',
esc_attr($args['heading_level']),
esc_html(get_acf('question')),
esc_attr($args['heading_level'])
);
echo '<div>' . get_acf('answer', '', 'html') . '</div></div>';
},
$args
);
Use this to get data from a repeater field without looping through it manually.
Get All Values from a Sub-Field:
<?php
$all_attendees = get_repeater_field('event_attendees', 'attendee_name');
// $all_attendees is now an array: ['John Doe', 'Jane Smith', ...]
echo '<p>Total attendees: ' . count($all_attendees) . '</p>';
Get a Value from a Specific Row:
<?php
// Row index is 0-based, so 2 is the third row.
$third_image = get_repeater_field('slider', 'slide_image', 2);
if ($third_image) {
// $third_image will contain the image array/ID from ACF
echo wp_get_attachment_image($third_image, 'large');
}