# Como corrigir custom field do ACF que não exibe em cursos do Tutor LMS no WordPress

No ACF Tutor LMS, o custom field não exibe no curso quase sempre porque a regra de localização do grupo de campos não aponta para o tipo de post courses, ou porque o template do curso chama get_field sem o ID do curso correto, deixando o valor do meta vazio na página.

## O que é ACF custom field que não exibe em cursos do Tutor LMS?

Um custom field do ACF Tutor LMS é um campo personalizado que você anexa ao tipo de post de cursos (o CPT courses, registrado pelo Tutor LMS) por meio de um grupo de campos do ACF, e que depois é lido na página do curso com get_field ou the_field. O problema aparece quando esse campo, visível e preenchido no editor do curso, simplesmente não aparece na página pública do curso, ou some também do próprio editor.

A documentação do ACF é direta neste ponto: um grupo de campos só aparece em um tipo de post quando a regra de localização casa com aquele tipo de post, e o valor só é recuperado quando get_field recebe o objeto ou o ID do post certo. Como o Tutor LMS usa um CPT próprio para cursos e renderiza a página por templates próprios (single de curso e loop de curso), os dois pontos de falha mais comuns são a regra de localização não mirar o CPT courses e o template chamar get_field fora do contexto do curso, sem passar o ID do curso. Quando isso ocorre, o postmeta existe no banco, mas nada é impresso na tela.

## Como identificar

- O valor do campo aparece preenchido ao editar o curso no painel, mas a página pública do curso no Tutor LMS não mostra o conteúdo do campo em lugar nenhum.
- A chamada the_field('meu_campo') ou get_field('meu_campo') retorna vazio ou false dentro do template de curso, mesmo com o campo salvo.
- O grupo de campos do ACF nem chega a aparecer no editor do curso, embora apareça normalmente em posts e páginas comuns.
- O campo aparece na lista de cursos (loop) mas some na página individual do curso, ou o contrário, porque o ID do post muda entre os dois contextos.
- Ao usar get_field sem informar o ID, o valor exibido é o de outro post (a página de arquivo ou a Home), e não o do curso aberto.

**Antes de começar:** Antes de editar templates do Tutor LMS ou alterar regras de localização em produção, faça um backup do site (arquivos e banco de dados) ou trabalhe primeiro em um ambiente de staging, para poder reverter caso a página do curso quebre. Edite templates em um tema filho, nunca direto na pasta do plugin, para não perder a alteração na próxima atualização.

## Como prevenir

- Ao criar campos para cursos, defina a regra de localização do grupo já mirando o tipo de post Curso do Tutor LMS, e não Post ou Página por hábito.
- Sempre passe o ID do curso como segundo argumento de get_field nos templates do Tutor LMS, em vez de confiar no post global dentro dos loops do plugin.
- Padronize a leitura dos campos com o nome exato do field name do ACF e documente as meta keys usadas em cada template de curso.
- Sobrescreva os templates do Tutor LMS sempre em tema filho e chame wp_reset_postdata após qualquer loop secundário para não corromper o contexto do post.

Erros relacionados

- [Como corrigir o Course Builder que não carrega no Tutor LMS](https://full.services/wp-fixer/corrigir-course-builder-nao-carrega-tutor-lms/)
- [Como corrigir instrutores sem permissão para criar cursos no Tutor LMS](https://full.services/wp-fixer/corrigir-permissao-instrutor-criar-curso-tutor-lms/)
- [Como corrigir o progresso do aluno que não atualiza no Tutor LMS](https://full.services/wp-fixer/corrigir-progresso-aluno-tutor-lms/)

## Causa

- A regra de localização do grupo de campos no ACF está apontando para Post ou Página, e não para a opção Tipo de Post igual a Curso (o CPT courses do Tutor LMS), então o grupo nunca casa com a tela de edição do curso.
- O template do curso (single de curso ou loop renderizado pelo Tutor LMS) chama get_field('campo') sem passar o ID do curso, e nesse contexto o get_the_ID retorna o ID da página de arquivo do Tutor LMS, não o do curso, devolvendo valor vazio.
- O grupo de campos está com o status Active desligado em ACF, Grupos de Campos, fazendo o campo sumir tanto do editor do curso quanto da leitura por get_field.
- A meta key consultada no template difere do nome real do campo no ACF (por exemplo um typo ou um campo dentro de um grupo de repetição), então get_field('campo') não encontra o postmeta gravado.
- Um template de curso sobrescrito do Tutor LMS roda dentro de um loop secundário sem wp_reset_postdata, deixando o objeto global de post apontando para outro item quando o the_field é executado.

## Como resolver

1. Aponte a regra de localização para o tipo de post Curso: Em ACF, Grupos de Campos, abra o grupo que deveria aparecer no curso e ajuste a regra de localização para mirar o tipo de post de cursos do Tutor LMS. O dropdown do ACF lista os tipos de post registrados, então o curso aparece como uma opção depois que o Tutor LMS está ativo.

```
Painel WP -> ACF -> Grupos de Campos -> abra o grupo
Em Localização, defina: Tipo de Post -> é igual a -> Curso
Salve o grupo de campos
```

2. Confirme que o grupo de campos está Ativo: Ainda na tela do grupo de campos, garanta que o status está marcado como Active. Um grupo inativo não aparece no editor do curso nem é lido por get_field na página pública.

```
Painel WP -> ACF -> Grupos de Campos
Confirme que o grupo está com o status Active (Ativo) e não Inactive
```

3. Passe o ID do curso ao chamar get_field no template: No template de curso do Tutor LMS, nunca confie no post global dentro de loops do plugin. Recupere o ID do curso de forma explícita com get_the_ID dentro do The Loop, ou guarde o ID antes do loop secundário, e passe esse ID como segundo argumento de get_field para ler o meta do curso certo.

```
Edite o template do curso (tema filho ou pasta de override do Tutor LMS)
Use: $course_id = get_the_ID();
Use: echo get_field('meu_campo', $course_id);
```

4. Confira o nome exato do campo no ACF: Abra o campo dentro do grupo e copie o Nome do Campo (field name), não o rótulo. A meta key usada em get_field precisa ser idêntica a esse nome. Para campos dentro de grupos ou repetidores, use a função correspondente do ACF em vez de get_field direto.

```
Painel WP -> ACF -> Grupos de Campos -> abra o campo
Copie o valor do campo Nome (ex.: carga_horaria) e use o mesmo em get_field('carga_horaria', $course_id)
```

5. Restaure o post global após loops secundários: Se o template do curso usa WP_Query ou loops auxiliares antes de imprimir o campo, chame wp_reset_postdata após cada loop para devolver o objeto global de post ao curso atual. Sem isso, the_field lê o meta do último item do loop, não o do curso.

```
Após cada WP_Query no template, adicione: wp_reset_postdata();
Só então chame the_field('meu_campo') para o curso atual
```


## Código

```php
<?php
/**
 * Exibe um ACF custom field na pagina de curso do Tutor LMS
 * de forma segura, passando sempre o ID do curso.
 * Cole no template single de curso (override em tema filho).
 */
$course_id = get_the_ID();
$carga = get_field( 'carga_horaria', $course_id );

if ( $carga ) {
    printf(
        '<p class="tutor-course-meta">Carga horaria: %s</p>',
        esc_html( $carga )
    );
}

// Exemplo com loop secundario: resetar o post global depois.
$relacionados = new WP_Query( array(
    'post_type'      => 'courses',
    'posts_per_page' => 3,
) );
while ( $relacionados->have_posts() ) {
    $relacionados->the_post();
    echo esc_html( get_field( 'subtitulo', get_the_ID() ) );
}
wp_reset_postdata(); // devolve o post global ao curso atual
```

## Perguntas frequentes

### Por que o ACF custom field aparece no editor do curso mas não na página do Tutor LMS

Na maioria das vezes o template do curso chama get_field sem o ID do curso, e nesse contexto o ID global é o da página de arquivo do Tutor LMS, não o do curso aberto. Recupere o ID com get_the_ID e passe como segundo argumento de get_field.

### Como faço o grupo de campos do ACF aparecer no tipo de post de cursos

Em ACF, Grupos de Campos, ajuste a regra de localização para Tipo de Post é igual a Curso. Segundo a documentação do ACF, um grupo só aparece em um tipo de post quando a regra de localização casa com aquele tipo, e o Tutor LMS registra o curso como um tipo de post próprio.

### Preciso passar o ID do post no get_field dentro do Tutor LMS

Sim, é o mais seguro. Nos templates e loops do Tutor LMS o post global pode apontar para outro item, então passe o ID do curso como segundo argumento, por exemplo get_field('campo', $course_id), para ler o meta do curso correto.

### O get_field retorna vazio mesmo com o campo preenchido, o que fazer

Confirme três coisas: que o grupo está Active, que a regra de localização mira o curso, e que o nome usado em get_field é idêntico ao field name do campo no ACF. Um typo no nome ou um campo dentro de repetidor faz a função não encontrar o postmeta.

### Por que o campo mostra o valor de outro curso ou da página de arquivo

Isso acontece quando um loop secundário no template não foi resetado. Chame wp_reset_postdata após cada WP_Query para devolver o post global ao curso atual antes de imprimir o campo com the_field.

### Funciona com campos dentro de grupos ou repetidores do ACF no curso

Funciona, mas não com get_field direto na chave do subcampo. Use as funções do ACF para repetidor (have_rows e the_sub_field) ou recupere o grupo inteiro com get_field e acesse o índice, sempre informando o ID do curso quando estiver fora do loop principal.

### O Tutor LMS interfere no funcionamento do ACF

O Tutor LMS não bloqueia o ACF. Ele apenas registra um tipo de post próprio para cursos e renderiza a página por templates próprios. Os campos funcionam normalmente desde que a regra de localização mire o curso e o get_field receba o ID certo no template.

**Fonte:** [Advanced Custom Fields — Custom Post Types e Location Rules](https://www.advancedcustomfields.com/resources/custom-post-types/)
