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

WordPress多站点主站获取子站点LearnDash用户课程积分方法

WordPress多站点跨站LearnDash积分同步实现方案

因为你的架构是同数据库的WordPress多站点,全局用户ID通用,不需要做复杂的跨域鉴权、接口调用,直接用钩子触发同步即可,性能和稳定性都最高,具体实现步骤如下:

1 前置信息确认

  • 子站点触发点确认:LearnDash课程完成的官方钩子是learndash_course_completed,钩子触发时会传递用户ID、课程对象两个参数,你不需要修改LearnDash本身的积分记录逻辑,避免子站点自带的积分统计出错。
  • 主站积分存储确认:先找到主站自有积分系统的存储位置:
    • 如果是存在用户元数据中,注意区分主站和子站的表前缀:根主站默认表前缀为wp_,子站点会带序号后缀比如wp_2_,全局用户表wp_users、用户元表wp_usermeta是全多站点共享的,用户ID全网络唯一,这是可以直接同步的核心基础。
    • 如果主站积分存在自定义独立数据表,直接确认表名和积分字段即可,同库环境可以直接读写。

2 核心同步代码实现

把以下代码放到子站点的自定义功能插件中(不要直接改主题functions.php,避免主题更新代码丢失),替换里面的配置项为你站点的实际值:

// 绑定LearnDash课程完成事件
add_action('learndash_course_completed', 'sync_course_points_to_main', 10, 2);
function sync_course_points_to_main(int $user_id, WP_Post $course): void
{
    // 课程完成固定发放100积分,后续如果需要按课程设置不同积分,可从$course的元数据中读取LearnDash配置的积分值
    $add_points = 100;

    // --- 以下配置项替换为你站点的实际值 ---
    $main_site_table_prefix = 'wp_'; // 主站的数据库表前缀
    $main_points_meta_key = 'custom_user_points'; // 主站存储总积分的usermeta键名,如果是自定义表就替换为对应表操作逻辑
    // --- 配置项结束 ---

    // 防重复加积分:判断当前用户该课程是否已经同步过
    $sync_mark_key = "ld_points_synced_course_{$course->ID}";
    if (get_user_meta($user_id, $sync_mark_key, true)) {
        return;
    }

    // 读取主站当前用户的现有积分,无记录则初始为0
    $current_total = (int)get_user_meta($user_id, $main_site_table_prefix . $main_points_meta_key, true);
    // 累加课程积分
    $new_total = $current_total + $add_points;
    // 更新主站总积分
    update_user_meta($user_id, $main_site_table_prefix . $main_points_meta_key, $new_total);

    // 可选:记录积分来源日志,方便主站拆分展示消费积分、课程积分
    add_user_meta($user_id, $main_site_table_prefix . 'points_change_log', [
        'type' => 'course_complete',
        'amount' => $add_points,
        'course_id' => $course->ID,
        'created_at' => current_time('timestamp')
    ]);

    // 打同步标记,避免重复发放
    update_user_meta($user_id, $sync_mark_key, 1);
}

注意:如果你的主站积分系统有自己的积分增减函数,不要直接操作数据表/用户元,直接调用主站的积分函数即可,注意引入对应函数的文件路径,避免报错。

3 边界处理和适配

  • 历史数据补录:代码上线前已经完成课程的老用户数据,写个一次性遍历脚本:查询子站所有已完成课程的用户记录,按上述逻辑批量补加积分,跑完后删除脚本即可,不要留着定时跑浪费性能。
  • 前端展示适配:因为你已经把课程积分直接累加进主站的总积分字段,主站账户页原有的总积分展示不需要改,直接读原有字段就能显示包含消费、课程积分的累计值;如果需要拆分展示两类积分的明细,直接读取上面代码里存的积分日志做分类统计即可,不需要改动原有消费积分的计算逻辑。
  • 异常兜底:可以加个简单的错误日志记录,如果积分更新失败,把用户ID、课程ID、错误信息写到站点日志里,方便后续排查补录。

4 后续架构扩展兼容

如果之后你把子站点拆成独立站点、和主站分库部署,只需要把上述代码里直接更新主站积分的逻辑,替换为调用主站带签名校验的REST接口即可:主站开放一个加积分的接口,校验请求签名合法后再执行积分累加,当前同库架构下不需要用这种方案,多一次HTTP请求反而会增加故障点、影响响应速度。

内容的提问来源于stack exchange,提问作者Shubham Dixit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 00:51:18