Como corrigir a Conditional Logic que não funciona no ACF PRO
O que é a Conditional Logic do ACF PRO que não funciona?
A Conditional Logic do ACF PRO é a regra que mostra ou esconde um campo dentro do mesmo grupo de campos conforme o valor de outro campo, usando condições como igual a, diferente de, tem valor ou não tem valor. Segundo a documentação do ACF, ela permite definir regras sobre quando um campo deve aparecer com base nos valores de outros campos do mesmo field group. Essa lógica roda no navegador, via o script de input do próprio ACF que é carregado na tela de edição. Quando você muda o valor do campo de controle, o JavaScript do ACF avalia a regra na hora e exibe ou oculta o campo dependente, sem recarregar a página. Por isso a lógica condicional é, na prática, uma camada visual do editor: ela decide o que o usuário vê enquanto preenche, mas não apaga nem bloqueia o dado de um campo que ficou oculto. Se o script não carrega, se o campo de controle não devolve um valor comparável ou se a regra aponta para o campo errado, a condição nunca é satisfeita e o campo dependente fica preso, sempre visível ou sempre escondido.
Como identificar
- Você seleciona o valor que deveria revelar um campo dependente e nada acontece: o campo continua oculto, ou aparece sempre, ignorando a regra que você configurou no grupo de campos.
- A lógica condicional funciona ao criar a regra no editor do field group, mas para de funcionar na tela de edição do post, onde os campos não reagem ao mudar o campo de controle.
- No console do navegador aparece um erro de JavaScript como “acf is not defined” ou “Uncaught TypeError” logo ao abrir a tela com os campos, sinal de que o script de input do ACF não carregou.
- Em um formulário no frontend criado com acf_form(), os campos não escondem nem aparecem conforme a regra, embora a mesma lógica funcione normalmente dentro do wp-admin.
- O campo some no editor por causa da regra, mas o valor antigo continua sendo exibido no template do site, mostrando que a lógica condicional não removeu o dado salvo.
- Você usa um Repeater, um Group, uma Tab ou um campo Mensagem como gatilho e a condição nunca dispara, porque esses campos não retornam um valor único para comparar.
Como prevenir
- Use sempre campos de escolha (Select, Radio, Checkbox, True/False ou Button Group) como gatilho da lógica condicional, pois eles retornam um valor único e comparável.
- Ao registrar field groups por código, aponte a conditional_logic para a chave field_xxxx do campo de controle, nunca para o nome do campo.
- Mantenha os scripts do ACF fora das regras de minificação e de adiamento de JavaScript dos plugins de performance, para a lógica condicional sempre carregar na tela de edição.
- No template do site, valide o campo de controle antes de exibir o campo dependente, já que a lógica condicional não remove o dado salvo, apenas oculta o campo no editor.
Causa
- O campo escolhido como gatilho é um Repeater, Group, Tab, Accordion ou Mensagem, que não devolve um valor único comparável, então a condição igual a ou diferente de nunca é satisfeita e o campo dependente não alterna.
- O script de input do ACF (acf-input) não foi enfileirado na tela porque um plugin de otimização adiou ou removeu o JavaScript, deixando a lógica condicional sem o motor que a avalia no navegador.
- A regra foi montada com a condição Valor é igual a comparando um texto que não bate com o valor real salvo do campo de escolha (por exemplo, compara com o rótulo em vez do value do Select ou Radio).
- Em formulário de frontend com acf_form(), a função acf_form_head() não foi chamada no topo do template ou os assets do ACF não foram carregados com acf_enqueue_scripts(), então o JavaScript da lógica condicional não roda fora do admin.
- A regra ficou contraditória, como exigir que um True/False esteja marcado e desmarcado ao mesmo tempo com AND, condição que nunca pode ser verdadeira e mantém o campo sempre oculto.
- Ao registrar campos por código com acf_add_local_field_group(), a chave conditional_logic aponta para o nome do campo em vez da chave field_xxxx do campo de controle, e o ACF não reconhece o alvo da regra.
Como resolver
- Confirme que o campo de gatilho devolve um valor comparável: abra o grupo de campos e verifique qual campo dispara a regra. Use como gatilho um campo que guarda escolha clara, como Select, Radio, Checkbox, True/False ou Button Group. Repeater, Group, Tab, Accordion e Mensagem não retornam um valor único e não servem de gatilho.
ACF -> Grupos de Campos -> abrir o grupo -> revisar o campo de controle - Revise a condição comparando com o value, não com o rótulo: na aba Conditional Logic do campo dependente, confirme que a opção escolhida em Valor é igual a corresponde ao value salvo do campo de controle, e não ao rótulo exibido. Em Select e Radio o value pode ser diferente do texto que aparece para o usuário.
Campo dependente -> Conditional Logic -> Mostrar este campo se -> conferir o value da opção - Verifique se o JavaScript do ACF está carregando na tela: abra a tela de edição do post, pressione F12 e veja a aba Console. Se houver um erro como acf is not defined, o script de input do ACF não carregou. Pause plugins de otimização de JavaScript e teste de novo para isolar o que está removendo o script.
F12 -> Console -> procurar por: acf is not defined - Exclua os scripts do ACF da otimização de JavaScript: se um plugin de cache ou de minificação está adiando ou combinando o JavaScript, adicione os scripts do ACF à lista de exclusão para que carreguem normais na tela de edição. Use o handle ou o caminho do arquivo de input do ACF.
acf-input /wp-content/plugins/advanced-custom-fields-pro/assets/build/js/acf-input.min.js - No frontend, carregue os assets do ACF no acf_form(): para a lógica condicional funcionar fora do wp-admin, o template precisa preparar o ACF antes do HTML. Chame acf_form_head() no topo do template e garanta que os scripts do ACF sejam enfileirados, sem isso o JavaScript que avalia as regras não roda no frontend.
acf_form_head(); acf_enqueue_scripts(); - Proteja a exibição no template, porque a regra é só visual: lembre que a Conditional Logic só esconde o campo no editor, ela não impede que o valor seja salvo ou exibido no site. No template, cheque o campo de controle antes de imprimir o campo dependente, para não mostrar dado de um campo que deveria estar oculto.
<?php
// Conditional Logic registrada por codigo: a regra aponta para a CHAVE do campo de
// controle (field_xxxx), nunca para o nome. So assim o ACF reconhece o gatilho.
acf_add_local_field_group( array(
'key' => 'group_plano',
'title' => 'Plano',
'fields' => array(
array(
'key' => 'field_tipo_plano', // campo de CONTROLE (Select)
'name' => 'tipo_plano',
'label' => 'Tipo de plano',
'type' => 'select',
'choices' => array(
'gratis' => 'Gratis',
'pago' => 'Pago',
),
),
array(
'key' => 'field_valor_mensal', // campo DEPENDENTE
'name' => 'valor_mensal',
'label' => 'Valor mensal',
'type' => 'number',
// Mostra so quando o Select tem value 'pago' (compara o VALUE, nao o rotulo).
'conditional_logic' => array(
array(
array(
'field' => 'field_tipo_plano', // CHAVE, nao 'tipo_plano'
'operator' => '==',
'value' => 'pago',
),
),
),
),
),
'location' => array(
array(
array( 'param' => 'post_type', 'operator' => '==', 'value' => 'post' ),
),
),
) );
// No template, a regra NAO protege a saida: cheque o campo de controle antes de exibir.
if ( get_field( 'tipo_plano' ) === 'pago' ) {
echo esc_html( get_field( 'valor_mensal' ) );
}














