Como corrigir o Number Field que não valida no ACF PRO
O que é ACF Number Field que não valida?
O ACF Number Field e um campo que, segundo a documentação oficial do ACF, cria um input limitado a valores numericos. Ele renderiza um controle HTML do tipo number no painel do WordPress e oferece as opções Minimum Value (valor mínimo permitido), Maximum Value (valor máximo permitido) e Step Size (incremento em que o valor pode ser ajustado, padrão 1). Na aba Validation existe a opção Required, que exige um valor numerico e impede que o campo aceite valores vazios.
A falha de validação aparece quando essas regras não são aplicadas: o campo salva em branco, aceita um número fora do intervalo configurado, ou guarda um valor que não respeita o Step Size. A validação do ACF roda no envio do formulário do editor; valores gravados por código com update_field, por importação ou por REST não passam por essa checagem, e por isso podem entrar no banco mesmo violando Minimum Value, Maximum Value ou Required.
Como identificar
- O campo numerico salva vazio mesmo com a opção Required marcada, e nenhuma mensagem de validação aparece ao tentar publicar.
- Um valor menor que o Minimum Value ou maior que o Maximum Value e aceito e gravado no post sem aviso.
- O navegador exibe a mensagem ‘Please enter a valid value. The two nearest valid values are…’ por causa do Step Size, mas você não configurou esse incremento de proposito.
- O campo retorna texto ou string vazia em vez de número ao ler o valor com get_field no template.
- Valores gravados por update_field, importação CSV ou REST entram fora do intervalo porque não passaram pela validação do editor.
Como prevenir
- Sempre defina Minimum Value, Maximum Value e Step Size ao criar um Number Field, em vez de deixar os limites em branco, para que o ACF tenha um intervalo concreto para validar.
- Ligue a opção Required na aba Validation quando o número for obrigatório, lembrando que o padrão do ACF e off.
- Centralize a regra de negocio num filtro acf/validate_value para que a validação valha também em update_field, importacoes e REST, e não so no editor.
- Ao gravar valores por código, converta com floatval ou intval e cheque o intervalo antes de update_field, evitando dados fora do limite no banco.
Causa
- A opção Required, na aba Validation do campo, esta desligada (padrão off na doc do ACF): sem ela o ACF Number Field aceita valores vazios e não bloqueia a publicação com o campo em branco.
- Os limites Minimum Value e Maximum Value estão em branco nas configurações do campo, entao o ACF não tem intervalo para validar e qualquer número e aceito.
- O Step Size esta definido com um valor diferente de 1 (ou em branco interpretado como 1), fazendo o input number do navegador rejeitar valores que não casam com o incremento, como decimais quando o passo e inteiro.
- O valor foi gravado por update_field, por importação ou pela REST API, que escrevem direto no metadado e não acionam a validação de formulário do ACF, deixando passar valores fora do intervalo.
- O campo armazena o número como string e a comparacao no template usa igualdade estrita, ou um filtro acf/validate_value customizado retorna sempre valido, anulando as regras do campo.
Como resolver
- Ative o Required na aba Validation do campo: Em ACF -> Grupos de Campos, abra o grupo, edite o Number Field e ligue a opção Required na aba Validation. Segundo a doc do ACF, isso exige um valor numerico e impede que o campo aceite valores vazios no envio do editor.
Painel WP -> ACF -> Grupos de Campos -> abra o grupo do campo Edite o Number Field -> aba Validation -> marque Required (Obrigatório) Atualize o grupo de campos para salvar - Defina Minimum Value e Maximum Value: Ainda na edição do campo, na aba Presentation ou General, preencha Minimum Value e Maximum Value com o intervalo desejado. Sem esses limites o ACF não tem intervalo para validar e aceita qualquer número.
Edite o Number Field -> defina Minimum Value (valor mínimo permitido) Defina Maximum Value (valor máximo permitido) Salve o grupo de campos - Ajuste o Step Size para o incremento correto: Configure o Step Size com o incremento real do seu dado. O padrão e 1, o que bloqueia decimais no input number do navegador. Para aceitar casas decimais, use por exemplo 0.01; para inteiros, mantenha 1.
Edite o Number Field -> campo Step Size Para decimais: defina Step Size como 0.01 Para inteiros: mantenha Step Size como 1 - Reforce a validação no servidor com acf/validate_value: Como update_field, importação e REST não passam pela validação do formulário, adicione um filtro acf/validate_value para garantir o intervalo também no servidor. Esse hook roda na validação do ACF e devolve uma mensagem quando o valor sai do limite.
Adicione o filtro acf/validate_value no functions.php do tema filho ou em um plugin próprio Use o nome ou a key do campo para mirar so o Number Field correto Retorne uma string de erro quando o valor for menor que o mínimo ou maior que o máximo - Sanitize valores gravados por código antes de update_field: Quando gravar o número por código, importação ou REST, valide e converta o valor com floatval ou intval e cheque o intervalo antes de chamar update_field, já que esse caminho ignora a validação do editor do ACF.
Converta a entrada com floatval() ou intval() antes de gravar Cheque manualmente se o número esta entre o mínimo e o máximo So entao chame update_field() com o valor saneado
<?php
add_filter( 'acf/validate_value/name=quantidade', 'full_valida_acf_number', 10, 4 );
function full_valida_acf_number( $valid, $value, $field, $input_name ) {
// Mantem mensagens anteriores (ex.: Required) intactas.
if ( $valid !== true ) {
return $valid;
}
// Campo vazio nao numerico: deixa o Required decidir.
if ( $value === '' || $value === null ) {
return $valid;
}
$numero = floatval( $value );
$min = $field['min'] !== '' ? floatval( $field['min'] ) : null;
$max = $field['max'] !== '' ? floatval( $field['max'] ) : null;
if ( $min !== null && $numero < $min ) {
return sprintf( 'O valor minimo permitido e %s.', $min );
}
if ( $max !== null && $numero > $max ) {
return sprintf( 'O valor maximo permitido e %s.', $max );
}
return true;
}














