web-dev-qa-db-ja.com

ユーザーがユーザーIDで管理者であるかどうかを確認してください

ユーザー( ユーザーID )が管理者であるかどうかを確認する方法はありますか?現在ログインしているという意味ではありません。

5
jmeinlschmidt

ユーザーがadministrator role を持っているかどうかを確認したいので、それを気にしました。特定のアクションに関連して、 capability をチェックすることがより適切であると考えられます。

実際には、これは通常、現在のユーザーのcurrent_user_can( 'manage_options' )として表されます。任意のユーザーの場合はuser_can( $user_id, 'manage_options' )になります。

もちろん、これはサイトの一般的な設定を表す機能です。あなたの目的によっては、違うものを使いたくなるかもしれません。 ロールと機能のドキュメント のリストを見てください。

13
Rarst

@Rarstの回答に追加しているだけです。

技術的にはあなたはそれらの関数にロール名を与えることができるので、current_user_can( 'administrator' )またはuser_can( $user_id, 'administrator' )も動作するでしょうが、 推奨されていません

機能の代わりに特定の役割をチェックすることも部分的にはサポートされていますが、信頼できない結果が生じる可能性があるため、この方法はお勧めできません。

注:特に拒否されない限り、現在のユーザーがスーパー管理者の場合は常にtrueを返します。

これらの機能に頼らずにロールをチェックすることはできますが(信頼性が低いため)、@Rarstが言ったように、ロールではなく機能をチェックする方が適切です。

役割の代わりに機能を使用することの主な利点は次のとおりです。

あなたのサイトに複数の管理者がいるとしましょう。クライアントを管理者にし、サイトの管理者にもしたいとしましょう。

今すぐあなたのクライアントが彼のサイトに対する管理者権限を持っていることは理にかなっていますが、あなたは彼/彼女にサイトにプラグインをインストールする能力を持たせたくないかもしれません。それはあなたのウェブマスターとしての仕事です。

そのため、ロールをチェックすると、そのロール内で everyone への機能の無効化/有効化に固執することになります。

これで、機能を使用する場合は、ユーザーに特定の操作を許可または制限することよりもきめ細かい管理ができます。

私のシナリオに戻ると、クライアント管理者に特権を与えたいが、プラグインをインストールすることはできないのであれば、それはとても簡単です。

add_filter( 'user_has_cap', 'client_admin_cap_filter', 10, 3 );
function client_admin_cap_filter( $allcaps, $cap, $args ){

  // the requested capability and our client user id 
  if ( 'install_plugins' == $args[0] && $args[1] == 2 ) 
    $allcaps[ $cap[0] ] = false;

  return $allcaps;
}

update_coremanage_optionsinstall_pluginsinstall_themesなど、制限したいさまざまな機能を提供できます。

私たちの機能はまだかなりシンプルでしょう

add_filter( 'user_has_cap', 'client_admin_cap_filter', 10, 3 );
function client_admin_cap_filter( $allcaps, $cap, $args ){

  $restricted_cap = array( 
    'update_core',
    'manage_options',
    'install_plugins',
    'install_themes',
     // etc.
  );

  foreach( $restricted_cap as $r_cap ){

    // the requested capability and our client user id 
    if ( $r_cap == $args[0] && $args[1] == 2 ) 
      $allcaps[ $cap[0] ] = false;

  } 

  return $allcaps;
}

ご覧のとおり、これはかなり効果的で、特別な役割を必要とせず、余分なDBクエリを追加することも、実行時に実行されることも、簡単にスケーラブルで保守も容易です。

ロジックがロールに依存している場合は、可能な限りすべてのユースケースに追いつくために、特定のユーザー、シナリオ、またはその他のものをターゲットにしたり、ガジリオンロールを作成したりすることなく頑張ってください。

user_has_cap フィルターの詳細については、コーデックスを確認してください。

3
bynicolas

get_userdata() または get_user_by() を使用すると、ユーザーIDを渡してユーザーオブジェクトを取得できます。そこからあなたは役割を得ます。

$user = get_userdata( $user_id );
if(!empty( $user ) && $user){
   $user->roles // this contains the role here check for whatever role you need
}

あなたはこれをチェックすることができます 答え 詳細については

3
bravokeyl