ユーザーが特定の役割に属しているかどうかを確認する方法は?


59

現在のユーザーの役割に基づいて、ユーザープロファイルページのフィールドラベルに異なるテキストを表示するという非常に具体的な要件があります。現在の使用が「著者」であるかどうかを確認する方法を理解できないようです。

私は次のような関数を探しています:

is_user_in_role($user, "author");

これは非常に簡単だと思いますが、答えがなければ検索が長すぎたので、ここに投稿すると思いました。

回答:


113

現在のユーザーにのみこれが必要な場合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
}

10
私はこの投稿がずっと前に回答されていることを知っていますが、誰かがここにたまたま入ったら...もう一度current_user_can()のドキュメントを見てください->「ロール名をcurrent_user_can()に渡さないでください。正しく動作します(#22624を参照)。代わりに、AppThemesによってまとめられたユーザーロールのチェック機能を試してください。」(codex.wordpress.org/Function_Reference/current_user_can
bestprogrammerintheworld

1
^ ifステートメントに括弧がありませ
ん-Aajahid

1
@Aajahid編集:)
Rarst

10

ユーザーの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 ) );
}

1
ユーザーに割り当てられた最初のロールを取得するために私のためにうまく動作します。
Qスタジオ

ユーザーに割り当てられているすべての役割はどうですか?
ヴィシャールクマールサフ

1
@Vishal Kumarこれは、ユーザーに割り当てられたすべてのロールに対してチェックします。
スティーブンM.ハリス

この関数は存在しません。古いのかどうかは
わかり

2

新しいユーザーオブジェクトを作成することもできます。

$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で削除されたかはわかりませんが、使用可能な機能ではなくなりました。


これは、WP_Userクラスの他のメソッドを呼び出す必要がある場合に便利です。
ジャスティンウォーターズ

0

柔軟性を高めるためにユーザーとロールを受け入れる関数は次のとおりです。

関数my_has_role($ user、$ role){
  $ roles = $ user-> roles; 
  return in_array($ role、(array)$ user-> roles);
}

if(my_has_role($ user、 'some_role')){
  //何かをする
}

0

ユーザーオブジェクトでロールを呼び出して$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;
       }
 }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.