仅通过用户名或电子邮件检查用户是否是管理员


Check if user is an admin by username or email only

我正在从头开始创建一个管理部分。此用户应该是来自具有管理员权限的wordpress站点的用户。所以我目前正在使用

if( (!user_pass_ok($user, $pass)){
    //login fail
}else{
    //successful login
}

但我也想知道用户是否是管理员。我在网上看到的是他们使用current_user_can( 'administrator' )。但就我而言,用户尚未登录。我只需要检查用户是否是管理员,就是用户输入的登录用户名/电子邮件地址。如何仅通过用户名/电子邮件检查此用户是否为管理员?

$user = get_userdata( $user_id );    
if ( in_array( 'administrator', (array) $user->roles ) ) {  
    //User has administrator privilidges 
}

正如我在评论中指出的那样user_pass_ok( $user, $pass )已被弃用,有利于wp_authenticate。

此外,WordPress有一个惊人的功能API,远远超出了角色。 我强烈建议您阅读它。

举个简短的例子,如果我想授予用户管理 WordPress 选项的访问权限(从管理员角色继承的称为 manage_options 的功能),我所要做的就是说current_user_can('manage_options')或使用WP_User->has_cap(...)函数。

基于功能的匹配通常比角色匹配更灵活...例如,假设我的网站有第二个角色,称为"开发人员"。如果基于角色限制访问权限,并且希望向具有开发人员角色的用户授予对功能的访问权限,则每当需要验证用户权限时,都需要添加第二次检查:($role == 'administrator' || $role == 'developer')

因此,如果您已经登录了用户,则始终可以通过以下方式验证其功能:

current_user_can( 'manage_options' ) // all admins have 'manage_options'

或者定义您自己的自定义上限,将其提供给所有管理员:

function add_custom_admin_caps() {
    $role = get_role( 'administrator' );
    $role->add_cap( 'access_my_admin_zone' );
}
add_action( 'admin_init', 'add_custom_admin_caps');

并针对当前用户检查自定义上限

current_user_can( 'access_my_admin_zone' )

功能的额外好处是,如果您使用add_*_page功能之一(add_menu_page())和"manage_options"等功能注册管理部分,WordPress将在呈现WP管理菜单时自动检查当前用户的权限

add_menu_page ( $title, $menu_title, $capability, $menu_slug, $function, $icon_url, $position)
最后,有点

不清楚您是否自己登录用户,如果是这样,如果您从头开始登录用户(即不使用WordPress的登录表单),我会提出这种替代方案:

$user = wp_authenticate( $user, $pass );
if ( is_a( $user, 'WP_User' ) && $user->has_cap( 'manage_options' ) ) {
   // success
} else {
   // fail
}

您还需要在自定义管理员的每个页面加载期间调用current_user_can( 'manage_options' )以验证用户是否已登录并具有权限,如果失败,则将他们定向到您的自定义登录页面...或者可能,带有 auth_redirect() 的 WordPress 登录页面。