Learndash技术求助:完成所有主题后无法自动标记课时及课程完成
Learndash课程自动完成异常:完成所有主题后课时未标记已完成的修复方案
针对你遇到的完成所有主题后课时无法自动标记完成的问题,先分析你提供的两段代码存在的问题,再给出修正方案:
第一段代码的问题与修正
你的第一段代码依赖$_POST获取主题ID,这种方式不可靠,且没有正确利用learndash_topic_completed钩子提供的参数,同时获取课时ID的方式和标记完成的函数调用也存在优化空间。
修正后的代码:
add_action('learndash_topic_completed', 'custom_check_lesson_completion', 10, 2); function custom_check_lesson_completion($user_id, $topic_id) { // 获取当前主题所属的课时ID $lesson_id = learndash_get_parent_post_id($topic_id, 'lesson'); if (empty($lesson_id)) { return; } // 获取该课时下的全部主题列表 $lesson_topics = learndash_get_topic_list($lesson_id); if (empty($lesson_topics)) { return; } // 遍历检查所有主题是否已完成 $all_topics_completed = true; foreach ($lesson_topics as $topic_post) { $single_topic_id = $topic_post->ID; if (!learndash_is_topic_complete($user_id, $single_topic_id)) { $all_topics_completed = false; break; } } // 仅当所有主题完成且课时尚未标记完成时,执行标记操作 if ($all_topics_completed && !learndash_is_lesson_complete($user_id, $lesson_id)) { learndash_mark_lesson_complete($user_id, $lesson_id); } }
修正说明:
- 直接使用
learndash_topic_completed钩子传递的$user_id和$topic_id参数,避免依赖不稳定的POST数据 - 用
learndash_get_parent_post_id替代learndash_get_setting,更可靠地获取主题对应的课时ID - 遍历主题列表时,使用主题的ID进行完成状态验证,确保判断准确
- 增加课时未完成的前置判断,避免重复触发完成操作
- 使用
learndash_mark_lesson_complete直接标记课时完成,比通用的learndash_mark_complete_process更贴合场景
第二段代码的问题与调整
你的第二段代码针对的是课程自动完成,而非课时,所以无法解决当前问题。如果需要修复课程进度接近100%但未标记完成的情况,可以调整代码避免循环触发:
add_action( 'learndash_user_course_progress_updated', 'custom_mark_course_completed', 10, 5 ); function custom_mark_course_completed( $user_id, $course_id, $course_progress, $course_info, $ld_course ) { // 仅当进度在96%-100%之间且课程未完成时执行 if ( $course_progress > 96 && $course_progress < 100 && !learndash_is_course_complete($user_id, $course_id) ) { learndash_update_user_course_progress( $user_id, $course_id, 100 ); learndash_mark_course_completed( $user_id, $course_id ); } }
额外排查建议
- 检查Learndash课时设置:确认该课时的完成条件已设置为「完成所有主题」
- 开启WP_DEBUG:查看错误日志,确认是否存在函数调用报错或权限问题
- 函数版本验证:Learndash的部分旧函数确实会被废弃,优先使用
learndash_mark_lesson_complete、learndash_is_lesson_complete这类针对性的最新函数
内容的提问来源于stack exchange,提问作者Steven Shrewsbury
相关产品推荐
相关产品推荐

