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

LearnDash共享课程课时完成状态同步失败排查与解决

问题描述

我已配置LearnDash插件的共享课程课时功能,可在多门课程中复用同一课时。但用户在某门课程中标记课时完成或未完成时,状态无法同步至其他包含该课时的课程(默认设置)。我希望共享课时的完成状态变更能同步到所有包含它的课程,编写了如下代码但运行后触发严重错误:

function sync_lesson_completion($lesson_id, $user_id, $course_id) {
    // Get the course that contains the lesson
    $course = get_post($course_id);
    
    // Check if the course has shared steps enabled
    $shared_steps_enabled = get_post_meta($course_id, '_sfwd-courses_sharedsteps_enabled', true);
    
    // Check if shared steps are enabled and the lesson is shared
    if ($shared_steps_enabled && !empty($lesson_id)) {
        // Get all the courses where the lesson is shared
        $shared_courses = learndash_get_courses_by_step($lesson_id, 'sfwd-lessons');
        
        // Loop through the shared courses
        foreach ($shared_courses as $shared_course_id) {
            // Skip the current course
            if ($shared_course_id == $course_id) {
                continue;
            }
            
            // Mark the lesson as completed for the user in the shared course
            learndash_update_user_activity($user_id, $lesson_id, 'sfwd-lessons', $shared_course_id, true);
        }
    }
}

// Hook into the lesson completion action
add_action('learndash_lesson_completed', 'sync_lesson_completion', 10, 3);

请问哪里出错了?该如何实现共享课时完成状态跨课程同步的需求?

错误原因分析
  1. 参数顺序完全不匹配:learndash_lesson_completed钩子的参数顺序是$user_id, $lesson_id, $course_id,但你的函数定义把参数顺序写成了($lesson_id, $user_id, $course_id),导致传入的参数值完全错位,这是触发严重错误的核心原因。
  2. 语法错误:代码中使用了HTML转义后的&&,PHP无法识别这个符号,必须替换为原生的逻辑运算符&&。
  3. 未处理取消完成场景:只监听了完成钩子,用户取消课时完成时不会同步状态,导致状态不一致。
  4. 冗余代码:$course = get_post($course_id);未被使用,属于无效代码。
修正后的实现代码
function sync_shared_lesson_completion_status($user_id, $lesson_id, $course_id) {
    // 检查当前课程是否启用共享课时
    $shared_steps_enabled = get_post_meta($course_id, '_sfwd-courses_sharedsteps_enabled', true);
    
    // 空值校验,提前退出
    if (empty($shared_steps_enabled) || empty($lesson_id) || empty($user_id)) {
        return;
    }

    // 获取所有包含该共享课时的课程
    $shared_courses = learndash_get_courses_by_step($lesson_id, 'sfwd-lessons');
    
    if (empty($shared_courses)) {
        return;
    }

    // 获取当前课时的实际完成状态
    $is_completed = learndash_is_lesson_complete($user_id, $lesson_id, $course_id);

    // 遍历同步所有共享课程的状态
    foreach ($shared_courses as $shared_course_id) {
        if ($shared_course_id == $course_id) {
            continue;
        }

        // 根据实际状态完成同步:完成则标记,未完成则删除记录
        if ($is_completed) {
            learndash_update_user_activity($user_id, $lesson_id, 'sfwd-lessons', $shared_course_id, true);
        } else {
            learndash_delete_user_activity($user_id, $lesson_id, 'sfwd-lessons', $shared_course_id);
        }
    }
}

// 同时监听完成和取消完成的钩子
add_action('learndash_lesson_completed', 'sync_shared_lesson_completion_status', 10, 3);
add_action('learndash_lesson_undone', 'sync_shared_lesson_completion_status', 10, 3);
关键改进说明
  • 修正参数顺序:严格匹配LearnDash钩子的参数传递顺序,避免参数错位导致的错误。
  • 覆盖全场景:新增监听learndash_lesson_undone钩子,处理用户取消课时完成的同步需求。
  • 动态获取状态:通过learndash_is_lesson_complete获取当前课时的真实状态,确保同步的是用户操作后的正确状态,而非强制标记完成。
  • 修复语法错误:替换&&为PHP原生&&,解决语法解析问题。
  • 增加安全校验:在关键节点增加空值检查,避免无效数据引发的异常。

内容的提问来源于stack exchange,提问作者ANIRUDDH BHAT

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 23:42:15