复制多站点上的用户角色,以便用户可以访问具有相同角色的子站点

时间:2016-10-21 作者:Morgan

我有一个多站点网络,大约有250个站点。我希望能够将具有指定角色的用户从网络主站点复制到子网站。以下是我尝试这样做的方式:

functions.php

add_action(\'wp\',\'add_current_user_to_site\',10);

function add_current_user_to_site() {

    if(!is_user_logged_in()) {
        return false;
    }

    $current_user = wp_get_current_user();
    $blog_id = get_current_blog_id();
    $user_id = ($current_user->ID);

    switch_to_blog(1);
    $get_role = ($current_user->caps);
    $add_role = key($get_role);
    restore_current_blog();

    if (!is_user_member_of_blog( $user_id, $blog_id ) ) {
        add_user_to_blog( $blog_id, $user_id, $add_role );
    }

}
这已经过测试,在用户访问子网站然后继续登录时有效。如果他们试图直接登录,则会收到一个错误。

这是设置复制用户并将其添加到子网站的最佳方法吗?有没有一种方法可以让它在直接访问登录时发生,而不需要先访问站点?

2 个回复
最合适的回答,由SO网友:Morgan 整理而成

使用提供的另一个答案,似乎有两种方法可以将用户及其分配的角色从主站点复制到WordPress多站点网络中的子站点。

它可以设置为添加当前用户或站点中的所有用户(我选择了主网络站点,blog_id=1) 当他们访问页面时访问子网站。

下面是如何做到这两个,选择一个并添加到functions.php:

Add only the user to each subsite

function add_current_user_to_site() {
    if(!is_user_logged_in()) {
        return false;
    }

    $current_user = wp_get_current_user();
    $blog_id = get_current_blog_id();
    $user_id = ($current_user->ID);

    switch_to_blog(1);
    $get_role = ($current_user->caps);
    $add_role = key($get_role);
    restore_current_blog();

    if (!is_user_member_of_blog( $user_id, $blog_id ) ) {
        add_user_to_blog( $blog_id, $user_id, $add_role );
    }
}
add_action(\'wp\',\'add_current_user_to_site\');
<小时>

Add all users to each subsite

function add_all_users_to_site() {
    if(!is_user_logged_in()) {
        return false;
    }

    $users = get_users(\'blog_id=1\');
    $sites = get_sites();

    foreach ($sites as $site) {
        foreach ($users as $user) {
            $blog_id = get_current_blog_id();
            $user_id = ($user->ID);

            switch_to_blog($site->id);
            $get_role = ($user->caps);
            $add_role = key($get_role);
            restore_current_blog();

            if (!is_user_member_of_blog( $user_id, $blog_id ) ) {
                add_user_to_blog( $blog_id, $user_id, $add_role );
            }
        }
    }
}
add_action(\'wp\',\'add_all_users_to_site\');

SO网友:CodeMascot

您可以使用以下功能将所有用户复制到所有子网站。它实际上首先获取所有用户ID和子网站ID,然后在每个网站和用户上循环,将所有用户分配到每个子网站。以下是更新的代码-

add_action(\'wp\',\'the_dramatist_add_current_user_to_site\');
function the_dramatist_add_current_user_to_site() {
    global $wpdb;
    $all_users = $wpdb->get_col( \'SELECT ID FROM $wpdb->users\' );
    $subsites = get_sites();
    foreach( $subsites as $subsite ) {
        $subsite_id = get_object_vars($subsite)[\'blog_id\'];
        foreach ( $all_users as $current_user) {
            $blog_id = get_current_blog_id();
            $user_id = ($current_user->ID);

            switch_to_blog($subsite_id);
            $get_role = ($current_user->caps);
            $add_role = key($get_role);
            restore_current_blog();

            if (!is_user_member_of_blog( $user_id, $blog_id ) ) {
                add_user_to_blog( $blog_id, $user_id, $add_role );
            }
        }
    }
}
希望这有帮助。

相关推荐

如何使用GET_USERS()过滤USER_STATUS字段上的用户列表

我只想使用get\\u users()获取用户列表,但在字段user\\u status=0上进行筛选,以便从列表中删除垃圾邮件和未激活的用户。这不起作用:get_users( \'user_status=0&orderby=ID&order=desc&number=\' . $limit ); 这也行不通:$new_users = get_users( [ \'orderby\' => \'ID\', \'order\'