Como corrigir a lentidão do ACF PRO com muitos Custom Fields
O que é a lentidão de performance do ACF PRO?
O ACF PRO guarda cada custom field como uma linha na tabela postmeta e guarda a definição de cada field group em registros do tipo acf-field-group no banco. Quando o site tem muitos grupos e dezenas de campos por tela, abrir um post no editor obriga o ACF a ler as definições de todos os grupos aplicáveis e a buscar o valor de cada campo, gerando dezenas ou centenas de queries por carregamento. Conforme a documentação oficial, quanto mais dados e mais complexos os field groups, mais recursos o servidor precisa para processá-los. O resultado é um wp-admin lento ao editar posts, ao salvar e ao abrir as telas de Options Page.
Como identificar
- A tela de edição de post ou de Options Page demora vários segundos para terminar de carregar, com a barrinha do navegador travada no final.
- O Query Monitor mostra centenas de queries SELECT na tabela wp_postmeta vindas das funções get_field e get_fields do ACF a cada carregamento.
- Salvar um post com muitos campos demora ou retorna a mensagem ‘Maximum execution time exceeded’ quando há Repeater ou Flexible Content extensos.
- Páginas do site que renderizam muitos campos via the_field ficam lentas e o TTFB no PageSpeed sobe junto com o número de field groups.
Como prevenir
- Mantenha o Local JSON ligado desde o início do projeto e versione a pasta acf-json no Git junto com o tema.
- Crie field groups pequenos e com regras de localização específicas, em vez de um único grupo catch-all para o site inteiro.
- Use Autoload Options apenas para valores lidos em toda página, e monitore o tempo das telas com o Query Monitor após cada novo field group.
Causa
- Field groups grandes do tipo catch-all, com dezenas de campos numa única tela, que o ACF precisa ler e processar inteiros a cada carregamento do editor.
- Field groups e post types armazenados no banco em vez do Local JSON, fazendo o ACF consultar a definição de cada grupo no banco em toda requisição.
- Options Pages com a opção Autoload Options ligada para valores raramente usados, inflando o autoload da tabela wp_options carregado em toda página.
- Repeater e Flexible Content com centenas de linhas renderizadas de uma vez, sem a paginação de Repeater, sobrecarregando o navegador e o PHP.
- Uso de get_field dentro de loops grandes sem cache de objeto persistente (Redis ou Memcached), repetindo a mesma leitura na tabela postmeta a cada iteração.
Como resolver
- Meça as queries do ACF com o Query Monitor: instale o Query Monitor e abra a tela lenta (edição de post ou Options Page). Filtre as queries pela origem ACF e confirme se o gargalo são leituras na tabela postmeta ou na carga das definições de field group, para atacar a causa certa.
wp plugin install query-monitor --activate - Ative o Local JSON do ACF PRO: crie a pasta de Local JSON dentro do tema. A partir daí, o ACF lê as definições de field group de arquivos estáticos em vez do banco, reduzindo as consultas em toda requisição, conforme a documentação oficial. Crie a pasta com a permissão correta.
mkdir wp-content/themes/seu-tema-filho/acf-json chmod 0755 wp-content/themes/seu-tema-filho/acf-json - Quebre os field groups catch-all em grupos menores: divida cada grupo gigante em grupos menores com propósito específico e regras de localização restritas ao tipo de post certo. Assim, cada tela carrega apenas os campos que usa, e não a base inteira de campos do site.
- Desligue o Autoload das Options Pages pouco usadas: na configuração da Options Page, deixe o Autoload Options desligado para valores que não são lidos em todas as páginas. Segundo a documentação, o autoload só compensa para valores acessados com muita frequência, como os de cabeçalho e rodapé.
SELECT SUM(LENGTH(option_value)) AS autoload_bytes FROM wp_options WHERE autoload = 'yes'; - Pagine Repeaters longos e ative o cache de objeto: ligue a configuração de paginação nos Repeater Fields com muitas linhas para renderizar menos linhas por vez. Em paralelo, habilite um cache de objeto persistente (Redis ou Memcached) para o ACF não repetir as mesmas leituras de postmeta a cada uso de get_field no loop.
// functions.php do tema filho — Local JSON do ACF PRO
// Salva e carrega as definicoes de field group de arquivos estaticos
// na pasta acf-json do tema, reduzindo queries no banco a cada carregamento.
add_filter( 'acf/settings/save_json', function ( $path ) {
return get_stylesheet_directory() . '/acf-json';
} );
add_filter( 'acf/settings/load_json', function ( $paths ) {
unset( $paths[0] );
$paths[] = get_stylesheet_directory() . '/acf-json';
return $paths;
} );














