Flexible Content fields let editors choose from predefined layouts to build dynamic pages. Each layout has its own set of sub-fields. Requires PRO license.
Basic Layout Switching
php
<?php if ( have_rows( 'page_sections' ) ) : ?>
<?php while ( have_rows( 'page_sections' ) ) : the_row(); ?>
<?php if ( get_row_layout() === 'hero' ) : ?>
<section class="section-hero">
<h1><?php the_sub_field( 'heading' ); ?></h1>
<p><?php the_sub_field( 'subheading' ); ?></p>
</section>
<?php elseif ( get_row_layout() === 'text_block' ) : ?>
<section class="section-text">
<?php the_sub_field( 'content' ); ?>
</section>
<?php elseif ( get_row_layout() === 'image_gallery' ) : ?>
<section class="section-gallery">
<?php $images = get_sub_field( 'images' ); ?>
<?php if ( $images ) : ?>
<div class="gallery-grid">
<?php foreach ( $images as $img ) : ?>
<img src="<?php echo esc_url( $img['url'] ); ?>" alt="<?php echo esc_attr( $img['alt'] ); ?>">
<?php endforeach; ?>
</div>
<?php endif; ?>
</section>
<?php endif; ?>
<?php endwhile; ?>
<?php endif; ?>Template Part Pattern
A cleaner approach using get_template_part():
php
<?php
// page-builder.php
if ( have_rows( 'sections' ) ) :
while ( have_rows( 'sections' ) ) : the_row();
$layout = get_row_layout();
get_template_part( 'template-parts/sections/' . str_replace( '_', '-', $layout ) );
endwhile;
endif;
?>Each section template file accesses sub-fields directly:
php
<?php
// template-parts/sections/hero.php
$heading = get_sub_field( 'heading' );
$image = get_sub_field( 'background_image' );
?>
<section class="hero" <?php if ( $image ) : ?>style="background-image: url(<?php echo esc_url( $image['url'] ); ?>);"<?php endif; ?>>
<h1><?php echo esc_html( $heading ); ?></h1>
<p><?php the_sub_field( 'subheading' ); ?></p>
</section>Programmatic Flexible Content Creation
php
$sections = [
[
'acf_fc_layout' => 'hero',
'heading' => 'Welcome to Our Site',
'subheading' => 'We build amazing things.',
'cta_text' => 'Learn More',
'cta_link' => '/about',
],
[
'acf_fc_layout' => 'text_block',
'content' => '<p>Our story begins with a simple idea...</p>',
],
];
$field_def = FIELDFORGE_Field_Groups::instance()->find_field( 'page_builder', $post_id );
FIELDFORGE_Field_Values::instance()->save_compound_field(
'page_builder',
$sections,
$post_id,
$field_def
);—