Como corrigir Custom Fields que não aparecem no frontend no ACF PRO
O que é Custom Fields que não aparecem no frontend (ACF)?
Custom Fields que não aparecem no frontend é quando o campo tem valor salvo no editor do ACF PRO, mas a página pública mostra branco no lugar dele. O valor existe no banco (na tabela wp_postmeta), só não chega ao HTML. Na prática, a função get_field() ou the_field() do tema está sendo chamada com o nome de campo certo, mas no contexto errado: outro post, fora do The Loop, antes de o field group carregar, ou esperando um tipo de dado diferente do que o campo devolve. Por isso o erro é silencioso, sem mensagem fatal: o PHP só imprime uma string vazia.
Como identificar
- A área do campo renderiza em branco no frontend, mas o valor aparece preenchido ao editar o post no painel.
- var_dump( get_field(‘nome_do_campo’) ) imprime bool(false) ou string vazia em vez do valor salvo.
- the_field(‘imagem’) imprime um ID numérico cru ou um array em vez da URL da imagem.
- O campo aparece em um post e some em outro do mesmo tipo, ou some apenas no arquivo (archive) e na home.
- Depois de migrar de staging para produção, todos os campos passam a vir vazios de uma vez.
Como prevenir
- Sempre passe o segundo parâmetro post_id em get_field() e the_field() quando o código rodar fora do single do próprio post.
- Versione a pasta acf-json no tema para que field groups viajem com o código e sincronizem automaticamente em cada ambiente.
- Escape toda saída de campo com esc_html(), esc_url() ou wp_kses_post() antes de imprimir, evitando que dados quebrem o HTML.
- Padronize o uso de field name em vez de field key nas chamadas, reservando o key apenas para registro de campos via PHP.
Causa
- O field group está com as Location Rules apontando para outro alvo (ex.: regra Post Type igual a Página, mas o template que imprime é single de Post), então o ACF nem registra o campo para aquele objeto.
- A chamada get_field('campo') roda fora do The Loop ou em um template de archive, onde o post atual não é o que tem o valor, e o segundo parâmetro post_id foi omitido.
- O nome passado em get_field() é o field name errado ou trocado pelo field key (formato field_xxxxxxxx), que só resolve quando o grupo está sincronizado.
- O return format do campo não bate com o template: um campo Image configurado como Array é tratado como se fosse URL, um campo True/False devolve 1 ou 0, e um campo WYSIWYG precisa de the_field() para aplicar os filtros de conteúdo.
- Em campos dentro de um Options Page, o get_field() foi chamado sem o segundo parâmetro option, então o ACF procura o valor no post atual e não na tela de opções.
- Após migração, o Local JSON em acf-json não foi sincronizado, então o field group existe no banco do staging mas não está registrado no código de produção, e o ACF deixa de devolver o valor.
Como resolver
- Confirme que o campo tem valor e descubra o nome real: Edite o post no painel e confirme que o campo está preenchido. Depois imprima o conteúdo direto no template para ver o que o ACF devolve naquele contexto. Se vier vazio aqui, o problema é de contexto ou de registro, não de exibição.
var_dump( get_field('nome_do_campo') ); - Revise as Location Rules do field group: No painel do ACF, abra o field group e confira a aba de localização. A regra precisa cobrir exatamente o objeto que está sendo renderizado (tipo de post, template, taxonomia). Caminho no menu: Custom Fields -> Field Groups -> seu grupo -> Settings -> Location.
Custom Fields -> Field Groups -> [grupo] -> Settings -> Location Rules - Passe o post_id correto quando estiver fora do post: Se a chamada acontece em archive, home, sidebar ou shortcode, o post atual não é o dono do valor. Informe o ID do post, ou option para Options Page, no segundo parâmetro.
the_field('subtitulo', 123); $valor = get_field('telefone', 'option'); - Use o return format certo para o tipo de campo: Imagem como Array precisa acessar a chave url, True/False devolve booleano, e WYSIWYG deve sair por the_field() para aplicar os filtros. Ajuste o template ou troque o Return Format na configuração do campo.
$img = get_field('imagem'); echo esc_url( $img['url'] ); - Sincronize o Local JSON depois de migrar: Se os campos sumiram após subir para produção, o field group pode estar só no acf-json e não registrado. Abra a tela de sincronização e importe os grupos pendentes. Caminho no menu: Custom Fields -> Field Groups -> Sync available.
Custom Fields -> Field Groups -> Sync available -> Sync changes
<?php
// Exibe um campo ACF com segurança, mesmo fora do post atual.
$post_id = get_the_ID(); // ou um ID fixo / 'option' para Options Page
$valor = get_field( 'subtitulo', $post_id );
if ( $valor ) {
echo esc_html( $valor );
}
// Campo de imagem configurado como Array -> use a chave 'url'.
$imagem = get_field( 'imagem_destaque', $post_id );
if ( $imagem && ! empty( $imagem['url'] ) ) {
printf( '<img src="%s" alt="%s">', esc_url( $imagem['url'] ), esc_attr( $imagem['alt'] ) );
}














