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);
请问哪里出错了?该如何实现共享课时完成状态跨课程同步的需求?
错误原因分析
- 参数顺序完全不匹配:
learndash_lesson_completed钩子的参数顺序是$user_id, $lesson_id, $course_id,但你的函数定义把参数顺序写成了($lesson_id, $user_id, $course_id),导致传入的参数值完全错位,这是触发严重错误的核心原因。 - 语法错误:代码中使用了HTML转义后的
&&,PHP无法识别这个符号,必须替换为原生的逻辑运算符&&。 - 未处理取消完成场景:只监听了完成钩子,用户取消课时完成时不会同步状态,导致状态不一致。
- 冗余代码:
$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
相关产品推荐
相关产品推荐

