需重构WordPress与CI4权限体系:先诊断清理WP异常权限数据,再设计双向映射规则,接着代码固化WP角色结构并导出为CI4种子数据,最后通过REST API桥接层实现权限互通。

WordPress 用户权限表混乱,同时又想对接 CodeIgniter 4(CI4)的角色体系,这不是简单“同步”就能解决的问题——两者底层逻辑完全不同:WP 基于角色(Role)+ 权限(Capability)的序列化存储,CI4 则依赖数据库关系表(如 users、roles、permissions、role_permissions)进行细粒度控制。直接映射会出错,必须重构。以下是务实可行的重构步骤,聚焦数据清理、结构对齐与权限桥接。
一、诊断 WP 权限表现状并清理异常数据
先别急着写代码,得看清当前 WP 的权限到底乱在哪:
- 检查
wp_options表中wp_user_roles选项值是否损坏(如 unserialize 失败、JSON 格式错乱、重复角色键); - 查
wp_usermeta中所有wp_capabilities字段,用 SQL 扫描是否存在非标准角色名(如"editor_v2"、"custom_role_abc")、空值或非法序列化字符串; - 运行
SELECT user_id, meta_value FROM wp_usermeta WHERE meta_key = 'wp_capabilities' AND (meta_value = '' OR meta_value LIKE '%b:0;%'),找出权限为空或被清空的用户; - 导出当前全部角色定义(用
wp roles list --format=json或 PHP 脚本调用wp_roles()),比对是否与实际数据库存储一致。
二、设计 CI4 兼容的权限模型映射规则
WP 没有“权限开关”概念,只有“角色含哪些能力”;CI4 需要显式启用/禁用单个权限。因此需建立双向映射表:
- 将 WP 内置 6 个默认角色(subscriber、contributor、author、editor、administrator)作为基础锚点;
- 为每个 WP 角色拆解其原始 capability 列表(如
edit_posts、publish_pages),映射为 CI4 的原子权限标识(如post.edit、page.publish); - 自定义 WP 角色(如通过 User Role Editor 插件创建)需人工审核,只保留业务必需的能力,剔除冗余或冲突项(例如同时含
manage_options和read_private_pages的组合); - CI4 中新增权限(如
analytics.view、backup.trigger)不反向写入 WP,仅用于 CI4 后台逻辑判断——WP 侧保持只读角色绑定。
三、重建 WP 角色结构并固化权限边界
避免插件随意改写 wp_user_roles,用代码方式重置并锁定:
- 在主题
functions.php或专用插件中,用WP_Role类重新定义各角色能力,例如:remove_role('editor'); add_role('editor', '编辑员', [ 'read' => true, 'edit_posts' => true, 'delete_published_posts' => false ]); - 禁用所有能修改角色的 UI 入口:移除后台「设置 → 用户角色」页面(若使用插件)、过滤
user_has_cap钩子拦截非管理员的 role_edit 动作; - 为每个角色生成唯一哈希标识(如
wp_role_hash_editor_v1),存入wp_options,后续校验时比对哈希值,防止意外覆盖; - 将清理后的角色定义导出为 JSON 文件,作为 CI4 初始化脚本的源数据(例如
ci4/seed/roles_from_wp.json)。
四、构建轻量级桥接层实现权限互通
不建议让 CI4 直接读 WP 数据库权限表,而是通过统一接口代理:
- 在 WP 侧提供 REST API 端点(如
/wp-json/wpci4/v1/user-capabilities?id=123),返回该用户当前有效 capability 数组; - 在 CI4 中封装
WpPermissionBridge类,缓存 WP 返回结果(Redis 或文件),并按 CI4 权限格式转换(['post.edit', 'media.upload']); - CI4 控制器中用
$this->auth->can('post.edit')时,自动触发桥接层查询,而非查本地role_permissions表; - 登录态同步采用 JWT 或共享 session 存储(如 Redis),确保 WP 登录后 CI4 能识别同一用户 ID 及其角色上下文。

















