You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 09:56:10