搜索全站
安装部署 9 分钟阅读

WordPress 搭建在线课程站(LMS):LearnDash 与 Tutor LMS 选型与配置

用 WordPress 做在线课程站,最贵的成本不是插件授权而是后期返工。本文对比 LearnDash 与 Tutor LMS 的数据模型、支付与缓存处理,给出可直接照做的配置顺序。

U
UFO_PF 2019-12-08 · 阅读 9 分钟
Wo 安装部署
阅读提示
本文约 3,348 字,预计阅读 9 分钟。文中命令与配置均经过实测,可直接参考执行。

引言:课程的坑,大多发生在卖出去之后

很多人一开始只想”把视频挂上去收钱”,装个插件、拖几个课时就上线。真正出问题是在第 200 个学员之后:有人反映进度条不动,有人付了款却看不到课程,有人用手机看课时视频一直转圈。这时候你才发现,课程站不是”插件装上就能卖”的事——它同时是一套用户系统、一套订单系统、一套媒体分发系统,三者的边界一旦没划清,返工就是推倒重来。选型阶段多做两个小时的判断,能省掉后面两周的迁移。

原理分析:两个插件的数据模型决定迁移难度

LearnDash 和 Tutor LMS 表面功能接近,底层结构差别很大。LearnDash 用 sfwd-courses、sfwd-lessons、sfwd-topic、sfwd-quiz 四套自定义文章类型(CPT)表达”课程—课时—主题—测验”的层级,进度数据写在独立的 activity 表里;Tutor LMS 用 courses、lesson、tutor_quiz,进度更依赖用户 meta 与自建表,免费版本身就带问答、课程预览、前端课程构建器。

维度 LearnDash Tutor LMS
授权 商业授权,按站点数收费 免费版功能完整,Pro 版付费
课程层级 课程 / 课时 / 主题 / 测验 课程 / 课时 / 测验(含章节分组)
支付 需搭配 WooCommerce 或会员插件 内置 EDD、WooCommerce 等多种模式
前端构建器 依赖古腾堡块,需主题配合 自带前端课程构建器
二次开发 钩子文档完整,适合定制 API 清晰,适合快速上线

判断标准很简单:如果你要卖高价课、需要复杂的购买规则(捆绑、订阅、分期、团报),选 LearnDash 配 WooCommerce;如果你要最快上线、预算有限、主要卖单课,Tutor LMS 免费版加 Pro 更划算。

保姆级实操

步骤 1:先把售卖模型定死。 单课买断、会员订阅、还是打包套餐?这一步决定了后面的支付与权限方案,不要边做边改。买断用 WooCommerce 的 Simple Product,订阅用 WooCommerce Subscriptions,套餐用 Product Bundle。

步骤 2:安装后先处理固定链接。 进入”设置 → 固定链接”,选择”文章名”并保存两次。CPT 的重写规则在插件激活时注册,链接结构没刷新会导致课程详情页 404。

# 用 WP-CLI 确认课程相关的文章类型已正确注册
wp post-type list --fields=name,label,public,rewrite --format=table
wp rewrite flush --hard

步骤 3:按”一个课时一个知识点”切课时。 单课时视频控制在 8–15 分钟,每课时配一份可下载资料与一道自测题。层级不要超过三层,层级越深,学员的完成率越低。

步骤 4:配置支付与自动开通。 以 LearnDash 为例,课程在”Settings”里关联 WooCommerce 商品,订单状态变为 completed 时自动授予访问权限。务必用支付网关的异步通知(Webhook)而不是浏览器跳转回传,否则学员关掉页面就会掉单。

步骤 5:把课程页从缓存里摘出来。 这是课程站最容易踩的一处:页面缓存插件会把”我的课程”页缓存成某个学员的视图,导致所有人看到同一个进度。需要在缓存插件里排除 /my-courses/、/cart/、/checkout/、/my-account/,并对登录用户整体关闭页面缓存。

# Nginx:对登录 Cookie 与课程相关路径直接回源,不做页面缓存
map $http_cookie $skip_cache {
    default  0;
    "~*wordpress_logged_in" 1;
}

server {
    location ~ ^/(my-courses|cart|checkout|my-account)/ {
        set $skip_cache 1;
        try_files $uri $uri/ /index.php?$args;
    }
}

步骤 6:接好进度相关的钩子做自动化。 下面这段用 LearnDash 的 learndash_lesson_completed 钩子,在学员完成度超过 80% 时打一个标记,后续可以用它触发催学邮件或发结课优惠券。

add_action( 'learndash_lesson_completed', 'mimangfei_mark_near_completion', 10, 1 );
function mimangfei_mark_near_completion( $data ) {
    if ( empty( $data['user']->ID ) || empty( $data['course']->ID ) ) {
        return;
    }
    $user_id   = $data['user']->ID;
    $course_id = $data['course']->ID;

    $progress = learndash_course_progress(
        array(
            'user_id'   => $user_id,
            'course_id' => $course_id,
            'array'     => true,
        )
    );

    if ( ! empty( $progress['percentage'] ) && (int) $progress['percentage'] >= 80 ) {
        update_user_meta( $user_id, '_course_near_completion', $course_id );
    }
}

步骤 7:把视频搬出站点。 大文件不要放在 wp-content/uploads 下,接对象存储或专业视频托管,否则备份时间和带宽成本会随学员数线性上涨。

常见踩坑

  1. 换了主题后课程页面布局全乱。 LearnDash 的聚焦模式依赖主题模板,换主题前先在测试站点用同一门课验证。
  2. 进度条不更新。 多数是页面缓存或对象缓存把动态数据缓存住了,排查顺序:先全站禁用缓存 → 刷新重写规则 → 检查数据库 activity 表是否写入。
  3. 案例: 有站长把课程页放进了 CDN 全站缓存规则,学员 A 学完第 3 课后,学员 B 打开同一 URL 直接显示”已完成”,投诉集中爆发。根因是 CDN 忽略了 wordpress_logged_in Cookie,加上按路径排除后才恢复。
  4. 支付成功但课程没开通。 检查 WooCommerce 订单状态是否是 completed,以及 Webhook 是否被安全插件拦截。
  5. 通知邮件进垃圾箱。 课程开通邮件属于交易邮件,必须走 SMTP,不要依赖服务器自带的 mail()。
  6. 手机端视频卡。 单文件超过 200MB 且没做分片,改成 HLS 或托管平台。
  7. PHP 版本升级后白屏。 老版本插件与 PHP 8.x 存在兼容问题,升级前在预发站点跑一遍。

总结

课程站的选型本质上是”售卖复杂度”与”上线速度”的取舍:规则复杂选 LearnDash 配 WooCommerce,追求速度选 Tutor LMS。上线前必做三件事——刷新重写规则、排除动态页缓存、把视频迁出主机。这三件事做完,你就避开了课程站 80% 的线上事故。课程结构怎么切更合理,可以参考课程章节与课时结构设计;支付环节的细节见WooCommerce 支付网关配置;缓存排除的完整清单见WordPress 缓存排除规则。

U
UFO_PF作者

专注 WordPress 生态的实战作者,内容以「可复制、可验证」为第一原则。

留下你的想法

邮箱地址不会被公开。带 * 的为必填项。