多站点-具有特定角色的最大用户数

时间:2019-06-03 作者:Akram

是否有任何插件或脚本可用于定义多站点网络中子站点上具有特定角色的最大用户数?

我提供云服务台wordpress,定价基于代理数量,因此我想确保站点管理员不能添加比预定义的代理更多的代理。

提前多谢了

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

好的,我是这样做的:

add_action( \'editable_roles\' , \'hide_editable_roles\' );
function hide_editable_roles( $roles ){
$blog_id = get_current_blog_id(); // Get current subsite id
switch($blog_id) { // Define different max agents numbers depending on subsite id
    case 6: 
    $max_agents = 10; //for subsite id#6 we can have maximum 10 agents
     break;  
    case 7: //for subsite id#7 we can have maximum 3 agents
    $max_agents = 3;
    break;  
    default:
    $max_agents = 3000; //default is 3000 agents
    break;
}
  $agents = get_users( array( \'role\' => \'agent\' ) ); // here you define the role
  $agents = count( $agents );
    if ($max_agents <= $agents){
        unset( $roles[\'agent\'] ); // here you define the role
    }
    return $roles;
}

SO网友:phatskat

Update: 基于对WordPress角色和功能的错误挖掘,我以前的代码有一个问题。下面的代码现在应该可以更好地工作了。

你可以试试map_meta_cap 过滤器,类似这样的功能可能会起作用:

add_filter( \'map_meta_cap\', \'has_max_agents\', 10, 2 );

function has_max_agents( $caps, $cap ) {
    static $max_agents = 30; // Example max number of agents.
    if ( \'create_users\' !== $cap ) {
        return $caps;
    }

    $users = get_users( [
        \'role__in\' => [ \'agent\' ], // Your custom role in place of \'agent\'
    ] );

    if ( true || $max_agents <= count( $users ) ) {
        foreach ( $caps as $index => $maybe_remove_cap ) {
            if ( \'create_users\' !== $maybe_remove_cap ) {
                continue;
            }

            unset( $caps[ $index ] );
        }
    }

    $caps[] = \'do_not_allow\';

    return $caps;
}

SO网友:Antti Koskinen

可能使用insert_user_meta (内部wp_insert_user(), 也称为wp_update_user()) 也可能是阻止注册额外代理的可行方法。set_user_role 可能还需要采取措施防止现有用户获得代理角色。

// Maybe prevent setting new users to agent role
function new_user_check_roles( $meta, $user, $update ) {

  $max_agents = 30;
  $agents = get_users( array( \'role\' => \'agent\' ) );
  $agents = count( $agents );

  if ( $max_agents != $agents ) {
    return $meta;
  }

  if ( in_array( \'agent\', $user->roles ) ) {
    $user->set_role( \'subscriber\' );
  }

  if ( isset( $meta[\'role\'] ) && \'agent\' == $meta[\'role\'] ) {
    $meta[\'role\'] = \'subscriber\';
  }  

  return $meta;
}
add_filter( \'insert_user_meta\', \'new_user_check_roles\', 10, 3 );

// Maybe prevent setting existing user to agent role
function set_roles_check_role( $user_id, $role, $old_roles ) {

  $max_agents = 30;
  $agents = get_users( array( \'role\' => \'agent\' ) );
  $agents = count( $agents );

  if ( $max_agents != $agents ) {
    return;
  }

  if ( \'agent\' !== $role ) {
    return;
  }

  $user = new WP_User( user_id );
  $user->set_role( \'subscriber\' );
}
add_action( \'set_user_role\', \'set_roles_check_role\', 10, 3 );

相关推荐

Multisite installation steps?

我启动了Multisite 特色我想在子域中创建一个站点。我有两个问题:在多站点管理仪表板中创建站点之前,还是之后,我必须在服务器上创建子域</如果是,在multisite admindashboard中创建站点之前,还是之后,我必须在此子域中安装WordPress安装我在StackExchange上找到了这个,但它对我没有帮助,或者我就是不明白。Subdomain multisite gives 404 on sub sites谢谢弗朗索瓦