本文约 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 下,接对象存储或专业视频托管,否则备份时间和带宽成本会随学员数线性上涨。
常见踩坑
- 换了主题后课程页面布局全乱。 LearnDash 的聚焦模式依赖主题模板,换主题前先在测试站点用同一门课验证。
- 进度条不更新。 多数是页面缓存或对象缓存把动态数据缓存住了,排查顺序:先全站禁用缓存 → 刷新重写规则 → 检查数据库 activity 表是否写入。
- 案例: 有站长把课程页放进了 CDN 全站缓存规则,学员 A 学完第 3 课后,学员 B 打开同一 URL 直接显示”已完成”,投诉集中爆发。根因是 CDN 忽略了
wordpress_logged_inCookie,加上按路径排除后才恢复。 - 支付成功但课程没开通。 检查 WooCommerce 订单状态是否是 completed,以及 Webhook 是否被安全插件拦截。
- 通知邮件进垃圾箱。 课程开通邮件属于交易邮件,必须走 SMTP,不要依赖服务器自带的
mail()。 - 手机端视频卡。 单文件超过 200MB 且没做分片,改成 HLS 或托管平台。
- PHP 版本升级后白屏。 老版本插件与 PHP 8.x 存在兼容问题,升级前在预发站点跑一遍。
总结
课程站的选型本质上是”售卖复杂度”与”上线速度”的取舍:规则复杂选 LearnDash 配 WooCommerce,追求速度选 Tutor LMS。上线前必做三件事——刷新重写规则、排除动态页缓存、把视频迁出主机。这三件事做完,你就避开了课程站 80% 的线上事故。课程结构怎么切更合理,可以参考课程章节与课时结构设计;支付环节的细节见WooCommerce 支付网关配置;缓存排除的完整清单见WordPress 缓存排除规则。
