LearnPress 4.2.8:如何通过PHP用用户ID和课时ID标记课时完成
解决LearnPress 4.2.8中通过PHP标记课时为完成的问题
1. 先解决课时关联课程ID的获取问题
你遇到的_lp_course元数据不存在的情况,是因为LearnPress 4.x已改用专用数据表存储课程与课时的关联,不再依赖post meta。推荐两种可靠的获取方式:
方式一:使用LearnPress官方类方法(优先)
直接调用LP_Lesson的内置方法获取课程ID,这是最符合插件规范的写法:
$lesson = learn_press_get_lesson($lesson_id); $course_id = $lesson ? $lesson->get_course_id() : 0;
方式二:直接查询关联数据表
如果类方法调用异常,可直接操作wp_lp_course_items表(注意替换前缀wp_为你的实际数据库前缀):
global $wpdb; $course_id = $wpdb->get_var( $wpdb->prepare( "SELECT course_id FROM {$wpdb->prefix}lp_course_items WHERE item_id = %d AND item_type = 'lesson'", $lesson_id ) );
2. 标记课时为完成的核心代码
拿到有效user_id、course_id、lesson_id后,使用LearnPress的用户进度API更新状态,不要直接修改数据库,避免破坏插件的进度逻辑:
// 基础参数校验 if (empty($user_id) || empty($course_id) || empty($lesson_id)) { wp_send_json_error('参数不全'); } // 获取用户的课程进度实例 $user_course = learn_press_get_user_course($user_id, $course_id); if (!$user_course) { wp_send_json_error('用户未参与该课程'); } // 获取用户的课时进度实例 $user_lesson = $user_course->get_item($lesson_id); if ($user_lesson) { // 标记课时为完成状态 $user_lesson->update_status('completed'); // 触发课时完成的钩子,同步课程整体进度 do_action('learn-press/lesson-completed', $lesson_id, $user_id, $course_id); wp_send_json_success('课时已标记完成'); } else { wp_send_json_error('无法获取该用户的课时进度'); }
3. 必要的权限校验
在AJAX回调函数开头添加权限检查,防止非法请求:
// 检查用户是否登录 if (!is_user_logged_in()) { wp_send_json_error('请先登录'); } // 检查用户是否有权限访问该课时 if (!learn_press_user_can_access_lesson($lesson_id, get_current_user_id())) { wp_send_json_error('无权限操作该课时'); }
内容的提问来源于stack exchange,提问作者Often Right
相关产品推荐
相关产品推荐

