ACF - Repeater 仅显示最后输入的行,而不是 post 中的所有行
ACF - Repeater shows only last entered row, not all rows from post
我的 functions.php 文件中有这段代码:
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;
这里是 origin-repiter/destination 转发器转发器字段名称,origin-rep/destination-rep 是转发器字段,如果需要,可以是行。
我的问题是,在我的 WP 站点的前端,ACF 仅显示来自后端的转发器字段的最后输入。
示例:
对于 ORIGIN,我输入了:
伦敦、巴黎、莫斯科(三行)与目的地相同,但相反(莫斯科、巴黎、伦敦)。
但在前端 ACF 上只显示最后一个条目
始发地:莫斯科 & 目的地:伦敦
这是来自 functions.php 的代码,它在前端为这两个 fields/snippets:
呈现 PHP/HTML
$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>';
感谢任何帮助!!!
附录 - 完整代码:
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;
您的第一个代码示例没有多大意义,因为您不断地覆盖 $origin 和 $destination 的值。
此外,如果您想耦合起点和终点值,您应该按如下方式设置 ACF 字段:1 个转发器和 2 个转发器子字段 for origin and destination
要在前端循环遍历转发器值,请使用如下结构:
<?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;
?>
适用于您的场景,假设您有一个 functions.php 和一个页面模板:
将此添加到您的 functions.php:
请注意,您必须检查 acf-field-names 是否与代码匹配。示例中的转发器字段称为 "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;
}
然后在您的页面模板中调用函数:
<?php print_origin_dest(); ?>
我的 functions.php 文件中有这段代码:
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;
这里是 origin-repiter/destination 转发器转发器字段名称,origin-rep/destination-rep 是转发器字段,如果需要,可以是行。
我的问题是,在我的 WP 站点的前端,ACF 仅显示来自后端的转发器字段的最后输入。
示例:
对于 ORIGIN,我输入了:
伦敦、巴黎、莫斯科(三行)与目的地相同,但相反(莫斯科、巴黎、伦敦)。
但在前端 ACF 上只显示最后一个条目
始发地:莫斯科 & 目的地:伦敦
这是来自 functions.php 的代码,它在前端为这两个 fields/snippets:
呈现 PHP/HTML$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>';
感谢任何帮助!!!
附录 - 完整代码:
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;
您的第一个代码示例没有多大意义,因为您不断地覆盖 $origin 和 $destination 的值。 此外,如果您想耦合起点和终点值,您应该按如下方式设置 ACF 字段:1 个转发器和 2 个转发器子字段 for origin and destination
要在前端循环遍历转发器值,请使用如下结构:
<?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;
?>
适用于您的场景,假设您有一个 functions.php 和一个页面模板:
将此添加到您的 functions.php:
请注意,您必须检查 acf-field-names 是否与代码匹配。示例中的转发器字段称为 "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;
}
然后在您的页面模板中调用函数:
<?php print_origin_dest(); ?>