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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 00:54:53