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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 15:54:59