web-dev-qa-db-fra.com

Création de relations utilisateur

J'ai un projet dans lequel je pense avoir besoin de créer des relations entre utilisateurs, mais comme cela n'est pas implémenté de manière native dans Wordpress, il me faut des conseils sur la façon de le faire.

Un utilisateur aura le rôle personnalisé d'agent, tandis qu'un autre utilisateur aura le rôle d'abonné. Je souhaite créer une relation un-à-plusieurs entre agent et abonné, respectivement. Comment s'y prendre, c'est là où je suis perplexe.

Idéalement, lorsqu'un abonné se connecte, il peut sélectionner l'agent qui le représente dans une liste déroulante de son profil, créant ainsi la relation. Cette fonctionnalité s'adresse uniquement aux personnes ayant le rôle d'abonné. Un agent ne peut pas créer d'abonné. Les agents sont manuellement enregistrés par les administrateurs de wordpress, les abonnés utilisent le formulaire d’inscription situé au début du site.

En ce qui concerne les agents, la relation leur permet, entre autres, d’afficher un tableau de leurs abonnés (prénom, nom, email, téléphone, valeur totale de l’investissement, etc.). Les agents peuvent également uniquement voir leurs abonnés.

Si je créais une base de données à partir de rien, je créerais simplement une table pour les agents, une autre pour les utilisateurs avec une clé étrangère d'agent, mais Wordpress semble mettre tous les utilisateurs dans une table de base de données (sauf si je me trompe).

Dans le scénario ci-dessus, la question est de savoir quel sera le meilleur moyen de créer la relation agent-abonné. Je sais que la question peut paraître vague et qu’elle n’a pas de code, mais j’espère que les personnes ayant l’expérience d’un tel problème pourront me donner une idée.

Merci.

EDIT Suite à la réponse de @ janh2 ci-dessous, j'ai pu créer une relation entre agent et abonné. Je vais montrer le code pour qu'il puisse aider quelqu'un à l'avenir.

Code pour l'ajout d'un rôle d'utilisateur

function gtb_add_user_role(){

     add_role(
        'customer_agent',
        __('Customer Agent'),
        array(
            'read' => true,
            'level_0' => true
        )
    );
}

code pour l'ajout de champs personnalisés d'abonné

//add custom profile fields 
function gtb_add_subscriber_custom_fields($user_id){
    if(current_user_can('subscriber')):
        include('subscriber_custom_fields.php');
    endif;
}

code dans subscriber_custom_fields.php (ne pourrait pas fonctionner avant que je rende user_id global, je ne sais pas pourquoi mais de toute façon ....)

<?php
global $user_id;
$agent_selection = get_user_meta($user_id,'customer_agent_rep',true);
?>
 <table class="form-table">
  <tr>
    <th>
        <label for="subscriber_customer_agent"><?php _e('Your Agent');?></label>
    </th>
    <td>
        <?php 
            $args = array(
                'role__in' => array('customer_agent')
            );
            $agents_query = new WP_User_Query($args);

            $customer_agents = $agents_query->get_results();
        ?>
        <select name="subscriber_customer_agent" id="subscriber_customer_agent">
            <option value="0" <?php selected($agent_selection,"0");?> >None</option>
            <?php
                foreach($customer_agents as $customer_agent):
                    $the_agent_number = $customer_agent->ID;
            ?>
                    <option value="<?php echo $customer_agent->ID; ?>" 
<?php selected($agent_selection,$the_agent_number);?>  > <?php echo $the_agent_number." - ". $customer_agent->display_name; ?></option>
            <?php
                endforeach;
            ?>
        </select>
    </td>
</tr>
</table>

Enregistrement et mise à jour de la méta utilisateur

 //save or update custom meta
function gtb_save_subscriber_meta($user_id){
    if(current_user_can('subscriber')):
        //check and update agent_rep_meta
        $agent_representative = get_user_meta($user_id,'customer_agent_rep',true);
        if(empty($agent_representative)){
            add_user_meta(
                $user_id,
                'customer_agent_rep',
                $_POST['subscriber_customer_agent']
            );
        }else{
                update_user_meta(
                    $user_id,
                    'customer_agent_rep',
                    $_POST['subscriber_customer_agent']
                );
        }       
    endif;
}

Des crochets d'action pour créer un champ de profil personnalisé et une méta d'utilisateur lorsque le thème est configuré/activé. Certaines actions s'accrochent vers le haut et d'autres vers le bas. Je ne comprends pas encore tout à fait que certains de ces crochets peuvent être inutiles.Plus d'experts peuvent être expliqués plus loin.

add_action('after_setup_theme','gtb_theme_setup')


function gtb_theme_setup(){
  //add user role
  gtb_add_user_role();
   //hook custom profile fields at the end of the page.
    add_action ('show_user_profile','gtb_add_subscriber_custom_fields',10,1);
//save or update  custom meta
    add_action('personal_options_update','gtb_save_subscriber_meta',10,2);

    add_action('profile_update','gtb_save_subscriber_meta',10,2);
    add_action('show_user_profile','gtb_save_subscriber_meta',10,2);
 //code for enqueuing styles and scripts and other theme functions goes here.......

}

@ Janh2 answer est plus utile du côté de l'agent. Vous pouvez créer une table dans le backend de l'agent (vue) dans laquelle vous pouvez utiliser le code pour remplir une table.

J'espère que cette contribution est utile à quelqu'un. Merci beaucoup :-)

1
nelson

WordPress vous donne la possibilité de enregistrer les métadonnées pour les utilisateurs }, afin que vous puissiez simplement stocker l'identifiant de l'agent dans un champ méta de ses abonnés, comme update_user_meta( $user_id, "agent", $agent_id ).

Vous pouvez ensuite interroger ces utilisateurs à l'aide de la méta_query méta_query de WP_User_Query , par exemple.

$agents_subscribers = new WP_User_Query( array(
    'meta_key' => 'agent',
    'meta_value' => $agent_id
) );
2
janh