# Como corrigir o conflito de Custom Fields entre ACF PRO e JetEngine no WordPress

O conflito de Custom Fields entre ACF PRO e JetEngine ocorre quando os dois plugins registram um campo com o mesmo nome de meta e gravam na mesma chave da tabela wp_postmeta, fazendo um sobrescrever o valor salvo pelo outro.

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

**Antes de começar:** Antes de renomear meta keys, alterar o modo de armazenamento do JetEngine ou desativar grupos de campos em producao, faça backup completo do site (arquivos e banco de dados) ou trabalhe primeiro em staging. Renomear uma meta key sem migrar os valores antigos deixa os dados orfaos no banco e pode parecer que o conteúdo foi perdido.

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

Erros relacionados

- [Como corrigir Custom Fields que não aparecem no frontend no ACF PRO](https://full.services/wp-fixer/corrigir-custom-fields-frontend-acf-pro/)
- [Como corrigir o Flexible Content do ACF PRO que não renderiza no Elementor](https://full.services/wp-fixer/corrigir-flexible-content-elementor-acf-pro/)
- [Como corrigir o WYSIWYG Editor que não carrega no ACF PRO](https://full.services/wp-fixer/corrigir-wysiwyg-editor-acf-pro/)

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

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

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

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

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

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


## Código

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

## Perguntas frequentes

### Por que o valor do meu campo ACF some quando o JetEngine esta ativo

Porque os dois plugins gravam na mesma meta key da tabela wp_postmeta. Quando o ACF e o JetEngine definem campos com o mesmo nome no mesmo post type, o último a salvar o post sobrescreve o valor do outro. Renomeie a meta key de um dos plugins para resolver.

### Qual a diferenca entre Field Name e Field Key no ACF

Segundo a documentação do ACF, o Field Key comeca com field_ e e a referencia interna do plugin, enquanto o Field Name e a meta key gravada no wp_postmeta. O conflito com o JetEngine acontece no Field Name, porque e ele que vira a chave no banco de dados.

### Renomear so o rotulo do campo resolve o conflito

Não. O rotulo (label) e apenas o texto exibido no editor e não toca no banco. O que precisa ficar único e o Field Name no ACF e o Name/Slug no JetEngine, porque são eles que definem a meta key onde o valor e gravado.

### Da para usar ACF PRO e JetEngine no mesmo site sem conflito

Da, desde que os campos dos dois plugins nunca compartilhem a mesma meta key no mesmo post type. Use prefixos diferentes por plugin ou armazene os campos do JetEngine em tabela separada para isolar os dados do postmeta usado pelo ACF.

### Como descubro qual plugin gravou o valor de um campo

Leia a meta key direto no banco com get_post_meta e compare com o retorno de get_field do ACF. Se os dois devolverem valores diferentes para o mesmo nome, ha duas definicoes disputando a mesma meta key e uma esta sobrescrevendo a outra.

### Armazenar os campos do JetEngine em tabela separada resolve a sobrescrita

Sim. Ao configurar a Meta Box do JetEngine para gravar em uma tabela de banco separada, os dados deixam de usar a mesma linha do wp_postmeta que o ACF ocupa, eliminando a disputa pela meta key na origem do problema.

### Preciso migrar os dados antigos ao renomear uma meta key

Sim. Renomear o Field Name ou o slug cria uma nova meta key vazia e deixa os valores antigos presos na chave anterior. Antes de remover a definição duplicada, copie os valores da meta key antiga para a nova para não perder conteúdo.

**Fonte:** [Advanced Custom Fields — Register fields via PHP (field key e field name)](https://www.advancedcustomfields.com/resources/register-fields-via-php/)
