ACF – Repeater shows only last entered row, not all rows from post

I have this code inside my functions.php file:

while ( have_rows('origin-repiter') ): the_row();
$origin = get_sub_field('origin-rep');
endwhile;


while ( have_rows('destination-repiter') ): the_row();
$destination =  get_sub_field('destination-rep');
endwhile;

Here are origin-repiter/destination repiter repeater field name and origin-rep/destination-rep are repeater fields, rows if you want.

Read More

My problem is that on frontend of my WP site ACF shows only last input from backend for repeater fields.

Example:

For ORIGIN I entered:

LONDON, PARIS, MOSCOW (three rows) same for DESTINATION but inverse (MOSCOW, PARIS, LONDON).

But on frontend ACF showing only last entry

Origin: MOSCOW & Destination: LONDON

This is a code from functions.php which renders PHP/HTML on frontend for those two fields/snippets:

$output .= '<div class="post_offer"><div class="offer-header"><div class="offer-pr"><div class="offer-pr-t"> from</div> <div class="offer-pr-v"><div class=""><div class="offer-pr-c">'.$fcurrency_icon .'</div><span class="price" style="font-size:30px;">'.$fprice.'</span></div></div></div> <h2 class="offer-tl editor-paragraph-tags">'.$ftitle.'</h2></div><div class="offer-rt-rd"><div class="offer-rt-rd-o"><div class="offer-rt-rd-lb">Origin</div><div class="offer-rt-rd-lo">'.$origin.'</div></div><div class="offer-rt-rd-d"><div class="offer-rt-rd-lb">Destination</div><div class="offer-rt-rd-lo">'.$destination .'</div></div><div class="offer-rt-rd-ico"></div></div>';

Any help appreciated!!!

ADDENDUM – Whole code:

function add_box_post_end($content){
global $post;
$postId = $post->ID;
$title = get_field('title_text', $postId);
$ftitle = ($title != '')? $title :'';
$currency_icon = get_field('currency_icon', $postId);
$fcurrency_icon = ($currency_icon != '')? $currency_icon :'£';
$price =  get_field('price', $postId);
$fprice = ($price != '')? $price :'99';

if( have_rows('origin-destination') ):      /* your_repeater_name corresponds to the name of your repeater field */

    // loop through the rows of data
    while ( have_rows('origin-destination') ) : the_row();

    // or save the sub fields in a variable
    $origin = get_sub_field('origin');
    $destination= get_sub_field('destination');

    endwhile;

else :

    // no rows found

endif;


$zbor_text = (get_field('zbor_text')!='')?get_field('zbor_text'):'';
$rr = get_field('zbor_images');
if(get_field('zbor_images')!=''){
    $zbor_imagess = get_field('zbor_images');
    $zbor_images = '';
    foreach($zbor_imagess as $zbor_image){
        $imgUrl = $zbor_image['url'];
        $imgAlt = $zbor_image['title'];
        $imgLink = ($zbor_image['alt']!='')?$zbor_image['alt']:'javascript:;';
        $zbor_images .= '<a href="'. $imgLink .'" target="_blank" style="display:block;"><img src="' . $imgUrl . '" alt="'. $imgAlt .'" /></a><br />';
    }
}else{
    $zbor_images = '';
}



$cazare_text = (get_field('cazare_text')!='')?get_field('cazare_text'):'';
if(get_field('cazare_images')!=''){
    $cazare_imagess = get_field('cazare_images');
    $cazare_images = '';
    foreach($cazare_imagess as $cazare_image){
        $imgUrl = $cazare_image['url'];
        $imgAlt = $cazare_image['title'];
        $imgLink = ($cazare_image['alt']!='')?$cazare_image['alt']:'javascript:;';
        $cazare_images .= '<a href="'. $imgLink .'" target="_blank" style="display:block;"><img src="' . $imgUrl . '" alt="'. $imgAlt .'" /></a><br />';
    }
}else{
    $cazare_images = '';
}

$inchiriere_masina_text = (get_field('inchiriere_masina_text')!='')?get_field('inchiriere_masina_text'):'';
if(get_field('inchiriere_masina_images')!=''){
    $inchiriere_masina_imagess = get_field('inchiriere_masina_images');
    $inchiriere_masina_images = '';
    foreach($inchiriere_masina_imagess as $inchiriere_masina_image){
        $imgUrl = $inchiriere_masina_image['url'];
        $imgAlt = $inchiriere_masina_image['title'];
        $imgLink = ($inchiriere_masina_image['alt']!='')?$inchiriere_masina_image['alt']:'javascript:;';
        $inchiriere_masina_images .= '<a href="'. $imgLink .'" target="_blank" style="display:block;"><img src="' . $imgUrl . '" alt="'. $imgAlt .'" /></a><br />';
    }
}else{
    $inchiriere_masina_images = '';
}


$transfer_aeroport_text = (get_field('transfer_aeroport_text')!='')?get_field('transfer_aeroport_text'):'';
if(get_field('transfer_aeroport_images')!=''){
    $transfer_aeroport_imagess = get_field('transfer_aeroport_images');
    $transfer_aeroport_images = '';
    foreach($transfer_aeroport_imagess as $transfer_aeroport_image){
        $imgUrl = $transfer_aeroport_image['url'];
        $imgAlt = $transfer_aeroport_image['title'];
        $imgLink = ($transfer_aeroport_image['alt']!='')?$transfer_aeroport_image['alt']:'javascript:;';
        $transfer_aeroport_images .= '<a href="'. $imgLink .'" target="_blank" style="display:block;"><img src="' . $imgUrl . '" alt="'. $imgAlt .'" /></a><br />';
    }
}else{
    $transfer_aeroport_images = '';
}

$escala_text = (get_field('escala_text')!='')?get_field('escala_text'):'';
if(get_field('escala_images')!=''){
    $escala_imagess = get_field('escala_images');
    $escala_images = '';
    foreach($escala_imagess as $escala_image){
        $imgUrl = $escala_image['url'];
        $imgAlt = $escala_image['title'];
        $imgLink = ($escala_image['alt']!='')?$escala_image['alt']:'javascript:;';
        $escala_images .= '<a href="'. $imgLink .'" target="_blank" style="display:block;"><img src="' . $imgUrl . '" alt="'. $imgAlt .'" /></a><br />';
    }
}else{
    $escala_images = '';
}

$button_one_text = (get_field('button_one_text')!='')?get_field('button_one_text'):'CLICK HERE TO BOOK';
$button_one_url = (get_field('button_one_url')!='')?get_field('button_one_url'):'#';
$buttonOne = '<a class="offer-book-lnk" href="'.$button_one_url.'" target="_blank" rel="nofollow">'. $button_one_text .'</a>';

$button_two_text = (get_field('button_two_text')!='')?get_field('button_two_text'):'HOTEL COMPARISON TOOL';
$button_two_url = (get_field('button_two_url')!='')?get_field('button_two_url'):'#';
$buttonTwo = '<a class="offer-book-lnk" href="'. $button_two_url .'" target="_blank" rel="nofollow">'. $button_two_text .'</a>';

$zbor = ($zbor_text!='' || $zbor_images!='')? '[tabby title="ZBOR"]'. $zbor_text . '<br />' . $zbor_images:'';
$cazare = ($cazare_text!='' || $cazare_images!='')? '[tabby title="CAZARE"]'. $cazare_text . '<br />' . $cazare_images:'';

$inchiriere_masina = ($inchiriere_masina_text!='' || $inchiriere_masina_images!='')? '[tabby title="INCHIRIERE MASINA"]'. $inchiriere_masina_text . '<br />' . $inchiriere_masina_images:'';

$transfer_aeroport = ($transfer_aeroport_text!='' || $transfer_aeroport_images!='')? '[tabby title="TRANSFER AEROPORT"]'. $transfer_aeroport_text . '<br />' . $transfer_aeroport_images:'';

$escala = ($escala_text!='' || $escala_images!='')? '[tabby title="ESCALA"]'. $escala_text . '<br />' . $escala_images:'';

$output = '';
if(is_single() && $ftitle!='' && $price!=''){
    $output .= '<div class="post_offer"><div class="offer-header"><div class="offer-pr"><div class="offer-pr-t"> from</div> <div class="offer-pr-v"><div class=""><div class="offer-pr-c">'.$fcurrency_icon .'</div><span class="price" style="font-size:30px;">'.$fprice.'</span></div></div></div> <h2 class="offer-tl editor-paragraph-tags">'.$ftitle.'</h2></div><div class="offer-rt-rd"><div class="offer-rt-rd-o"><div class="offer-rt-rd-lb">Origin</div><div class="offer-rt-rd-lo">'.$origin.'</div></div><div class="offer-rt-rd-d"><div class="offer-rt-rd-lb">Destination</div><div class="offer-rt-rd-lo">'.$destination .'</br></div></div><div class="offer-rt-rd-ico"></div></div>';
    $output .= do_shortcode( $zbor . $cazare . $inchiriere_masina . $transfer_aeroport . $escala . '[tabbyending]');
    $output .= '<div class="offer_footer"><!--<ul class="offer-book">
                        <li class="offer-book-it">' . $buttonOne . '</li>
                        <li class="offer-book-it">' . $buttonTwo . '</li>
                </ul>--></div></div>';
}

$content .= $output;
return $content;

Related posts

1 comment

  1. Your first code sample does not make much sense, as your are constantly overwriting the values of $origin and $destination.
    Furthermore if you want to couple the origin and destination values, you should setup the ACF field as follows: 1 repeater and 2 repeater sub-fields for origin and destination

    To loop through the repeater values in the frontend, use a structure like this:

    <?php
    
    // check if the repeater field has rows of data
    if( have_rows('your_repeater_name') ):      /* your_repeater_name corresponds to the name of your repeater field */
    
        // loop through the rows of data
        while ( have_rows('your_repeater_name') ) : the_row();
    
            // display the sub field (the function the_sub_field echos the values directly)
            the_sub_field('origin');        /* sub-field with name "origin" */
            the_sub_field('destination');   /* sub-field with name "destination" */
    
            // or save the sub fields in a variable
            $origin = get_sub_field('origin');
            $destination= get_sub_field('destination');
    
            // and then echo them
            // you need to output them **INSIDE** the while loop
            echo $origin;
            echo $destination;
    
    
        endwhile;
    
    else :
    
        // no rows found
    
    endif;
    
    ?>
    

    Applied to your scenario, assuming that you have a functions.php and a page-template:

    Add this to your functions.php:

    Note, you have to check that the acf-field-names match the code. The repeater field in the example is called “your_repeater_name”.

    function print_origin_dest(){
    
        // check if the repeater field has rows of data
        if( have_rows('your_repeater_name') ):
    
            // loop through the rows of data
            while ( have_rows('your_repeater_name') ) : the_row();
    
                // get the acf values
                $origin = get_sub_field('origin');
                $destination= get_sub_field('destination');
    
                // add the title and icon html here (you have not defined them in your question)
                $ftitle = 'Your title';
                $fcurrency_icon = '';
    
                // render the content
                $output = '<div class="post_offer"><div class="offer-header"><div class="offer-pr"><div class="offer-pr-t"> from</div> <div class="offer-pr-v"><div class=""><div class="offer-pr-c">'.$fcurrency_icon .'</div><span class="price" style="font-size:30px;">'.$fprice.'</span></div></div></div> <h2 class="offer-tl editor-paragraph-tags">'.$ftitle.'</h2></div><div class="offer-rt-rd"><div class="offer-rt-rd-o"><div class="offer-rt-rd-lb">Origin</div><div class="offer-rt-rd-lo">'.$origin.'</div></div><div class="offer-rt-rd-d"><div class="offer-rt-rd-lb">Destination</div><div class="offer-rt-rd-lo">'.$destination .'</div></div><div class="offer-rt-rd-ico"></div></div>';
    
                echo $output;
    
            endwhile;
    
        else :
    
            // no rows found
    
        endif;
    }
    

    Then in your page-template, call the function:

    <?php print_origin_dest(); ?>
    

Comments are closed.