Registro e inicio de sesión separados para diferentes roles

16

He establecido 2 nuevos roles para mi sitio utilizando el complemento "Miembros": "vendedores" y "compradores".

Cada rol debe tener su propia página de registro e inicio de sesión. Un visitante puede registrarse como comprador y como vendedor, pero solo puede iniciar sesión como uno de ellos. Por lo tanto, si un visitante ha iniciado sesión como vendedor y luego va a la página del comprador, podrá iniciar sesión como comprador y cuando lo haga se desconectará automáticamente como vendedor.

He buscado durante horas un complemento que me dará la opción de hacer esto pero no pude encontrar uno. Suena como una configuración bastante común en sitios web con diferentes registros de roles.

¿Incluso existe un complemento como este? Y si no, ¿cómo se puede hacer esto?

    
pregunta Ash 29.04.2011 - 17:26

1 respuesta

17

Crear dos registros separados para diferentes roles es fácil:

//create a hidden field for role
add_action('register_form','add_hidden_role_field');

function add_hidden_role_field(){
    if (isset($_GET['role'])){
        echo '<input id="user_email" type="hidden" tabindex="20" size="25" value="'.$_GET['role'].'" name="role"/>';
    }
}

add_action('user_register', 'update_role');

//save the the role
function update_role($user_id, $password="", $meta=array()) {
   if (isset($_POST['role'])){
       $userdata = array();
       $userdata['ID'] = $user_id;
       $userdata['role'] = $_POST['role'];

       //only allow if user role is my_role to avoid a few new admins to the site
       if (($userdata['role'] == "seller") or ($userdata['role'] == "buyer")){
          wp_update_user($userdata);
       }
   }
}

y ahora puede vincular cada rol con "su propio" formulario de registro:

seller: http://example.com/wp-login.php?action=register&role=seller
buyer: http://example.com/wp-login.php?action=register&role=buyer

pero como comentó Milo:

  

"si alguien se registra como comprador,   no hay manera de que puedan iniciar sesión como   Cualquier cosa menos comprador con su   credenciales "

lo que significa que tendrían que usar un correo electrónico diferente para registrar la otra función.

Actualizar

esta es una actualización con un ejemplo para mostrar cómo se puede usar el mismo primer plano pero con diferentes campos para cada función.

Así que solo necesitas cambiar las funciones un poco:

//create a hidden field for role and extra fields needed
add_action('register_form','add_hidden_role_field');

function add_hidden_role_field(){
    if (isset($_GET['role'])){
        $user_type = $_GET['role'];
        echo '<input id="user_email" type="hidden" tabindex="20" size="25" value="'.$_GET['role'].'" name="role"/>';
    }
    if (isset($user_type) && $user_type == "seller"){
        //add extra seller fields here eg:
        ?>
        business name:
        <input id="user_email" type="text" tabindex="20" size="25" value="" name="business_name"/>

        business address:
        <input id="user_email" type="text" tabindex="20" size="25" value="" name="business_address"/>
        <?php
    }
    if (isset($user_type) && $user_type == "buyer"){
        //add extra buyer fields here eg:
        ?>
        buyer name:
        <input id="user_email" type="text" tabindex="20" size="25" value="" name="buyer_name"/>
        <?php
    }
}

de esta manera solo se muestran los campos necesarios para el rol específico.

A continuación, si desea tener algún tipo de validación en estos campos adicionales, puede usar register_post hook por ejemplo:

add_action('register_post','my_user_fields_validation',10,3);

function my_user_fields_validation($login, $email, $errors) {
    global $firstname, $lastname;
    //get the role to check
    if (isset($_POST['role'])){
        $user_type = $_POST['role'];
    }
    //check the fields according to the role
    if (isset($user_type) && $user_type == "seller"){
    //check sellers fields
        if ($_POST['business_name'] == '') {
            $errors->add('empty_business_name', "<strong>ERROR</strong>: Please Enter in a Business name");
        }
        if ($_POST['business_address'] == '') {
            $errors->add('empty_business_address', "<strong>ERROR</strong>: Please Enter in Business address");
        } 
    }
    if (isset($user_type) && $user_type == "buyer"){
        //check buyers fields
        if ($_POST['buyer_name'] == '') {
            $errors->add('empty_buyer_name', "<strong>ERROR</strong>: Please Enter in a Buyer name");
        }
    }
}

entonces, si todo está bien, simplemente guarda los campos en el meta del usuario según el rol

add_action('user_register', 'update_role');

//save the role
function update_role($user_id, $password="", $meta=array()) {
   if (isset($_POST['role'])){
       $userdata = array();
       $userdata['ID'] = $user_id;
       $userdata['role'] = $_POST['role'];
        $user_type = $_POST['role'];
       //only allow if user role is my_role to avoid a few new admins to the site
        if (($userdata['role'] == "seller") or ($userdata['role'] == "buyer")){
            wp_update_user($userdata);
        }
        if (isset($user_type) && $user_type == "seller"){
            //save sellers fields
            update_user_meta($user_id, 'business_name', $_POST['business_name']);
            update_user_meta($user_id, 'business_address', $_POST['business_address']);
        }
        if (isset($user_type) && $user_type == "buyer"){
            //save sellers fields
            update_user_meta($user_id, 'buyer_name', $_POST['buyer_name']);
        }
   }
}
    
respondido por el Bainternet 29.04.2011 - 23:49

Lea otras preguntas en las etiquetas