Como corrigir o loop infinito no Repeater Field do ACF PRO
Perguntas frequentes
O que causa o loop infinito no Repeater do ACF PRO?
Na maioria dos casos é a falta da função the_row dentro do while have_rows. A documentação do ACF é clara: have_rows só verifica se há linhas, e quem avança o ponteiro para a próxima é the_row. Sem ela, a condição fica sempre verdadeira e o laço nunca termina.
Por que a página cai com Maximum execution time?
O laço sem fim reexecuta a mesma linha do Repeater indefinidamente e consome todo o tempo de processamento da requisição. O PHP corta o script ao atingir o limite de tempo de execução e registra Maximum execution time exceeded apontando a linha do while have_rows.
Como o Repeater aninhado gera o loop infinito?
Quando o laço interno chama have_rows com o nome do campo do laço externo em vez do nome do sub campo, os dois ponteiros se confundem e o nível interno nunca chega ao fim. Use o nome correto do sub campo no laço interno para que cada have_rows mantenha o próprio ponteiro.
Posso usar get_field em vez de have_rows no Repeater?
Pode, mas get_field devolve o array bruto sem gerenciar o ponteiro de linha, então você precisa percorrer com foreach e ler cada índice na mão. Para iterar com segurança, o padrão recomendado é have_rows com the_row e get_sub_field, que controla o estado do laço por você.
Para que serve a função reset_rows nesse erro?
Ela limpa o estado interno de linha do ACF. Quando o Repeater roda dentro de um loop de posts, o estado de um post pode vazar para o seguinte e manter um laço aberto. Chamar reset_rows ao fim de cada iteração evita esse vazamento entre posts.
Como confirmo qual linha está travando antes de corrigir?
Ative o log de erros do PHP com WP_DEBUG e WP_DEBUG_LOG e abra o arquivo de log. A mensagem de tempo de execução ou de memória aponta o arquivo e a linha exata do while have_rows que ficou aberta, confirmando a causa antes de você publicar a correção.
Por que não devo chamar get_field do Repeater dentro do while?
Reabrir o mesmo Repeater com get_field dentro do laço reposiciona o estado interno e impede o ponteiro de chegar ao fim, mantendo o laço aberto. Dentro do while, leia os valores apenas com get_sub_field, que opera na linha atual sem mexer no ponteiro.














