ACF中继器循环和重置-RESET_ROWS()文档在哪里?

时间:2019-08-23 作者:jonnyK

我喜欢ACF,它对开发人员来说很好,而且它似乎有很多支持。但是。。。为什么文档中没有reset\\u rows()?我创建了一个函数,可以在代码中的不同时间删除中继器行。我每次都在使用rows循环,希望它从索引0开始(或者以acf的疯狂方式从1开始)。但每个循环都是从前一个循环结束的地方开始的。

这让我伤心了好一阵子。我只找到了ONE 其他主题有一个三个字的小回复,提到reset\\u rows()。搜索reset\\u rows()或任何有关重置行索引的内容时,ACF文档都不会出现任何内容。它不在哪里!

所以也许这可以让其他人免于悲伤。下面是我如何成功使用它的:

reset_rows(\'field_name\', $post_id);

$post\\u id可以是可选的,但尚未尝试过。。

下面是我如何将其放入代码中的

if( have_rows(\'related_trustees\', $memberID) )
{
    reset_rows(\'related_trustees\', $memberID); // Start from begining (protects against previous loops)
    echo \'Have rows\';
    $rowNum = 0; // ACF Rows start at index of 1
    while( have_rows(\'related_trustees\', $memberID) )
    {
        the_row();
        $rowNum ++;
        if(get_sub_field(\'trustee\') == $userID)
        {
            $delrow = delete_row(\'related_trustees\', $rowNum, $memberID);
            break;
        }
    }
}
请告诉我这种疯狂是否有原因。

1 个回复
最合适的回答,由SO网友:Steven 整理而成

文档中没有它,主要是因为它是一个内部函数,他们不希望您使用或需要它。

have_rows() 检查是否存在当前活动的循环-如果没有,它将使用中继器行创建全局循环;如果是这样的话,它会从您离开的地方开始,然后让您知道是否还有行要循环通过。你的例子很有趣,似乎有点边缘化,但我可以看出这是多么令人沮丧。在中途跳出循环后,不会自动返回到开头,因为上一个循环仍然处于活动状态,并且还有行。

ACF没有rewind_posts() 等效,但您可以运行reset_rows() 函数或其包装的函数:acf_remove_loop() (抱歉,也是内部和未记录的!)。无论您使用哪个,都应该在break 但是,这样您就不会因为if ( have_rows() ) 您是否应该删除最后一行,然后再进行另一个循环。

一个不相关但有趣的消息是,您实际上不需要自定义行计数器,它们提供get_row_index() 就为了这个目的。