导出WordPress用户角色需查wp_usermeta中wp_capabilities等键值,而非整表;Multisite需匹配各站点前缀;CSV导出须用引号+Tab分隔防错位;wp_user_roles存权限定义但不可直接迁移;capability值为PHP序列化字符串,非JSON。
导出 wp_users 和 wp_usermeta 表时漏掉角色数据
wordpress 的用户角色不存于 wp_users 表,也不在 wp_usermeta 里单独成列——它藏在 wp_usermeta 中键为 wp_capabilities 的记录里。只导出整张 wp_usermeta 表看似全量,但实际含大量无关元数据(如编辑器偏好、上次登录时间),体积大且难筛选。
实操建议:
- 在 phpMyAdmin 中切换到对应数据库 → 点击 SQL 标签页,执行:
SELECT u.*, um.meta_value AS capabilities FROM wp_users u LEFT JOIN wp_usermeta um ON u.ID = um.user_id AND um.meta_key = 'wp_capabilities'
- 点击“导出”,格式选
SQL或CSV(若后续要人工核对,CSV 更直观) - 勾选“另存为文件”,避免浏览器截断大数据量结果
多站点(Multisite)下 wp_capabilities 前缀不固定
启用 Multisite 后,wp_capabilities 的前缀取决于子站 ID,比如站点 2 可能是 wp_2_capabilities,而主站仍是 wp_capabilities。直接按字面匹配会漏掉其他站点的用户角色。
实操建议:
- 先查当前所有站点的前缀:
SELECT blog_id, domain, path FROM wp_blogs
- 对每个
blog_id,构造对应 meta_key 查询,例如:... AND um.meta_key IN ('wp_capabilities', 'wp_2_capabilities', 'wp_3_capabilities') - 如果站点数多,用脚本拼接 SQL 比手动改更可靠;phpMyAdmin 不支持动态表名或变量,别指望用
LIKE 'wp\_%_capabilities'——反斜杠会被忽略,实际查不到
导出 CSV 时中文用户名乱码或字段错位
phpMyAdmin 默认导出 CSV 使用逗号分隔、无引号包裹,一旦用户名含逗号、换行或中文,Excel 打开后会错列甚至乱码。这不是编码问题,是分隔符冲突。
立即学习“PHP免费学习笔记(深入)”;
实操建议:
- 导出前在 phpMyAdmin 的“导出”页,“格式特定选项”中勾选:用引号包裹每个字段、使用 UTF-8 编码
- 分隔符不要用默认逗号,改用制表符(
\t):在“字段分隔符”框里粘贴一个 Tab(Mac 上 Ctrl+Q + Tab,Windows 上可复制一个空格再替换为 Tab) - 或者干脆导出为
JSON格式——phpMyAdmin 支持,结构清晰,无解析歧义
用 SELECT 导出无法包含 wp_roles 表权限定义
wp_users + wp_usermeta 只有“谁是什么角色”,没有“这个角色能干什么”。真正的角色能力定义存在全局 wp_options 表中,key 是 wp_user_roles(Multisite 下可能是 wp_sitemeta 的 site_roles)。
实操建议:
- 单独导出角色定义:
SELECT option_value FROM wp_options WHERE option_name = 'wp_user_roles'
,结果是一段序列化 PHP 数组,需保留原样 - 注意:该值不可直接导入到其他环境——不同站点的 capability key(如
manage_options)可能被插件增删,硬覆盖有风险 - 如果目标是迁移用户而非复现权限体系,通常只需导出用户+角色映射,
wp_user_roles仅作参考备份
unserialize(),直接 json_decode() 会失败——这点在写导入脚本时才暴露,但导出时就得心里有数。



















