# Como corrigir o Number Field que não valida no ACF PRO

O ACF Number Field não valida quando a opção Required esta desligada, quando Minimum Value, Maximum Value e Step Size estão em branco, ou quando o valor chega ao banco por update_field sem passar pela validação do formulário, deixando o campo aceitar valores vazios ou fora do intervalo.

## 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.

**Antes de começar:** Antes de adicionar filtros no functions.php ou rodar uma importação em massa que grava o campo, faça um backup do site (arquivos e banco de dados) ou teste em um ambiente de staging, para poder reverter caso a validação bloqueie registros existentes.

## 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.

Erros relacionados

- [Como corrigir o Repeater Field que não salva dados no ACF PRO](https://full.services/wp-fixer/corrigir-repeater-nao-salva-acf-pro/)
- [Como corrigir a Conditional Logic que não funciona no ACF PRO](https://full.services/wp-fixer/corrigir-conditional-logic-acf-pro/)
- [Como corrigir o Date Picker que não formata a data no ACF PRO](https://full.services/wp-fixer/corrigir-date-picker-formato-acf-pro/)

## 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

1. 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
```

2. 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
```

3. 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
```

4. 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
```

5. 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
```


## Código

```php
<?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;
}
```

## Perguntas frequentes

### Por que o ACF Number Field aceita valor vazio mesmo sendo obrigatório

Porque a opção Required, na aba Validation do campo, esta desligada. Segundo a doc do ACF, o padrão e off, e sem ela o campo aceita valores vazios. Edite o Number Field, ligue Required e salve o grupo de campos.

### Como faço o Number Field do ACF limitar o intervalo de valores

Defina Minimum Value (valor mínimo permitido) e Maximum Value (valor máximo permitido) nas configurações do campo. Sem esses limites preenchidos o ACF não tem intervalo para validar e aceita qualquer número digitado.

### O que e o Step Size do ACF Number Field e por que ele bloqueia meu valor

O Step Size e o incremento em que o valor numerico pode ser ajustado, com padrão 1. Se você precisa de decimais e o passo esta em 1, o input number do navegador rejeita o valor. Defina o Step Size como 0.01 para aceitar duas casas decimais.

### Por que update_field grava um número fora do intervalo no ACF

Porque update_field escreve direto no metadado e não aciona a validação de formulário do ACF. Valide e cheque o intervalo manualmente no código antes de gravar, ou adicione um filtro acf/validate_value para reforcar a regra no servidor.

### Como valido o Number Field também na importação e na REST API

Importação e REST gravam o metadado sem passar pela validação do editor. Use o filtro acf/validate_value para mirar o campo pela key e devolver uma mensagem quando o valor sair do limite, além de sanear o valor com floatval ou intval antes de gravar.

### Por que get_field retorna o número como string em vez de número

O ACF guarda o valor no metadado e pode devolve-lo como string. Converta com floatval ou intval no template antes de comparar ou calcular, e evite comparacoes de igualdade estrita que falham entre string e número.

### Posso usar casas decimais no ACF Number Field

Sim. Ajuste o Step Size para um incremento decimal, como 0.01, já que o padrão 1 limita o input a inteiros. Combine isso com Minimum Value e Maximum Value coerentes com os decimais que você espera receber.

### Qual a diferenca entre validar no editor e validar no servidor no ACF

A validação do editor roda no envio do formulário e cobre o que e digitado a mao. Já o filtro acf/validate_value roda na validação do ACF no servidor e cobre também caminhos como update_field, importação e REST, garantindo o intervalo em qualquer origem.

**Fonte:** [Advanced Custom Fields - Number Field](https://www.advancedcustomfields.com/resources/number/)
