# Como corrigir custom fields do JetEngine que não exibem em cursos do Tutor LMS no WordPress

O custom field do JetEngine não exibe em cursos do Tutor LMS quando a Meta Box não esta atribuida ao post type courses ou quando o Dynamic Field aponta para um object context diferente do curso, deixando o meta field vazio na página renderizada pelo Tutor.

## O que é custom fields do JetEngine que não exibem em cursos do Tutor LMS?

O JetEngine cria custom fields através de Meta Boxes anexadas a um object context específico: um post type, uma taxonomia, um usuário ou uma options page. O valor so e gravado e lido a partir desse contexto. Para exibir o dado, você usa o widget Dynamic Field (no Elementor, Bricks ou nos blocos do Gutenberg) ou um Listing Item, sempre indicando a fonte Meta Data e o nome exato do meta field. Quando a fonte ou o object context não casam com o objeto que esta sendo renderizado, o campo retorna vazio.

O Tutor LMS registra os cursos como um custom post type próprio (courses), com páginas montadas por templates internos do plugin. A incompatibilidade aparece quando a Meta Box do JetEngine foi criada para o post type errado, quando o Dynamic Field e colocado em um Listing ou template cujo objeto atual não e o curso, ou quando o nome do meta field digitado no widget não bate com a chave gravada. Nesses casos o campo existe no banco, mas não aparece na página do curso porque o JetEngine consulta o objeto ou a chave errada na hora de renderizar.

## Como identificar

- O custom field do JetEngine aparece em branco na página do curso do Tutor LMS, mesmo com o valor preenchido na tela de edição do curso.
- No editor do Listing Item ou do template do Elementor o Dynamic Field mostra 'No data' ou simplesmente não renderiza nenhum texto.
- A Meta Box do JetEngine não aparece na tela de edição do curso (Courses), so em posts ou páginas comuns.
- O valor do campo some quando o curso e exibido por um Listing Grid, mas aparece quando você abre o post diretamente, ou vice-versa.
- O shortcode ou a tag dinâmica do JetEngine retorna vazio dentro de um conteúdo que o Tutor LMS injeta na página do curso.

**Antes de começar:** Antes de alterar Meta Boxes, Listings ou o Object Context de templates em producao, faca um backup do site (arquivos e banco de dados) ou teste primeiro em um ambiente de staging, para reverter caso a página do curso pare de renderizar o conteúdo dinâmico.

## Como prevenir

- Sempre crie a Meta Box do JetEngine já vinculada ao post type Courses ao planejar campos para cursos do Tutor LMS, evitando campos orfaos em Posts ou Pages.
- Padronize as chaves dos meta fields com nomes curtos e em minusculas, e reutilize exatamente a mesma chave no widget Dynamic Field para evitar erros de digitacao.
- Documente o Object Context esperado de cada Listing Item e template de curso, para que novos campos herdem o contexto correto do queried object.
- Valide novos campos sempre na URL pública do curso e não apenas na previa do editor, já que o queried object do Tutor LMS so e resolvido no frontend.

Erros relacionados

- [Como corrigir custom fields do ACF PRO que não exibem em cursos do Tutor LMS](https://full.services/wp-fixer/corrigir-acf-fields-tutor-lms-cursos/)
- [Como corrigir o erro de permissão ao criar Custom Fields no JetEngine](https://full.services/wp-fixer/corrigir-erro-permissao-custom-fields-jetengine/)
- [Como corrigir o conflito de templates de curso entre Tutor LMS e Elementor](https://full.services/wp-fixer/corrigir-conflito-template-tutor-lms-elementor/)

## Causa

- A Meta Box do JetEngine foi criada com a opção 'Meta Box for' apontando para Posts ou Pages, e não para o post type Courses do Tutor LMS, entao o campo nunca e anexado nem gravado no objeto do curso.
- O widget Dynamic Field esta com a fonte Meta Data correta, mas o nome do meta field digitado no campo Meta Field não bate exatamente com a chave do field registrado no JetEngine (diferenca de letra, espaco ou maiuscula).
- O Dynamic Field foi colocado dentro de um Listing Item ou template cujo Object Context resolve para um objeto diferente do curso (por exemplo, o post da página pai e não o item do loop), fazendo o JetEngine ler o meta de outro objeto.
- O Listing Grid que monta a área de cursos esta com a fonte (Listing source / Posts query) apontando para um post type diferente de Courses, de modo que o item renderizado não e o curso que contem o meta field.
- O custom field foi adicionado ao curso depois que o Tutor LMS já havia salvo o post, e o template do curso e renderizado por um hook do Tutor que não expoe o queried object para o Dynamic Field, deixando o JetEngine sem o objeto atual para consultar.

## Como resolver

1. Atribua a Meta Box do JetEngine ao post type Courses: Abra a Meta Box do JetEngine que contem o campo e confirme que ela esta vinculada ao post type dos cursos do Tutor LMS, e não a Posts ou Pages. Sem esse vinculo o campo nem aparece na edição do curso e nunca grava o valor no objeto certo.

```
Painel WP -> JetEngine -> Meta Boxes -> abra a Meta Box do campo
No bloco 'Meta Box for', selecione 'Post Type' e escolha 'Courses'
Salve a Meta Box e reabra um curso para confirmar que o campo aparece na edição
```

2. Confirme o nome exato do meta field: Compare a chave do field cadastrada no JetEngine com o nome digitado no widget Dynamic Field. O JetEngine le o meta pela chave literal, entao qualquer diferenca de caractere faz o campo retornar vazio.

```
Painel WP -> JetEngine -> Meta Boxes -> anote o valor do campo 'Name/ID' do field
No editor, selecione o widget Dynamic Field -> Source: Meta Data
No campo 'Meta Field', cole exatamente a mesma chave (sem espacos ou maiusculas extras)
```

3. Ajuste o Object Context do Dynamic Field: Se o campo esta dentro de um Listing Item ou de um template, abra as opções de Object Context do widget e aponte para o objeto que e o curso (o item atual do loop ou o queried object), para que o JetEngine leia o meta do curso certo.

```
Selecione o widget Dynamic Field -> abra 'Object Context'
Dentro de um Listing Item, escolha 'Default Object' (o item atual do loop)
Em um template de página única, use 'Current Post' / 'Queried object' para apontar ao curso
```

4. Corrija a fonte do Listing Grid de cursos: Se os cursos são listados por um Listing Grid, confirme que o Listing usado tem a fonte definida como o post type Courses. Um Listing com fonte de outro post type renderiza itens que não contem o meta field.

```
Painel WP -> JetEngine -> Listings -> abra o Listing usado na grade
Em 'Listing source' selecione 'Posts' e em 'From post type' escolha 'Courses'
No Listing Grid, selecione esse Listing e recarregue a página para validar
```

5. Limpe o cache e valide na página do curso: Depois de ajustar contexto e fonte, limpe os caches de página e do Elementor e abra a página real do curso (não so a previa do editor), porque o template do Tutor LMS so resolve o queried object no frontend.

```
Painel WP -> Elementor -> Tools -> Regenerate CSS & Data
Limpe o cache do plugin de cache ativo (ex.: WP Rocket -> Limpar cache)
Abra a URL pública do curso e confirme que o custom field aparece preenchido
```


## Código

```php
<?php
/**
 * Exibe um meta field do JetEngine na pagina do curso do Tutor LMS
 * usando o ID do curso renderizado (queried object), com a chave exata.
 */
add_action( 'tutor_course/single/after/title', 'full_jetengine_course_meta' );
function full_jetengine_course_meta() {
    $course_id = get_the_ID();
    if ( ! $course_id ) {
        return;
    }
    // 'duracao_curso' deve bater com a chave registrada na Meta Box do JetEngine.
    $valor = get_post_meta( $course_id, 'duracao_curso', true );
    if ( '' === $valor || null === $valor ) {
        return;
    }
    printf( '<p class="full-course-meta">%s</p>', esc_html( $valor ) );
}
```

## Perguntas frequentes

### Por que meu custom field do JetEngine fica vazio na página do curso do Tutor LMS

Na maioria dos casos a Meta Box não esta atribuida ao post type Courses ou o Dynamic Field aponta para um object context diferente do curso. Vincule a Meta Box ao post type Courses e ajuste o Object Context do widget para o queried object do curso.

### Como faco a Meta Box do JetEngine aparecer na edição do curso

Abra a Meta Box em JetEngine -> Meta Boxes e no bloco 'Meta Box for' selecione Post Type e escolha Courses. Sem esse vinculo o campo não aparece na tela de edição do curso nem grava o valor no objeto do Tutor LMS.

### O nome do meta field precisa ser identico no widget Dynamic Field

Sim. O JetEngine le o meta pela chave literal registrada no field. Qualquer diferenca de letra, espaco ou maiuscula entre a chave cadastrada e o que você digita no campo Meta Field do widget faz o valor retornar vazio.

### Por que o campo aparece no editor mas some na página pública do curso

O template do curso e renderizado por hooks do Tutor LMS e o queried object so e resolvido no frontend. Limpe o cache e valide sempre na URL pública do curso, ajustando o Object Context para Current Post ou queried object.

### Como exibir o custom field dentro de um Listing Grid de cursos

Confirme que o Listing usado tem a fonte definida como o post type Courses e que o Dynamic Field usa o Default Object do Listing Item. Assim o JetEngine le o meta do curso atual do loop e não de outro objeto.

### Posso exibir o campo do JetEngine direto no template do Tutor LMS via código

Pode. Use a função get_post_meta com o ID do curso correto e a chave exata do field dentro de um hook do Tutor LMS que rode na página do curso, garantindo que o objeto consultado seja o curso renderizado.

### Por que o valor aparece em um curso e some em outro

Isso indica que so alguns cursos tem o meta gravado, ou que a Meta Box foi atribuida ao post type depois que alguns cursos já existiam. Reabra e salve os cursos afetados para gravar o valor, e confirme que a regra de atribuicao cobre todos eles.

### Preciso de cache limpo para ver o custom field atualizado

Sim, na prática e recomendado. Após ajustar Meta Box, fonte do Listing ou Object Context, limpe o cache do Elementor e do plugin de cache e recarregue a página pública, pois a versão em cache pode ainda renderizar o campo vazio.

**Fonte:** [Crocoblock Knowledge Base - JetEngine Meta Fields](https://crocoblock.com/knowledge-base/)
