WordPress多站点:如何获取网络内各站点的全部用户角色
WordPress多站点获取用户所有站点角色的解决方案
问题原因
get_userdata($userId)->roles只能返回当前站点的用户角色——因为WordPress多站点的用户角色是按站点独立存储的,每个站点的角色数据互不干扰,默认函数只会读取当前上下文站点的角色信息。
解决方案
要获取用户在所有站点的角色,需要遍历多站点中的每个站点,切换到对应站点后获取该用户的角色,最后统一整理结果。
1. 编写获取所有站点角色的函数
function get_user_all_site_roles($user_id) { $all_roles = []; // 仅允许有网络管理权限的用户查看全局角色数据 if (!current_user_can('manage_network')) { return $all_roles; } // 获取所有站点的ID列表 $site_ids = get_sites(['fields' => 'ids']); foreach ($site_ids as $site_id) { // 切换到目标站点上下文 switch_to_blog($site_id); $user = get_userdata($user_id); if ($user && !empty($user->roles)) { $all_roles[] = [ 'site_id' => $site_id, 'site_name' => get_bloginfo('name'), 'roles' => $user->roles ]; } // 恢复到原站点上下文,避免后续操作异常 restore_current_blog(); } return $all_roles; }
2. 整合到wp/v2/users接口
通过rest_prepare_user钩子,将用户所有站点的角色添加到API返回结果中:
add_filter('rest_prepare_user', function($response, $user, $request) { $all_site_roles = get_user_all_site_roles($user->ID); $response->data['all_site_roles'] = $all_site_roles; return $response; }, 10, 3);
3. 接口返回示例
修改后调用wp/v2/users/{id}接口,会新增all_site_roles字段,结构类似:
"all_site_roles": [ { "site_id": 1, "site_name": "主站点", "roles": ["administrator"] }, { "site_id": 2, "site_name": "子站点A", "roles": ["author"] } ]
内容的提问来源于stack exchange,提问作者Yuu
相关产品推荐
相关产品推荐

