ACF Repeater分组展示FAQ:如何实现剩余条目的显示?
解决ACF Repeater FAQ分组显示问题
你需要把15个FAQ分成前8个和剩余条目两组,现有代码的逻辑存在偏差——你用$i从5开始计数到12,这和取第9到15条的需求不匹配。下面给你两种实用的实现方式:
方式一:单次循环收集两组数据(高效推荐)
先把所有FAQ条目按分组存入两个数组,再分别渲染,只需要遍历一次Repeater字段:
<?php $faq_group1 = []; // 前8个FAQ $faq_group2 = []; // 剩余FAQ条目 if( have_rows('faq', 'options') ): while ( have_rows('faq', 'options') ) : the_row(); // 获取当前行的官方索引(从1开始计数) $row_index = get_row_index(); // 组装当前FAQ条目的数据 $faq_item = [ 'flush' => get_sub_field('flush'), 'question' => get_sub_field('question'), 'answer' => get_sub_field('answer') ]; // 按规则分组存入数组 if( $row_index <= 8 ) { $faq_group1[] = $faq_item; } else { $faq_group2[] = $faq_item; } endwhile; endif; // 渲染第一组(前8个) if( !empty($faq_group1) ): ?> <div class="accordion" id="accordionGroup1"> <?php foreach( $faq_group1 as $item ): ?> <div class="accordion-item faq-item"> <h2 class="faq-header" id="flush-heading<?php echo $item['flush']; ?>"> <button class="accordion-button faq-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#flush-collapse<?php echo $item['flush']; ?>" aria-expanded="false" aria-controls="flush-collapse<?php echo $item['flush']; ?>"> <?php echo $item['question']; ?> </button> </h2> <div id="flush-collapse<?php echo $item['flush']; ?>" class="accordion-collapse collapse faq-collapse" aria-labelledby="flush-heading<?php echo $item['flush']; ?>" data-bs-parent="#accordionGroup1"> <div align="left" class="faq-item-body"> <p><?php echo $item['answer']; ?></p> </div> </div> </div> <?php endforeach; ?> </div> <?php endif; // 渲染第二组(剩余条目) if( !empty($faq_group2) ): ?> <div class="accordion" id="accordionGroup2"> <?php foreach( $faq_group2 as $item ): ?> <div class="accordion-item faq-item"> <h2 class="faq-header" id="flush-heading<?php echo $item['flush']; ?>"> <button class="accordion-button faq-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#flush-collapse<?php echo $item['flush']; ?>" aria-expanded="false" aria-controls="flush-collapse<?php echo $item['flush']; ?>"> <?php echo $item['question']; ?> </button> </h2> <div id="flush-collapse<?php echo $item['flush']; ?>" class="accordion-collapse collapse faq-collapse" aria-labelledby="flush-heading<?php echo $item['flush']; ?>" data-bs-parent="#accordionGroup2"> <div align="left" class="faq-item-body"> <p><?php echo $item['answer']; ?></p> </div> </div> </div> <?php endforeach; ?> </div> <?php endif; ?>
方式二:两次循环分别渲染
如果不想用数组存储,也可以两次遍历Repeater字段,第一次取前8个,第二次取剩余条目:
渲染前8个(可优化你已完成的代码)
<?php if( have_rows('faq', 'options') ): $count = 0; while ( have_rows('faq', 'options') && $count < 8 ) : the_row(); ?> <div class="accordion-item faq-item"> <h2 class="faq-header" id="flush-heading<?php the_sub_field('flush'); ?>"> <button class="accordion-button faq-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#flush-collapse<?php the_sub_field('flush'); ?>" aria-expanded="false" aria-controls="flush-collapse<?php the_sub_field('flush'); ?>"> <?php the_sub_field('question'); ?> </button> </h2> <div id="flush-collapse<?php the_sub_field('flush'); ?>" class="accordion-collapse collapse faq-collapse" aria-labelledby="flush-headingSix" data-bs-parent="#accordionFlushExample"> <div align="left" class="faq-item-body"> <p><?php the_sub_field('answer'); ?></p> </div> </div> </div> <?php $count++; endwhile; endif; ?>
渲染剩余条目
<?php if( have_rows('faq', 'options') ): $count = 0; while ( have_rows('faq', 'options') ) : the_row(); $count++; // 跳过前8个条目 if( $count <= 8 ) continue; ?> <div class="accordion-item faq-item"> <h2 class="faq-header" id="flush-heading<?php the_sub_field('flush'); ?>"> <button class="accordion-button faq-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#flush-collapse<?php the_sub_field('flush'); ?>" aria-expanded="false" aria-controls="flush-collapse<?php the_sub_field('flush'); ?>"> <?php the_sub_field('question'); ?> </button> </h2> <div id="flush-collapse<?php the_sub_field('flush'); ?>" class="accordion-collapse collapse faq-collapse" aria-labelledby="flush-headingSix" data-bs-parent="#accordionFlushExample"> <div align="left" class="faq-item-body"> <p><?php the_sub_field('answer'); ?></p> </div> </div> </div> <?php endwhile; endif; ?>
关键说明
- 用
get_row_index()或手动维护计数器$count都能实现分组,推荐前者——它是ACF官方提供的方法,计数逻辑更可靠(从1开始)。 - 你原代码中
$i=5后判断$i>12就终止循环,逻辑和需求不符,所以取不到正确的剩余条目。
内容的提问来源于stack exchange,提问作者Unohoo
相关产品推荐
相关产品推荐

