web-dev-qa-db-ja.com

親ユーザーの下にユーザーをグループ化する

それがどのようなものである必要があります:

  • ユーザーロールcompanyを持つ1つの "スーパーユーザー")
  • ユーザロール従業員を持つ一般ユーザ)

  1. 私は「スーパーユーザー」にもっと多くの機能、特に管理者のような機能を持たせたくありません。

  2. companypostmetaテーブルが他のテーブルに比べて大きくなり過ぎているため、カスタム投稿を使用したくありません。また、ログインできるようにする必要があります。 -終わり。

  3. 通常のユーザーは "スーパーユーザー" a.k.aで特定の会社の従業員であるすべてのユーザーに問い合わせることができます。

どのようにユーザーと "スーパーユーザー"の間でそのような関係を作るのですか? 明らかにusermetaは行くべき道ですが、どうやってこれに近づくのですか?うまくいく巨大なコードは必要ありません。私はアイデアそれがどのように機能するかを知る必要があります。

4
N00b

役割

まず最初に2つの役割を登録する必要があります。 add_role を見てください。

役割を登録すると、必要な機能を自由に割り当てられます。

テーマ/プラグインが有効になったときにロールを追加し、無効になったときにロールを削除するように注意してください( remove_role を参照)。


メタデータ

ユーザーIDの配列を格納するcompany_employeesのようなメタエントリを使用して関連付けを行うことができます。従業員を取得/設定するためのカスタム機能を会社のユーザーに関連付けることができます。

会社の従業員を獲得する

与えられた従業員の配列を返す関数のコード例:

function getEmployees(\WP_User $user) {
  // if the user has not the role "company_role" can't have employees
  if ( ! in_array('company_role', $user->roles, true) ) {
    return array();
  }
  $meta = get_user_meta($user->ID, 'company_employees', true);
  if (empty($meta)) {
    return array();
  }

  $query = new WP_User_Query(array(
    'role'    => 'employee_role',
    'include' => (array) $meta
  ));

  return $query->results;
}

会社への従業員の割当

同様に、従業員を会社のユーザーに割り当てる関数を書くことができます。

function assignToCompany(\WP_User $employee, \WP_User $company) {
  // if the company user has not the role "company_role" can't have employees
  if ( ! in_array('company_role', $company->roles, true) ) {
     return false;
  }
  // if the employee user has not the role "employee_role" can't be assigned
  if ( ! in_array('employee_role', $employee->roles, true) ) {
     return false;
  }
  // get current employees
  $employees = get_user_meta($company->ID, 'company_employees', true);
  is_empty($employees) and $employees = array();
  // add employee and update
  $employees[] = $employee->ID;
  $update = update_user_meta($company->ID, 'company_employees', $employees);

  return (int) $update > 0;
}

UI

もちろん、従業員をユーザーに割り当てるための何らかのUIが必要です。従業員が1つの会社しかない場合は、ユーザー編集ページにドロップダウンメニューを表示してすべての会社を一覧表示し、保存時に上記の機能を利用して従業員を会社のユーザーメタに保存できます。

それをするには:

  • edit_user_profile hookを見てドロップダウンメニューを印刷してください。従業員会社の編集を許可されているユーザーにのみメニューを表示するようにしてください。
  • edit_user_profile_update hookを見て会社をメタフィールドに保存してください。現在のユーザーが従業員会社の編集を許可されている場合にのみ、必ず保存を続行してください。
  • ドロップダウンメニューを印刷するときには必ず nonceフィールド を追加し、確認してから保存してください。 wp_nonce_field() および wp_verify_nonce() を参照してください。

ファイナルタッチ

会社ユーザー管理UI

ユーザー編集ページで、会社のユーザーに現在割り当てられている従業員のリストを追加できます。

編集可能にすることはボーナスです。

ユーティリティ機能

isEmployee()isCompany()のように、ユーザーオブジェクトot idを受け取り、ユーザーが関連するロールを持っている場合はtrue/falseを返す、2つのユーティリティ関数を追加できます。

isEmployeeは、会社のユーザーと一緒にオプションのパラメータを受け入れることもでき、ユーザーがその特定の会社の従業員である場合にのみtrueを返します。

カスタム機能

管理者に割り当て可能なカスタム機能'assign_employee'、および従業員ユーザーを会社のユーザーに割り当てられるようにしたいその他の役割に導入することをお勧めします。これは、会社のドロップダウンリストを表示する必要があるとき、および会社のメタを保存する必要があるときに便利です。

この機能が整っていれば、current_user_can('assign_employee')を使ってユーザーに許可されているかどうかを確認できます。

カスタム機能を既存のロールに割り当てるには、 WP_Roles::add_cap() を参照してください。

これを行うことにした場合は、プラグイン/テーマが無効になっているときに機能を削除することを忘れないでください。

フロントエンド会社ページ

あなたがそれを必要としているかどうかわからないが、ユーザーの会社の説明と全従業員のリストを表示するためにカスタムの ページテンプレートカスタムエンドポイント を使ってフロントエンドで "会社ページ"を作成できます

4
gmazzap