Como corrigir o conflito de Custom Fields entre ACF PRO e JetEngine no WordPress
O que é conflito de Custom Fields entre ACF PRO e JetEngine?
O conflito de Custom Fields entre ACF PRO e JetEngine nasce de um detalhe da arquitetura dos dois plugins: ambos guardam o valor de um campo personalizado na tabela wp_postmeta do WordPress, usando o nome do campo como chave (meta key). No ACF, a documentação oficial separa o field key, identificador interno que comeca com field_, do field name, que e exatamente a meta key gravada no banco. O JetEngine, por sua vez, grava o valor de cada meta field também no postmeta usando o slug do campo como meta key. Quando os dois plugins definem campos diferentes com o mesmo nome de meta, eles disputam a mesma linha do banco.
Na prática, o último plugin a salvar o post vence: ao atualizar pelo editor, a meta box do ACF e a meta box do JetEngine escrevem na mesma meta key, e o valor de um substitui o do outro. O resultado e um campo que parece vazio, volta ao valor antigo ou mostra um dado que pertence ao outro plugin. Como o ACF documenta, se duas definicoes compartilham a mesma referencia, a segunda sobrescreve a primeira, e o mesmo principio se aplica quando ACF e JetEngine brigam pela mesma meta key no postmeta.
Como identificar
- Você preenche um campo no grupo do ACF, salva o post e o valor aparece vazio ou volta para o conteúdo antigo na próxima vez que abre o editor.
- Um campo criado no JetEngine passa a exibir o valor digitado no campo de mesmo nome do ACF (ou o contrario), como se os dois compartilhassem o mesmo dado.
- A função get_field(‘nome’) do ACF retorna um valor diferente do que get_post_meta($id, ‘nome’, true) devolve no frontend.
- Dois campos com o mesmo nome aparecem no editor, um vindo do ACF e outro do JetEngine, e apenas um deles mantem o que você digitou após salvar.
- Depois de ativar ou reordenar os plugins, campos que funcionavam param de gravar e o conteúdo some sem nenhuma mensagem de erro visivel.
Como prevenir
- Padronize um prefixo de meta key por plugin (por exemplo acf_ para o ACF e je_ para o JetEngine) para que dois campos nunca compartilhem o mesmo nome no postmeta.
- Defina um único plugin como dono de cada dado: um campo pertence ao ACF ou ao JetEngine, nunca aos dois ao mesmo tempo no mesmo post type.
- Antes de criar um campo novo, audite as meta keys já em uso no post type para evitar duplicar um Field Name do ACF com um slug do JetEngine.
- Quando os dois plugins precisarem coexistir no mesmo post type, prefira armazenar os campos do JetEngine em tabela separada para isolar os dados do wp_postmeta usado pelo ACF.
Causa
- Um grupo de campos do ACF e um meta field do JetEngine usam o mesmo nome de meta (meta key) no mesmo tipo de post, entao ambos gravam na mesma linha do wp_postmeta e o último salvamento sobrescreve o anterior.
- Os dois plugins anexam uma meta box ao mesmo post type com campos de nome identico; ao salvar o post, o hook save_post de cada plugin escreve a mesma meta key em sequencia, e o que roda por último apaga o valor do outro.
- O JetEngine esta configurado para gravar os meta fields no wp_postmeta padrão (em vez de uma tabela separada), colidindo diretamente com a meta key que o ACF já usa para aquele campo.
- Um meta field do JetEngine foi importado ou recriado com o mesmo slug de um field name já existente no ACF, sem que o time percebesse a duplicidade de meta key entre os dois plugins.
- Código no tema chama update_post_meta() ou update_field() na mesma meta key disputada pelos dois plugins, forcando uma gravacao que ignora o valor mantido pelo ACF ou pelo JetEngine.
Como resolver
- Mapeie qual meta key esta em conflito: Identifique o nome do campo que esta sendo sobrescrito. No ACF, abra o grupo de campos e anote o Field Name (e não o Field Label), que e a meta key gravada no banco. No JetEngine, abra a Meta Box e anote o Name/Slug do meta field. Se os dois forem iguais para o mesmo post type, achou a colisao.
Painel WP -> ACF -> Grupos de Campos -> abra o grupo -> anote o Field Name de cada campo Painel WP -> JetEngine -> Meta Boxes -> abra a meta box -> anote o Name/Slug de cada field Compare os nomes: meta key igual no mesmo post type confirma o conflito - Renomeie o campo de um dos plugins para uma meta key única: Escolha um plugin para ser o dono daquele dado e renomeie o campo do outro para uma meta key exclusiva, por exemplo com prefixo do plugin. Trocar so o rotulo não resolve; e o Field Name no ACF e o Name/Slug no JetEngine que precisam ficar diferentes. Após renomear, migre os valores antigos da meta key antiga para a nova.
No JetEngine, renomeie o Name/Slug do field (ex.: de subtitulo para je_subtitulo) Ou no ACF, renomeie o Field Name (ex.: de subtitulo para acf_subtitulo) Migre os dados antigos da meta key original para a nova antes de remover a duplicata - Faca o JetEngine gravar em uma tabela separada: Se renomear não for viavel, configure a Meta Box do JetEngine para armazenar os custom fields em uma tabela de banco separada, em vez do wp_postmeta padrão. Assim os dados do JetEngine deixam de disputar a mesma meta key usada pelo ACF, eliminando a sobrescrita na origem.
Painel WP -> JetEngine -> Meta Boxes -> abra a meta box em conflito Ative a opção de salvar os campos em uma tabela de banco separada (Save Custom Fields to Separate DB Table) Salve e teste a gravacao do campo no editor após a mudanca - Defina um único plugin como fonte do campo no editor: Tenha apenas um plugin exibindo o campo daquele dado no editor do post. Desative o grupo do ACF ou a meta box do JetEngine que duplica o campo, deixando so um responsável por gravar aquela informação, para nenhum dos dois save_post sobrescrever o outro.
No ACF, abra o grupo duplicado e mude o status para inativo, ou ajuste a regra de localizacao para não casar com o post type No JetEngine, remova ou desative o field duplicado da Meta Box do mesmo post type Recarregue o editor e confirme que so um campo daquele dado aparece - Valide o valor gravado direto no banco: Depois de aplicar o ajuste, edite um post de teste, preencha o campo, salve e confirme que o valor persiste após recarregar. Para ter certeza de qual plugin gravou, leia a meta key diretamente com get_post_meta e compare com o retorno do ACF.
Edite um post de teste, preencha o campo e salve Recarregue o editor e confirme que o valor permaneceu Compare get_post_meta($post_id, 'nome', true) com get_field('nome', $post_id) para validar a origem do dado
<?php
/**
* Migra valores de uma meta key antiga (em conflito) para uma nova
* meta key unica, antes de remover a definicao duplicada de um dos plugins.
* Rode uma vez (ex.: via WP-CLI eval-file) e depois remova o codigo.
*/
add_action( 'init', 'full_migrar_meta_em_conflito' );
function full_migrar_meta_em_conflito() {
if ( ! is_admin() || ! current_user_can( 'manage_options' ) ) {
return;
}
$post_type = 'post'; // post type onde ocorre o conflito
$meta_antiga = 'subtitulo'; // meta key disputada por ACF e JetEngine
$meta_nova = 'je_subtitulo';// nova meta key exclusiva do JetEngine
$posts = get_posts( array(
'post_type' => $post_type,
'posts_per_page' => -1,
'fields' => 'ids',
'post_status' => 'any',
) );
foreach ( $posts as $post_id ) {
$valor = get_post_meta( $post_id, $meta_antiga, true );
if ( '' === $valor || null === $valor ) {
continue;
}
// So grava se a nova chave ainda nao tiver valor, para nao sobrescrever.
if ( '' === get_post_meta( $post_id, $meta_nova, true ) ) {
update_post_meta( $post_id, $meta_nova, $valor );
}
}
}














