# Como corrigir o conflito de meta boxes entre JetEngine e ACF PRO no WordPress

O conflito de meta boxes entre JetEngine e ACF PRO acontece quando os dois plugins registram campos com o mesmo nome (a mesma meta key) no mesmo tipo de post, fazendo um sobrescrever o valor do outro ao salvar e gerando campos duplicados no editor.

## O que é conflito de meta boxes entre JetEngine e ACF PRO?

JetEngine e ACF PRO são dois plugins que adicionam campos personalizados ao WordPress, e cada um cria suas proprias caixas de campos (meta boxes) na tela de edição de posts. O JetEngine guarda os valores no Meta Box atrelado a um tipo de conteúdo, enquanto o ACF PRO usa grupos de campos registrados por regra de localizacao. Internamente, os dois gravam o valor na tabela wp_postmeta usando o Name (ACF) ou o Slug do campo (JetEngine) como meta key. O conflito de meta boxes aparece quando esses dois nomes coincidem no mesmo tipo de post: o editor passa a mostrar dois campos para o mesmo dado, e o último plugin que salva o post grava por cima do valor do outro.

A documentação oficial do ACF deixa explicito que o parametro Name de um campo e o que ele usa para salvar e carregar o dado, e alerta que registrar dois campos ou dois grupos com a mesma chave faz o segundo sobrescrever o primeiro. Por isso, quando JetEngine e ACF PRO disputam a mesma meta key, o resultado e valor que some, dado que volta ao antigo depois de salvar, ou um campo que aparece vazio no frontend porque a função get_field do ACF deixou de ler meta não registrada como campo ACF a partir da versão 5.11.

## Como identificar

- Dois campos identicos aparecem na tela de edição do post: um vindo do Meta Box do JetEngine e outro do grupo de campos do ACF PRO, ambos pedindo o mesmo dado.
- O valor digitado some ou volta ao valor anterior depois de clicar em Atualizar, porque o outro plugin gravou por cima na mesma meta key.
- No frontend o campo aparece vazio mesmo com dado preenchido no editor, já que a função get_field do ACF não retorna o valor que o JetEngine salvou.
- O macro Get Meta Field ou o widget Dynamic Field do JetEngine exibe um valor diferente do que o editor mostra para o mesmo post.
- Ao alternar entre editar pelo JetEngine e pelo ACF PRO, cada plugin mostra um valor distinto para o que deveria ser o mesmo campo.

**Antes de começar:** Antes de renomear campos ou rodar o código de migração de meta key, faça um backup completo do site (arquivos e banco de dados) ou teste primeiro em um ambiente de staging. A migração escreve direto na tabela wp_postmeta e, sem backup, um slug errado pode apagar os valores dos posts.

## Como prevenir

- Defina uma convencao de nomes de meta key por plugin desde o inicio, por exemplo sufixo _acf para campos do ACF e _jet para campos do JetEngine, para que nunca coincidam no mesmo tipo de post.
- Use apenas um plugin de campos personalizados como fonte de verdade de cada dado, e reserve o outro so para exibir ou consultar, sem registrar o mesmo campo duas vezes.
- Antes de criar um campo novo, confira a lista de Slugs do JetEngine e de Names do ACF do mesmo tipo de post para garantir que a string e única.
- Documente, no repositorio do tema ou em uma planilha, qual plugin e dono de cada campo e como o frontend le esse dado, evitando que outra pessoa recrie o campo no plugin errado.

Erros relacionados

- [Como corrigir o conflito de Meta Boxes entre ACF PRO e JetEngine](https://full.services/wp-fixer/corrigir-conflito-meta-boxes-acf-jetengine/)
- [Como corrigir o conflito de Custom Fields entre ACF PRO e JetEngine](https://full.services/wp-fixer/corrigir-conflito-custom-fields-acf-jetengine/)
- [Como corrigir o erro de licença da Crocoblock e reativar](https://full.services/wp-fixer/corrigir-erro-licenca-crocoblock/)

## Causa

- O Slug do campo no Meta Box do JetEngine e identico ao Name de um campo do grupo do ACF PRO, fazendo os dois gravarem na mesma chave meta_key da tabela wp_postmeta e um sobrescrever o outro ao salvar.
- O Meta Box do JetEngine e o grupo de campos do ACF PRO estão atrelados ao mesmo tipo de post pela regra de localizacao, duplicando o campo na tela de edição do mesmo conteúdo.
- Um campo foi criado primeiro no ACF PRO e depois recriado no JetEngine com o mesmo slug para reaproveitar dados antigos, sem migrar a meta key, o que coloca os dois plugins disputando a mesma chave.
- O frontend le o dado com get_field do ACF, mas o valor foi gravado pelo JetEngine: desde o ACF 5.11 o get_field não retorna mais meta que não pertence a um campo ACF registrado, entao o valor do JetEngine aparece como vazio.
- Um campo do tipo galeria, repeater ou relacionamento e salvo em formato serializado diferente por cada plugin na mesma meta key, corrompendo a leitura quando o outro plugin tenta interpretar o valor.

## Como resolver

1. Identifique a meta key duplicada: Liste o Slug de cada campo do Meta Box do JetEngine e o Name de cada campo do grupo do ACF PRO atrelados ao mesmo tipo de post. O conflito ocorre quando os dois usam exatamente a mesma string, porque essa string vira a meta_key na tabela wp_postmeta.

```
Painel WP -> JetEngine -> Meta Boxes -> abra o Meta Box e anote o Slug de cada campo
Painel WP -> ACF -> Grupos de Campos -> abra o grupo e anote o Name de cada campo
Compare as duas listas e marque toda string que aparece nos dois plugins
```

2. Decida qual plugin será o dono de cada campo: Escolha um único plugin para gerenciar cada dado em vez de manter o campo nos dois. Use o ACF PRO quando o frontend le com get_field, e o JetEngine quando o dado alimenta Listing Grid, Dynamic Field ou Query Builder. Manter o campo em apenas um plugin elimina a disputa pela meta key.

```
Mapeie cada campo conflitante para um único dono: ACF PRO ou JetEngine
Liste os campos que serão removidos do plugin perdedor
```

3. Renomeie ou remova o campo duplicado no plugin perdedor: No plugin que não será o dono, remova o campo conflitante ou altere o Slug ou Name para uma string única que não exista no outro plugin. Isso separa as meta keys e impede a sobrescrita. Renomear, e não apagar, preserva o histórico se houver dados antigos para migrar.

```
JetEngine: edite o Meta Box e troque o Slug do campo, por exemplo de preco para preco_jet
ACF PRO: edite o grupo e troque o Name do campo, por exemplo de preco para preco_acf
Salve o Meta Box ou o grupo de campos após a alteração
```

4. Migre os dados antigos para a nova meta key: Se já havia valores gravados na meta key antiga, copie-os para a nova chave usando o código de migração da seção de código abaixo. Sem essa migração, os posts existentes ficam com o campo vazio depois da renomeacao. Rode o código uma única vez e remova-o em seguida.

```
Adicione o código de migração em um plugin de snippet ou no functions.php do tema filho
Acesse uma página do admin uma vez para disparar a migração no hook admin_init
Confirme que os valores migraram e remova o código do site
```

5. Ajuste o frontend para ler a fonte correta: Garanta que o template do frontend leia o campo pelo plugin que virou dono. Se o ACF PRO e o dono, use get_field com o Name atualizado; se o JetEngine e o dono, use o widget Dynamic Field ou o macro Get Meta Field com o Slug atualizado. Misturar as fontes recria o sintoma do valor vazio.

```
ACF dono: troque get_field('preco') por get_field('preco_acf') no template
JetEngine dono: no Dynamic Field aponte Meta Field para preco_jet
Limpe o cache do site e recarregue a página para validar o valor
```


## Código

```php
<?php
// Migra o valor de uma meta key antiga (compartilhada) para a nova key unica.
// Rode UMA vez e remova o snippet em seguida.
add_action( 'admin_init', 'full_migrar_meta_key_conflito' );
function full_migrar_meta_key_conflito() {
    if ( get_option( 'full_meta_key_migrada' ) ) {
        return; // ja rodou, nao repete
    }

    $post_type = 'imovel';   // tipo de post afetado
    $key_antiga = 'preco';   // meta key que JetEngine e ACF disputavam
    $key_nova   = 'preco_acf'; // novo Name unico do campo dono

    $posts = get_posts( array(
        'post_type'      => $post_type,
        'post_status'    => 'any',
        'posts_per_page' => -1,
        'fields'         => 'ids',
    ) );

    foreach ( $posts as $post_id ) {
        $valor = get_post_meta( $post_id, $key_antiga, true );
        if ( '' === $valor || null === $valor ) {
            continue; // nada para migrar neste post
        }
        update_post_meta( $post_id, $key_nova, $valor );
    }

    update_option( 'full_meta_key_migrada', 1 );
}
```

## Perguntas frequentes

### Por que JetEngine e ACF PRO mostram dois campos iguais no editor

Porque os dois plugins estão atrelados ao mesmo tipo de post e registraram um campo com o mesmo nome. Cada plugin desenha sua própria caixa de campos na tela de edição, entao o mesmo dado aparece duplicado. Mantenha o campo em apenas um dos plugins para o editor parar de exibir os dois.

### O valor do meu campo some depois que salvo o post

Isso acontece quando o JetEngine e o ACF PRO gravam na mesma meta key e o último plugin a salvar sobrescreve o valor do outro. Renomeie o Slug ou o Name do campo no plugin que não será o dono para que cada um use uma chave distinta na tabela wp_postmeta.

### Por que o get_field do ACF não le o valor salvo pelo JetEngine

Desde o ACF 5.11, segundo a documentação oficial, o get_field deixou de retornar meta que não pertence a um campo ACF registrado. Se o dado foi gravado pelo JetEngine, o get_field devolve vazio. Use o get_post_meta para ler a chave crua ou faça o ACF ser o dono daquele campo.

### Posso usar JetEngine e ACF PRO no mesmo site sem conflito

Sim. O conflito so ocorre quando os dois registram campos com o mesmo nome no mesmo tipo de post. Adote uma convencao de nomes que nunca coincida, por exemplo sufixo _jet e _acf, e cada plugin gerencia seus próprios campos sem disputar a meta key.

### Como descubro qual meta key esta em conflito

Abra o Meta Box no JetEngine e anote o Slug de cada campo, depois abra o grupo no ACF PRO e anote o Name de cada campo do mesmo tipo de post. Toda string que aparecer nas duas listas e uma meta key em conflito que precisa ser renomeada em um dos plugins.

### Renomear o campo apaga os dados já gravados

Renomear o Slug ou o Name não apaga o valor antigo, mas o novo campo passa a ler uma chave vazia até você migrar o dado. Use o código de migração para copiar o valor da meta key antiga para a nova e so depois confie no campo renomeado.

### Qual plugin devo escolher como dono do campo

Escolha o ACF PRO quando o frontend le o dado com get_field em templates PHP, e o JetEngine quando o dado alimenta Listing Grid, Dynamic Field ou Query Builder. O importante e que cada campo tenha um único dono para não haver duas gravacoes na mesma chave.

**Fonte:** [Advanced Custom Fields — Registering fields via PHP (acf_add_local_field_group)](https://www.advancedcustomfields.com/resources/register-fields-via-php/)
