我喜欢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;
}
}
}
请告诉我这种疯狂是否有原因。
最合适的回答,由SO网友:Steven 整理而成
文档中没有它,主要是因为它是一个内部函数,他们不希望您使用或需要它。
have_rows()
检查是否存在当前活动的循环-如果没有,它将使用中继器行创建全局循环;如果是这样的话,它会从您离开的地方开始,然后让您知道是否还有行要循环通过。你的例子很有趣,似乎有点边缘化,但我可以看出这是多么令人沮丧。在中途跳出循环后,不会自动返回到开头,因为上一个循环仍然处于活动状态,并且还有行。
ACF没有rewind_posts()
等效,但您可以运行reset_rows()
函数或其包装的函数:acf_remove_loop()
(抱歉,也是内部和未记录的!)。无论您使用哪个,都应该在break
但是,这样您就不会因为if ( have_rows() )
您是否应该删除最后一行,然后再进行另一个循环。
一个不相关但有趣的消息是,您实际上不需要自定义行计数器,它们提供get_row_index()
就为了这个目的。