You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 );
    }
}

额外排查建议

  1. 检查Learndash课时设置:确认该课时的完成条件已设置为「完成所有主题」
  2. 开启WP_DEBUG:查看错误日志,确认是否存在函数调用报错或权限问题
  3. 函数版本验证:Learndash的部分旧函数确实会被废弃,优先使用learndash_mark_lesson_complete、learndash_is_lesson_complete这类针对性的最新函数

内容的提问来源于stack exchange,提问作者Steven Shrewsbury

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 13:05:35