Como corrigir o progresso do aluno que não atualiza no Tutor LMS
O que é o progresso do aluno do Tutor LMS que não atualiza?
No Tutor LMS, o progresso do aluno não atualiza quando a barra de porcentagem do curso e o status das aulas permanecem congelados depois que o aluno clica em Marcar como concluída, ou quando concluir uma aula não libera a próxima. Cada aula concluída é gravada como um user meta do tipo _tutor_completed_lesson_id e a porcentagem do curso é recalculada por get_course_completed_percent(); quando essa gravação não chega ao banco, ou quando a página exibida vem do cache, o aluno vê o progresso parado mesmo tendo feito tudo.
Como identificar
- A barra de progresso do curso fica travada em uma porcentagem fixa (por exemplo 40 por cento) mesmo depois que o aluno conclui novas aulas.
- O botão Marcar como concluída (Mark as Complete) é clicado, a página recarrega, mas a aula continua sem o ícone de concluída.
- A próxima aula não é liberada no modo sequencial, e o aluno fica preso na mesma aula sem conseguir avançar.
- O console do navegador mostra falha na chamada AJAX para admin-ajax.php com a ação tutor_mark_lesson_complete (status 403 ou 0).
- O relatório do instrutor e o painel do aluno divergem: um mostra o curso concluído e o outro mostra incompleto.
Como prevenir
- Manter as páginas /courses/, /lesson/ e /quizzes/ permanentemente fora do cache de página em qualquer plugin de cache.
- Não cachear requisições para admin-ajax.php e revisar regras de firewall sempre que instalar um plugin de segurança novo.
- Testar a conclusão de aula com um usuário aluno de teste após cada atualização do Tutor LMS, do tema ou do page builder.
- Evitar o modo sequencial do Content Drip em cursos grandes sem antes validar a ordem das aulas com um aluno real.
Causa
- Plugin de cache de página (WP Rocket, LiteSpeed Cache, W3 Total Cache) servindo a página da aula em HTML estático: o aluno conclui a aula, mas a página recarregada vem do cache e mostra a barra de progresso antiga.
- A ação AJAX tutor_mark_lesson_complete em admin-ajax.php está sendo bloqueada por firewall, mod_security ou plugin de segurança, então a conclusão da aula nunca é gravada no banco de dados.
- O addon Content Drip está no modo Course Content Available Sequentially e uma aula anterior ficou sem ser concluída, então o Tutor LMS não libera nem contabiliza as aulas seguintes.
- A tabela wp_usermeta tem registros _tutor_completed_lesson_id corrompidos ou duplicados após migração ou importação de curso, fazendo a porcentagem calculada por get_course_completed_percent() ficar incorreta.
- Tema ou page builder (Elementor, Astra) sobrescreve o template single-lesson e remove o botão ou o nonce de Marcar como concluída, impedindo o registro do progresso.
Como resolver
- Excluir as páginas de curso, aula e quiz do cache: Essa é a causa mais comum. No plugin de cache, adicione as URLs do Tutor LMS à lista de não cachear, para que o aluno sempre veja o progresso recalculado. No WP Rocket isso fica em Configurações -> WP Rocket -> Avançado -> Nunca armazenar em cache as URLs.
/courses/(.*) /lesson/(.*) /quizzes/(.*) /dashboard/(.*) - Liberar a chamada AJAX de conclusão no firewall ou segurança: Garanta que o endpoint admin-ajax.php e a ação de marcar aula como concluída não estejam sendo bloqueados. No Wordfence ou no All in One Security, adicione a ação à allowlist e limpe qualquer regra que retorne 403 para essa requisição.
Ação AJAX: tutor_mark_lesson_complete Endpoint: /wp-admin/admin-ajax.php Liberar também: tutor_render_quiz_content - Revisar o modo do Content Drip do curso: Se o curso usa o addon Content Drip no modo sequencial, confirme que nenhuma aula anterior ficou pendente. No editor do curso abra Course Settings -> Content Drip e, se a sequência travou alunos, troque temporariamente para o modo de agendamento por data ou desative o drip para destravar a contagem.
Modo travante: Course Content Available Sequentially Alternativa: Schedule Course Contents by Date - Recontar o progresso e limpar o cache de objetos: Depois de corrigir a causa, force o Tutor LMS a recalcular limpando o cache transiente e o cache de objetos. Rode os comandos via WP-CLI no servidor para descartar valores de progresso em cache sem precisar editar registro a registro.
wp cache flush wp transient delete --all wp tutor regenerate_course_progress wp option update tutor_completed_lesson_meta_prefix _tutor_completed_lesson_id_
<?php
// Diagnostico: imprime o progresso REAL gravado no banco para um aluno e curso,
// ignorando qualquer cache de pagina. Rode via snippet (logado como admin).
add_shortcode( 'tutor_progresso_debug', function () {
$user_id = get_current_user_id();
$course_id = isset( $_GET['curso'] ) ? absint( $_GET['curso'] ) : 0;
if ( ! $user_id || ! $course_id || ! function_exists( 'tutor_utils' ) ) {
return 'Informe ?curso=ID e esteja logado.';
}
$percent = tutor_utils()->get_course_completed_percent( $course_id, $user_id );
$lessons = tutor_utils()->get_lesson_count_by_course( $course_id );
$done = tutor_utils()->get_completed_lesson_count_by_course( $course_id, $user_id );
return sprintf(
'Aluno %d no curso %d: %d/%d aulas concluidas = %d%% (valor real no banco).',
$user_id, $course_id, $done, $lessons, $percent
);
} );














