Como corrigir o Date Picker que não formata a data no ACF PRO
O que é Date Picker que não formata a data no ACF PRO?
O ACF Date Picker formato de data envolve três configurações distintas do campo Date Picker no ACF PRO: o Display Format, que controla como a data aparece no calendário ao selecionar, o Return Format, que define o formato da string devolvida ao carregar o valor com get_field, e o valor real gravado no banco. Segundo a documentação oficial do ACF, o valor e sempre salvo como Ymd (AAAAMMDD) no banco, independente do que o usuário ve no painel.
O problema de formatacao aparece quando o template ignora essa separacao. Se o código le o valor cru ou usa um Return Format diferente do esperado, a data sai como 20260617 em vez de 17/06/2026, ou simplesmente não bate com o formato configurado. A solução passa por alinhar o Return Format do campo e, quando precisa de um formato dinâmico no template, converter a string Ymd para um objeto DateTime antes de exibir.
Como identificar
- A data aparece no template como um número cru no formato 20260617 em vez de uma data legivel como 17/06/2026.
- O valor exibido não corresponde ao Display Format escolhido no campo, mostrando outro formato ao renderizar no frontend.
- Ao alterar o Return Format no painel do ACF, as datas já salvas continuam saindo no formato antigo no template.
- A função date() ou DateTime gera o aviso ‘Failed to parse time string’ porque recebe a string Ymd em vez de um timestamp valido.
- No JavaScript do calendário a data selecionada não respeita o formato configurado quando o Display Format usa caracteres especiais como o @ do PHP.
Como prevenir
- Defina o Return Format do Date Picker no momento de criar o campo, já alinhado ao formato que o template vai exibir, para não depender de conversao no código.
- Lembre que o ACF sempre grava o valor como Ymd no banco: ao atualizar uma data via update_field, passe sempre a string no formato Ymd.
- Padronize a conversao de datas do ACF com DateTime::createFromFormat usando Ymd como mascara, evitando passar a string crua para date() que espera timestamp.
- Documente nos campos Date Picker quais usam Display Format com caracteres especiais e mantenha o filtro php_to_js_date_formats versionado no tema ou plugin.
Causa
- O template le o valor cru do Date Picker, que o ACF PRO sempre grava como Ymd (AAAAMMDD) no banco segundo a doc oficial, sem aplicar o Return Format nem converter a string antes de exibir.
- O Return Format do campo esta configurado com um formato diferente do que o template espera (por exemplo Ymd no campo e d/m/Y no código), entao get_field devolve a string num formato e o template assume outro.
- O código passa a string Ymd direto para a função date() do PHP, que espera um timestamp Unix e não uma data formatada, retornando uma data invalida ou aviso de parse.
- O Display Format e o Return Format foram trocados de lugar: o Display Format so afeta o calendário no painel e não muda o valor devolvido por get_field, que segue o Return Format.
- O Display Format usa o caractere especial @ do PHP sem o filtro acf/settings/php_to_js_date_formats, fazendo o calendário JavaScript interpretar o formato de modo diferente do PHP.
Como resolver
- Ajuste o Return Format do campo Date Picker: Em ACF -> Grupos de Campos, abra o campo Date Picker e defina o Return Format no formato que o template vai exibir, como d/m/Y. O Return Format e o que controla a string devolvida por get_field, e não o Display Format, que so afeta o calendário no painel.
Painel WP -> ACF -> Grupos de Campos -> abra o grupo e edite o campo Date Picker Defina Return Format como d/m/Y (ou o formato desejado) Salve o grupo de campos - Use get_field e confie no Return Format no template: No template, recupere o valor com get_field. A string já vem no Return Format configurado no passo anterior, entao basta exibi-la. Não leia o valor cru do banco nem reformate sem necessidade.
Recupere o valor: $data = get_field( 'data_evento' ) Exiba direto: echo esc_html( $data ) - Converta a string Ymd com DateTime para formato dinâmico: Quando você precisa de um formato diferente no template sem mexer no campo, ou definiu o Return Format como Ymd, converta a string para um objeto DateTime com createFromFormat usando Ymd como mascara de entrada e depois aplique o formato de saida desejado.
$valor = get_field( 'data_evento' ) $date = DateTime::createFromFormat( 'Ymd', $valor ) echo $date->format( 'j M Y' ) - Exiba a data localizada em portugues com date_i18n: Para mostrar o mes em portugues, gere o timestamp a partir do objeto DateTime e passe para date_i18n, que aplica a tradução do WordPress. Assim a data sai como 17 de junho de 2026 em vez do mes em ingles.
$date = DateTime::createFromFormat( 'Ymd', get_field( 'data_evento' ) ) echo date_i18n( 'j \d\e F \d\e Y', $date->getTimestamp() ) - Trate caracteres especiais do formato com o filtro do ACF: Se o Display Format usa um caractere especial do PHP como o @ e o calendário JavaScript exibe diferente, registre o filtro acf/settings/php_to_js_date_formats para mapear o caractere PHP para o equivalente do datepicker jQuery UI, conforme a doc oficial do ACF.
Edite o functions.php do tema ou um plugin próprio Adicione o filtro acf/settings/php_to_js_date_formats (ver bloco de código abaixo) Salve e recarregue a tela de edição do campo
<?php
// 1) Exibir a data do ACF Date Picker no template, convertendo o Ymd salvo.
$valor = get_field( 'data_evento' );
if ( $valor ) {
// O ACF grava sempre como Ymd (AAAAMMDD); cria o objeto a partir disso.
$date = DateTime::createFromFormat( 'Ymd', $valor );
if ( $date ) {
// Data localizada em portugues via date_i18n (ex.: 17 de junho de 2026).
echo esc_html( date_i18n( 'j \d\e F \d\e Y', $date->getTimestamp() ) );
}
}
// 2) Caractere especial @ no Display Format: mapeia o formato PHP para o jQuery UI.
add_filter( 'acf/settings/php_to_js_date_formats', function ( $formats ) {
$formats['@'] = '@'; // mantem o caractere intacto no datepicker
return $formats;
} );














