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.
Antes de começar: Faça backup completo do banco de dados (tabelas wp_usermeta e wp_comments do Tutor LMS) antes de rodar comandos WP-CLI ou apagar registros de conclusão, porque progresso apagado por engano não é recuperável e o aluno perde o histórico do curso.
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
<?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
);
} );
Perguntas frequentes
Por que o progresso do aluno no Tutor LMS não atualiza mesmo depois de concluir a aula?
Na maioria dos casos a página da aula está sendo servida pelo cache: o aluno conclui, a página recarrega, mas o HTML vem do cache com a barra de progresso antiga. Excluir as URLs de curso, aula e quiz do plugin de cache resolve o problema na origem.
A barra de progresso está travada em uma porcentagem fixa. O que fazer primeiro?
Limpe todo o cache (página, objeto e CDN) e recarregue a aula com o cache do navegador desativado. Se a porcentagem mudar, o cache era a causa e você deve adicionar as páginas de curso à lista de exceções permanente do plugin de cache.
Onde o Tutor LMS guarda o progresso de cada aluno?
Cada aula concluída vira um registro user meta com prefixo _tutor_completed_lesson_id na tabela wp_usermeta, e a conclusão do curso é registrada como um comentário do tipo course_completed. A porcentagem do curso é calculada em tempo real por get_course_completed_percent.
O botão Marcar como concluída não faz nada. Como diagnosticar?
Abra o console do navegador na aba Network e clique no botão. Se a requisição para admin-ajax.php com a ação tutor_mark_lesson_complete retornar 403 ou 0, há um firewall ou plugin de segurança bloqueando a chamada e você precisa liberar essa ação.
O Content Drip pode fazer o progresso parecer travado?
Sim. No modo Course Content Available Sequentially, se uma aula anterior não foi concluída, o Tutor LMS não libera nem contabiliza as próximas. Revise a ordem das aulas ou troque para o agendamento por data para destravar o aluno.
O relatório do instrutor mostra concluído mas o aluno vê incompleto. Por quê?
Esse descompasso quase sempre é cache de objeto ou registros _tutor_completed_lesson_id duplicados após uma migração. Rode wp cache flush e wp transient delete --all para forçar o recálculo e alinhar as duas telas.
Preciso editar o banco de dados para corrigir o progresso?
Na maioria das vezes não. Excluir as páginas do cache, liberar a ação AJAX e limpar os transientes resolve sem tocar no banco. Só edite a tabela wp_usermeta com backup feito quando houver registros de conclusão claramente corrompidos.
Limpar o cache vai apagar o progresso já registrado dos alunos?
Não. O cache guarda apenas a página renderizada e valores temporários, não o histórico de conclusão. Limpar o cache apenas força o Tutor LMS a recalcular e exibir a porcentagem correta a partir dos dados reais.














