web-dev-qa-db-fra.com

Regroupement d'utilisateurs sous l'utilisateur parent

Comment ça doit être:

  • un "super utilisateur" avec le rôle utilisateur company
  • utilisateurs normaux avec le rôle utilisateur employé

  1. Je ne veux pas que le "super utilisateur" puisse avoir plus de fonctionnalités, notamment des fonctionnalités de type administrateur.

  2. Je ne veux pas utiliser le message personnalisé pour émuler company car la table postmeta devient déjà trop grosse par rapport au reste. De plus, j'ai besoin des deux pour pouvoir me connecter et ce "super utilisateur" peut gérer ses utilisateurs en front-end.

  3. Les utilisateurs normaux doivent être en mesure d'interroger le "super utilisateur" a.k.a interroger tous les utilisateurs qui sont des employés de cette entreprise spécifique.

Comment faire ce genre de connexion entre l'utilisateur et "super utilisateur"? Evidemment usermeta est la voie à suivre mais comment aborder cela? Je n'ai pas besoin d'un code énorme qui fonctionne, j'ai besoin de une idée comment cela fonctionnerait.

4
N00b

Rôles

Tout d’abord, vous devez enregistrer les 2 rôles. Consultez add_role .

Lorsque vous enregistrez le rôle, vous êtes libre d’attribuer les fonctionnalités de votre choix.

Veillez seulement à ajouter les rôles lorsque votre thème/plug-in est activé et éventuellement à les supprimer (voir remove_role ) lorsqu'il est désactivé.


Métadonnées

Vous pouvez faire l'association en utilisant une méta-entrée telle que company_employees qui stocke un tableau d'ID utilisateur. Vous pouvez associer une fonction personnalisée pour obtenir/définir des employés à un utilisateur de l'entreprise.

Obtenir les employés d'une entreprise

Exemple de code pour une fonction qui renvoie un tableau d'employés à partir d'un utilisateur:

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;
}

Affecter un employé à une entreprise

De la même manière, vous pouvez écrire une fonction pour affecter un employé à un utilisateur de l'entreprise:

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

Bien sûr, vous avez besoin d'une sorte d'interface utilisateur pour affecter les employés aux utilisateurs. Si un employé ne peut avoir qu'une seule entreprise, vous pouvez afficher un menu déroulant dans la page d'édition de l'utilisateur où vous répertoriez toutes les entreprises et, lors de l'enregistrement, vous pouvez utiliser la fonction ci-dessus pour stocker l'employé dans la méta utilisateur de l'entreprise.

Pour faire ça:

  • regardez edit_user_profile hook pour imprimer le menu déroulant. Veillez à afficher le menu uniquement aux utilisateurs autorisés à modifier l'entreprise de l'employé.
  • regardez edit_user_profile_update hook pour enregistrer la société dans le champ méta. Assurez-vous de ne sauvegarder que si l'utilisateur actuel est autorisé à modifier l'entreprise de l'employé.
  • veillez également à ajouter un champ nonce lorsque vous imprimez le menu déroulant et vérifiez-le avant de procéder à la sauvegarde. Voir wp_nonce_field() et wp_verify_nonce()

Touches finales

Interface utilisateur utilisateur de la société

Vous pouvez ajouter la liste des employés actuellement affectés à un utilisateur de la société dans la page de modification de l'utilisateur.

Le rendre modifiable est un bonus.

Fonctions utilitaires

Vous pouvez ajouter quelques fonctions utilitaires telles que isEmployee(), isCompany() qui acceptent un objet utilisateur sans id et renvoient true/false si l'utilisateur a le rôle associé.

isEmployee peut également accepter un paramètre facultatif avec un utilisateur de la société et ne renvoyer la valeur true que si l'utilisateur est un employé de cette société spécifique.

Capacité personnalisée

Il peut être judicieux d’introduire une fonctionnalité personnalisée 'assign_employee' que vous pouvez attribuer aux administrateurs, ainsi qu’à tout autre rôle que vous souhaitez pouvoir affecter des utilisateurs employés à des utilisateurs de l’entreprise. Cela peut être utile lorsque vous devez afficher le menu déroulant de la société et lorsque vous devez enregistrer la méta de la société.

Avec cette fonctionnalité en place, vous pouvez vérifier si un utilisateur est autorisé à le faire en utilisant current_user_can('assign_employee').

Pour attribuer une fonctionnalité personnalisée à un rôle existant, consultez WP_Roles::add_cap() .

Si vous décidez de le faire, n'oubliez pas de supprimer cette fonctionnalité lorsque le plugin/thème est désactivé.

Frontend Company Page

Je ne sais pas si vous en avez besoin, mais vous pouvez créer une "page de société" dans le frontal, à l'aide d'un modèle de page } personnalisé et d'un point de terminaison personnalisé pour afficher la description de la société utilisateur et un liste de tous les employés

4
gmazzap