如何计算ACF重复器输出中的总行数

17

问题: 如何简单地计算ACF重复器字段输出中的行数?

目标: 当输出只有一行时,通过css类使输出外观不同于多于一行的情况。

我的代码:

if( have_rows('testimonials')) {
    $counter = 0;
    $numtestimonials = '';

    //loop thru the rows
    while ( have_rows('testimonials') ){
        the_row();
        $counter++;
            if ($counter < 2) {                         
                $numtestimonials = 'onlyone';               
            }
        echo '<div class="testimonial ' . $numtestimonials . '">';
           // bunch of output here
        echo '</div>';                          
    }
}

显然,我在这里的做法行不通,因为第一次通过此行时计数<2,因此即使在计数更多行后也会返回true。

谢谢!

8个回答

42

好的,我终于找到了这个问题的答案。

ACF Repeater中计算总行数的方法是:

$numrows = count( get_sub_field( 'field_name' ) );

8
谢谢。如果中继器不是子域(典型情况),则只需使用count(get_field('field_name')) - Space
Ben(上面的评论者)也是正确的。他的评论帮了我很大的忙。 - dustincaruso
4
这个方法对我仍然无效。我在一个 Flexible Content 布局内有一个 Repeater。have_rows/the_row 循环可以很好地打印出 Repeater 的内容,但是对于调用 Repeater 名称的 get_sub_fieldget_field 都没有返回任何内容。如果我将 get_sub_fieldget_field 的输出记录到 error_log 中,我可以看到两者都没有返回任何东西,这就是为什么我无法获取计数的原因。我的临时解决方案只是在主要循环之前重复使用 have_rows/the_row 循环来计算 Repeater 中的所有行数 :/ 我讨厌这个解决方案。 - mike
你在内容循环之前解决了这个荒谬的不必要的循环问题吗? - Mike Wells
2
我有5个子字段,但是我得到了24,所以这似乎不再起作用了。 - Tim Hallman
@mike 我也有灵活的内容,这是我的解决方案。我将 $counter = 0; 放在 while 循环内部,然后将 $counter++ 放入数组 $counters[] = $counter++ 中,然后计算数组 count($counters) 并在想要的位置显示数字,之后,在关闭 endwhile 循环之后,一定要 重置 数组 unset($counters); - maiakd

5

对我来说可行,计数必须放在if(have_rows('repeater_field')之前:

三目运算符可避免重复器为空时出现警告错误

如果将计数放在"if(have_rows('repeater_field')) :"之后,则计数返回FALSE。

$repeater_field = get_sub_field('repeater_field');
// OR if repeater isn't a sub_field
// $repeater_field = get_field('repeater_field');

// ternary operator to avoid warning errors if no result
$count =  $repeater_field ? count($repeater_field) : FALSE;

if(have_rows('repeater_field')) : // OR if($count) :

    echo 'Number of posts:' . $count . '<br>';

    while(have_rows('repeater_field')) : the_row();
        echo get_sub_field('field_name') . '<br>';
    endwhile;
endif;

请在您的答案中添加一些解释。 - kk.
它是否足够明确? - Otis Feru
谢谢 - 在if语句之前放置计数器总是让我困惑。感觉我们应该只检查是否有行。你知道为什么它不能在内部工作吗? - Curious Toad
我认为当 have_rows 完成时,一个作用域是活动的,get_sub_field 是重复器字段的元素而不是重复器字段本身。 - Otis Feru

3
您可以像这样获取行数:
$count = get_post_meta(get_the_ID(), 'testimonials', true);

显然,此处使用get_the_ID()函数获取当前文章ID,您可能需要进行修改。
ACF会将重复器计数值存储在重复器字段名称作为meta_key的postmeta表中。
ACF使用计数来检索正确的重复子字段值,这些值存储为格式为$repeaterFieldname . '_' . $index . '_' . $subfieldName的meta_key的值。
希望这可以帮到您...

谢谢David,了解ACF如何处理它确实很有帮助。但我想获取总行数,而不仅仅是当前行ID。我不确定如何做到这一点。 - Robert
3
嗨,罗伯特,我认为它正是你所需要的。例如,如果您已经为“推荐”重复字段添加了4个条目,则 get_post_meta(get_the_ID(), 'testimonials', true) 将返回“4”,而不是行ID。 - csknk
1
这个评论被低估了 - 它完美地解决了获取我的重复器行数的问题。 - terryeah

1
您可能想尝试这个..

<?php 
$row = get_field('repeater', $post->ID);
if($row < 1) {
 $rows = 0;
} else {
 $rows = count($row);
} ?>
<p>Number of Row is (<?php echo $rows ; ?>)</p>

1

高级自定义字段在 5.3.4 版本中内置了一个函数来计算添加的行数。

官方文档:ACF | get_row_index()

您可以在循环中使用 get_row_index();

<?php if( have_rows('slides') ): ?>
    <?php while( have_rows('slides') ): the_row(); ?>
        <div class="accordion" id="accordion-<?php echo get_row_index(); ?>">
            <h3><?php the_sub_field('title'); ?></h3>
            <?php the_sub_field('text'); ?>
        </div>
    <?php endwhile; ?>
<?php endif; ?>

此函数返回的索引从1开始。这意味着具有3行数据的重复器字段将生成索引1、2和3。

0

看起来您想重置$numtestimonials的值。

因此,修复后的代码将是:

$output = "";
$numtestimonials = "";

while ( have_rows('testimonials') ){
    the_row();
    $counter++;
    $output .= "<span>" .$some_data. "</span>"; // bunch of output;
}

if($counter < 2){
    $numtestimonials = "onlyone";
}
$output = "<div class='testimonail ".$numtestimonials." '>"
              .$output
         ."</div>";
echo $output;

你好,这个解决方案的问题在于即使总行数超过一个,第一行仍然会得到“onlyone”类。 - Robert
嗨@Robert。请查看编辑后的代码。它应该能够处理你描述的情况 - 以防你还想做一些类似的事情。虽然很高兴看到你已经自己找到了提前获取行数的方法! - Dhruv Saxena

-1

ACF Repeater Field使用数组来存储行。 获取字段行数的最简单方法是

$count = sizeof(get_sub_field('field_name'));

1
你好,欢迎来到SO!虽然你的答案可能是正确的,但已经有一个被接受的答案几乎与你的相同。请不要发布重复的答案。如果被接受的答案是错误的或者你有改进意见,请在你的答案中包含更多细节。 - Pascal Lamers
当我使用count()函数时,PHP会显示警告,而sizeof()函数则可以正常工作而不会出现警告。 - Majid Shah
请在您的答案中包含此信息,以便其他人更好地查看。还要包括您收到的警告。这将极大地改善您的答案! - Pascal Lamers

-1
你可以尝试这段代码,它能正常工作:
<?php if( have_rows('repeater_name') ):
$my_fields = get_field_object('repeater_name');
$count = (count($my_fields));
echo $count;
endif;?>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接