# Como corrigir o conflito de Meta Boxes entre ACF PRO e JetEngine no WordPress

O conflito de meta boxes entre ACF PRO e JetEngine acontece quando os dois plugins registram grupos de campos para o mesmo tipo de post e gravam na mesma meta key, gerando caixas duplicadas no editor, valores sobrescritos e campos que parecem não salvar.

## O que é conflito de Meta Boxes entre ACF PRO e JetEngine?

O conflito de meta boxes entre ACF PRO e JetEngine surge porque os dois plugins fazem a mesma coisa por baixo: registram caixas de campos personalizados (meta boxes) numa tela de edição e guardam o que você digita na tabela wp_postmeta do WordPress. O ACF decide onde mostrar cada grupo de campos por regras de localizacao, formadas por um tipo de localizacao, um operador e um valor, segundo a documentação oficial. O JetEngine, do pacote Crocoblock, tem o próprio módulo de Meta Boxes que faz exatamente o mesmo registro para o mesmo tipo de post.

Quando os dois grupos miram o mesmo post type e, pior, usam o mesmo nome de campo (a mesma meta key), o WordPress passa a ter duas caixas competindo pelo mesmo dado. O editor mostra campos duplicados, o valor salvo por um plugin e lido ou sobrescrito pelo outro, e o usuário tem a impressao de que o campo não salva. O problema não e bug de nenhum dos dois: e dois registradores de meta box gravando no mesmo lugar sem combinarem entre si.

## Como identificar

- Duas caixas de campos aparecem na mesma tela de edição do post, uma do ACF e outra do JetEngine, pedindo a mesma informação.
- Você preenche o campo no grupo do ACF, salva o post e o valor aparece em branco ou com o conteúdo antigo ao recarregar a tela.
- O valor digitado na caixa do JetEngine some quando o post e salvo de novo pela caixa do ACF, e vice-versa.
- Um template do JetEngine (Listing Grid ou Dynamic Field) exibe vazio ou desatualizado mesmo com o campo preenchido no ACF.
- Mensagem 'Notice: meta key already registered' ou avisos de chave duplicada surgem no log quando WP_DEBUG esta ativo.

**Antes de começar:** Renomear meta keys e remover campos altera dados já salvos em wp_postmeta. Faça backup do banco de dados e dos arquivos, ou teste primeiro em um ambiente de staging, antes de aplicar as mudancas em producao, para poder reverter sem perder conteúdo.

## Como prevenir

- Defina desde o inicio do projeto qual plugin e o dono dos campos personalizados de cada post type, evitando registrar o mesmo campo no ACF e no JetEngine.
- Padronize um prefixo de meta key por plugin (ex.: acf_ e jet_) para que nunca dois campos diferentes disputem a mesma chave de wp_postmeta.
- Documente as regras de localizacao do ACF e as condicoes de exibicao do JetEngine para que ninguem ative dois grupos na mesma tela de edição por engano.
- Ao migrar um campo de um plugin para o outro, remova o registro antigo e renomeie a meta key no mesmo passe, sem deixar dois donos para a mesma chave.

Erros relacionados

- [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 Flexible Content do ACF PRO que não renderiza no Elementor](https://full.services/wp-fixer/corrigir-flexible-content-elementor-acf-pro/)
- [Como corrigir Custom Fields que não aparecem no frontend no ACF PRO](https://full.services/wp-fixer/corrigir-custom-fields-frontend-acf-pro/)

## Causa

- O grupo de campos do ACF e um Meta Box do JetEngine apontam para o mesmo post type pela regra de localizacao do ACF ('Tipo de Post e igual a') e pela condicao equivalente no JetEngine, criando duas caixas na mesma tela.
- Os dois plugins usam a mesma meta key para campos diferentes: o campo do ACF e o campo do JetEngine gravam na mesma chave de wp_postmeta, entao o último a salvar sobrescreve o valor do outro.
- O JetEngine esta com a opção 'Save custom fields meta data into a single field' (armazenar em campo único) divergente do esperado pelo ACF, que grava cada campo em uma meta key separada, fazendo a leitura cruzada falhar.
- Um campo foi migrado do JetEngine para o ACF (ou o contrario) sem renomear a meta key nem remover o registro antigo, deixando dois donos para a mesma chave.
- Uma regra de localizacao customizada registrada via acf_register_location_type sobrepoe a condicao do JetEngine no mesmo contexto de edição, exibindo os dois grupos juntos quando o esperado era apenas um.

## Como resolver

1. Mapeie quem registra cada campo e a meta key de cada um: Antes de mexer, liste os campos em conflito. Anote a meta key (nome interno) de cada campo no ACF e no JetEngine. Dois campos com a mesma meta key gravando no mesmo post type são a raiz do conflito de meta box.

```
Painel WP -> ACF -> Grupos de Campos -> abra o grupo e anote o Nome do Campo de cada item
Painel WP -> JetEngine -> Meta Boxes -> abra a caixa e anote o Name/Slug de cada campo
Compare as duas listas e marque toda meta key que aparece nos dois plugins
```

2. Defina um único dono para cada campo: Escolha qual plugin será o dono de cada campo em conflito. A regra prática: se o valor alimenta templates do JetEngine, deixe o campo no JetEngine; se alimenta a lógica do tema ou do PHP via get_field, deixe no ACF. Desative no plugin perdedor o campo que você não escolheu como dono.

```
No plugin que NÃO será o dono, remova o campo duplicado do grupo/caixa
Salve o grupo de campos do ACF e o Meta Box do JetEngine após a remoção
```

3. Separe as meta keys quando os dois campos precisam coexistir: Se os dois campos são realmente distintos mas caíram na mesma chave, renomeie a meta key de um deles para um valor único. Isso elimina a sobrescrita porque cada plugin passa a gravar em uma chave própria de wp_postmeta.

```
Painel WP -> ACF -> abra o campo -> altere o Nome do Campo para um valor exclusivo (ex.: full_preco_acf)
Painel WP -> JetEngine -> abra o campo -> ajuste o Name para outra chave (ex.: full_preco_jet)
Atualize os templates e o código do tema para apontar para a meta key correta
```

4. Alinhe o formato de armazenamento do JetEngine ao do ACF: Confira no Meta Box do JetEngine se a opção de salvar tudo em um único campo esta condizente com o ACF, que grava cada campo em uma meta key separada. Formatos divergentes fazem a leitura cruzada retornar vazio.

```
Painel WP -> JetEngine -> Meta Boxes -> abra a caixa -> Settings
Verifique a opção 'Save custom fields meta data into a single field' e deixe desligada para gravar uma meta key por campo
Salve e reedite um post de teste para confirmar que o valor persiste
```

5. Restrinja a regra de localizacao para um grupo por tela: Ajuste a regra de localizacao do ACF para que o grupo não apareca na mesma tela em que o JetEngine já entrega a caixa. Use a condicao 'Tipo de Post' e, se preciso, um template de página para isolar cada grupo no contexto certo.

```
Painel WP -> ACF -> Grupos de Campos -> abra o grupo -> bloco Localizacao
Restrinja a regra (ex.: 'Tipo de Post e igual a' apenas onde o ACF deve aparecer)
Salve e abra a tela de edição para confirmar que so uma caixa por campo aparece
```


## Código

```php
<?php
// Esconde o grupo de campos do ACF na tela de edicao quando o
// Meta Box do JetEngine for o dono daquele post type, evitando a
// caixa duplicada. Troque 'group_minha_caixa' e 'produto' pelos seus.
add_filter( 'acf/location/rule_match/post_type', 'full_acf_evita_meta_box_duplicado', 20, 3 );
function full_acf_evita_meta_box_duplicado( $match, $rule, $options ) {
    $post_type_jetengine_dono = 'produto';
    if ( isset( $options['post_type'] ) && $options['post_type'] === $post_type_jetengine_dono ) {
        return false; // nao exibe o grupo do ACF nesse post type
    }
    return $match;
}
```

## Perguntas frequentes

### Por que aparecem duas caixas de campos no editor com ACF e JetEngine

Porque os dois plugins registram meta boxes para o mesmo tipo de post. O ACF mostra o grupo pela regra de localizacao e o JetEngine mostra a própria caixa pela condicao dele. Quando ambos miram o mesmo post type, o editor exibe as duas caixas juntas.

### Meu campo do ACF não salva quando o JetEngine esta ativo

Normalmente os dois campos gravam na mesma meta key e o último a salvar sobrescreve o valor do outro. Renomeie a meta key de um dos campos para um valor exclusivo ou defina um único plugin como dono daquele campo para o valor parar de ser apagado.

### O que e uma meta key e por que ela causa o conflito

A meta key e o nome interno sob o qual o WordPress guarda o valor do campo na tabela wp_postmeta. Se o ACF e o JetEngine usam a mesma meta key para campos diferentes, os dois escrevem no mesmo lugar e um sobrescreve o outro a cada salvamento.

### Como decidir se mantenho o campo no ACF ou no JetEngine

Mantenha no JetEngine se o valor alimenta templates do Crocoblock como Listing Grid ou Dynamic Field. Mantenha no ACF se o valor e lido pelo tema ou por PHP com get_field. Escolha um dono por campo e remova o duplicado no outro plugin.

### Posso usar o mesmo campo nos dois plugins ao mesmo tempo

So funciona de forma confiavel se os dois apontarem para a mesma meta key e o formato de armazenamento for compatível, com o JetEngine gravando uma meta key por campo. Sem esse alinhamento, a leitura cruzada retorna vazio ou desatualizada.

### Renomear a meta key apaga os dados que já estavam salvos

Os dados antigos continuam na meta key original e não são movidos sozinhos para o novo nome. Por isso faça backup e, se precisar preservar o histórico, copie os valores da chave antiga para a nova por SQL ou WP-CLI antes de remover a key antiga.

### Como uma regra de localizacao do ACF se relaciona com o conflito

A regra de localizacao do ACF e o que decide em qual tela o grupo de campos aparece, formada por tipo de localizacao, operador e valor. Restringir essa regra evita que o grupo do ACF surja na mesma tela em que o JetEngine já entrega a caixa.

**Fonte:** [Advanced Custom Fields — Custom location rules (ACF_Location, match)](https://www.advancedcustomfields.com/resources/custom-location-rules/)
