回答:
現在のユーザーにのみこれが必要な場合current_user_can()
は、役割と機能の両方を受け入れます。
更新:ロール名を渡すと、current_user_can()
正常に動作することが保証されなくなりました(#22624を参照)。代わりに、ユーザーロールを確認することをお勧めします。
$user = wp_get_current_user();
if ( in_array( 'author', (array) $user->roles ) ) {
//The user has the "author" role
}
ユーザーのIDを使用してユーザーのロールを取得する方法を探していました。ここに私が思いついたものがあります:
function get_user_roles_by_user_id( $user_id ) {
$user = get_userdata( $user_id );
return empty( $user ) ? array() : $user->roles;
}
次に、is_user_in_role()
関数を次のように実装できます。
function is_user_in_role( $user_id, $role ) {
return in_array( $role, get_user_roles_by_user_id( $user_id ) );
}
新しいユーザーオブジェクトを作成することもできます。
$user = new WP_User( $user_id );
if ( ! empty( $user->roles ) && is_array( $user->roles ) && in_array( 'Some_role', $user->roles ) ) {
return true;
}
どのバージョンget_user_roles_by_user_id
で削除されたかはわかりませんが、使用可能な機能ではなくなりました。
ユーザーオブジェクトでロールを呼び出して$user->roles
も、すべてのロールが返されるわけではありません。ユーザーにロールまたは機能があるかどうかを確認する正しい方法は次のとおりです。(これはwpバージョン2.0.0以降で動作します。)次の関数は、現在のユーザーIDを取得できるユーザーIDで動作します$current_user_id = get_current_user_id();
/**
* Returns true if a user_id has a given role or capability
*
* @param int $user_id
* @param string $role_or_cap Role or Capability
*
* @return boolean
*/
function my_has_role($user_id, $role_or_cap) {
$u = new \WP_User( $user_id );
//$u->roles Wrong way to do it as in the accepted answer.
$roles_and_caps = $u->get_role_caps(); //Correct way to do it as wp do multiple checks to fetch all roles
if( isset ( $roles_and_caps[$role_or_cap] ) and $roles_and_caps[$role_or_cap] === true )
{
return true;
}
}