LearnDash中作业审核通过后自动完成对应主题的实现方法
LearnDash作业审核通过自动标记关联主题完成实现方案
该需求可通过LearnDash原生钩子+官方进度接口实现,无需改造平台核心代码、无需安装额外插件,且能精准控制生效范围,不会影响非作业类主题的原有进度规则,具体实现如下:
- 核心触发逻辑选择
直接挂载learndash_assignment_approved动作钩子,该钩子仅在讲师手动审核通过学生作业时触发,会返回作业ID、作业对象、提交用户ID三个核心参数,不存在其他场景误触发的问题。 - 生效范围校验(核心,避免规则越界)
触发逻辑执行前先做两层判断,确保规则只在要求的场景生效:- 提取作业关联的学习步骤ID,校验该步骤的文章类型是否为LearnDash主题(
sfwd-topic),排除课程、课时等其他类型的学习步骤 - 校验该主题是否开启了作业上传配置,排除没有绑定作业要求的普通主题
- 提取作业关联的学习步骤ID,校验该步骤的文章类型是否为LearnDash主题(
- 进度标记逻辑
不直接操作数据库进度表,调用LearnDash官方提供的learndash_process_mark_complete()方法标记完成,自动同步用户学习进度、完成时间、进度百分比等统计数据,和平台原生进度逻辑完全兼容,不会出现数据不一致的问题。
可直接部署的代码片段
将以下代码添加到当前子主题的functions.php文件,或者自定义功能插件中即可生效:
add_action( 'learndash_assignment_approved', 'ld_auto_complete_topic_when_assignment_passed', 10, 3 ); function ld_auto_complete_topic_when_assignment_passed( $assignment_id, $assignment_post, $user_id ) { // 获取作业关联的学习步骤ID $related_step_id = get_post_meta( $assignment_id, 'lesson_id', true ); if ( ! $related_step_id ) { return; } // 第一层校验:关联步骤必须是主题类型 if ( get_post_type( $related_step_id ) !== 'sfwd-topic' ) { return; } // 第二层校验:该主题必须开启了作业上传要求 $topic_assignment_enabled = learndash_get_setting( $related_step_id, 'assignment_upload' ); if ( $topic_assignment_enabled !== 'on' ) { return; } // 若主题已经完成,直接终止逻辑避免重复执行 if ( ! learndash_is_topic_not_complete( $user_id, $related_step_id ) ) { return; } // 调用官方方法标记主题完成 learndash_process_mark_complete( $user_id, $related_step_id ); }
上线前建议做3个场景的验证:
- 学生提交绑定作业的主题对应作业,讲师审核通过后,确认该主题自动标记为完成
- 学生学习未配置作业的普通主题,确认不会被自动标记完成,进度规则和之前一致
- 学生提交课程、课时层级的作业,审核通过后确认不会触发主题自动完成逻辑
内容的提问来源于stack exchange,提问作者Avinish Kr. Singh Rajawat
相关产品推荐
相关产品推荐

