Registro e inicio de sesión separados para diferentes roles

29 abr 2011, 18:26:42
Vistas: 31.6K
Votos: 17

He configurado 2 nuevos roles para mi sitio usando el plugin "Members" - "vendedores" y "compradores".

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

He buscado durante horas un plugin que me dé la opción de hacer esto pero no pude encontrar uno. Parece una configuración bastante común en sitios web con diferentes registros de roles.

¿Existe siquiera un plugin como este? Y si no, ¿cómo se puede hacer esto?

2
Comentarios

no necesitas formularios separados, solo un único formulario de registro con una forma de seleccionar el rol. una vez registrados con un rol, todos pueden usar la misma página de inicio de sesión. si alguien se registra como comprador, no hay forma de que pueda iniciar sesión como otra cosa que no sea comprador con sus credenciales. quizás algo como esto te oriente en la dirección correcta.

Milo Milo
29 abr 2011 19:13:29
Todas las respuestas a la pregunta 1
11
17

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

//crear un campo oculto para el rol
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');

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

       //solo permitir si el rol del usuario es my_role para evitar añadir nuevos admins al sitio
       if (($userdata['role'] == "seller") or ($userdata['role'] == "buyer")){
          wp_update_user($userdata);
       }
   }
}

y ahora puedes enlazar cada rol con su propio formulario de registro:

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

pero como comentó Milo:

"si alguien se registra como comprador, no hay forma de que pueda iniciar sesión como otra cosa que no sea comprador con sus credenciales"

lo que significa que tendrían que usar un correo electrónico diferente para registrarse en el otro rol.

Actualización

esta es una actualización con un ejemplo para mostrar cómo puedes usar el mismo formulario pero con diferentes campos para cada rol.

Solo necesitas modificar un poco las funciones:

//crear un campo oculto para el rol y campos adicionales necesarios
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"){
        //añadir campos adicionales para vendedores aquí, ej:
        ?>
        nombre del negocio:
        <input id="user_email" type="text" tabindex="20" size="25" value="" name="business_name"/>

        dirección del negocio:
        <input id="user_email" type="text" tabindex="20" size="25" value="" name="business_address"/>
        <?php
    }
    if (isset($user_type) && $user_type == "buyer"){
        //añadir campos adicionales para compradores aquí, ej:
        ?>
        nombre del comprador:
        <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.

Luego, si deseas tener algún tipo de validación para estos campos adicionales, puedes usar el hook register_post, por ejemplo:

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

function my_user_fields_validation($login, $email, $errors) {
    global $firstname, $lastname;
    //obtener el rol a verificar
    if (isset($_POST['role'])){
        $user_type = $_POST['role'];
    }
    //verificar los campos según el rol
    if (isset($user_type) && $user_type == "seller"){
    //verificar campos de vendedores
        if ($_POST['business_name'] == '') {
            $errors->add('empty_business_name', "<strong>ERROR</strong>: Por favor ingresa un nombre de negocio");
        }
        if ($_POST['business_address'] == '') {
            $errors->add('empty_business_address', "<strong>ERROR</strong>: Por favor ingresa una dirección de negocio");
        } 
    }
    if (isset($user_type) && $user_type == "buyer"){
        //verificar campos de compradores
        if ($_POST['buyer_name'] == '') {
            $errors->add('empty_buyer_name', "<strong>ERROR</strong>: Por favor ingresa un nombre de comprador");
        }
    }
}

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

add_action('user_register', 'update_role');

//guardar el rol
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'];
       //solo permitir si el rol del usuario es my_role para evitar añadir nuevos admins al sitio
        if (($userdata['role'] == "seller") or ($userdata['role'] == "buyer")){
            wp_update_user($userdata);
        }
        if (isset($user_type) && $user_type == "seller"){
            //guardar campos de vendedores
            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"){
            //guardar campos de compradores
            update_user_meta($user_id, 'buyer_name', $_POST['buyer_name']);
        }
   }
}
30 abr 2011 00:49:30
Comentarios

¡Gracias Bainternet y Milo!

Sí, me refiero a que el visitante se registrará dos veces: una como vendedor y otra como comprador, con correos electrónicos diferentes.

Pero necesito dos formularios de registro separados ya que cada uno contendrá campos diferentes. Por ejemplo: el formulario del vendedor incluirá los campos - "nombre del negocio" y "dirección del negocio" mientras que el formulario del comprador incluirá el campo "nombre del comprador".

Entonces, Bainternet, no estoy seguro de poder usar tu código tal cual está (pero muchas gracias por el esfuerzo) ya que apunta a la misma página solo con parámetros diferentes.

¿Cómo puedo hacerlo con dos formularios separados?

Ash Ash
1 may 2011 13:51:24

@Ash: aún no necesitas dos formularios separados, simplemente añade los campos según el rol, actualizaré mi respuesta con un ejemplo.

Bainternet Bainternet
1 may 2011 17:01:41

@Ash: revisa la actualización en la respuesta.

Bainternet Bainternet
1 may 2011 17:24:40

@Bainternet, ¡Muchas gracias por el código adicional!

Ash Ash
2 may 2011 12:10:48

@Bainternet: Disculpa por la pregunta de principiante pero eso es lo que soy :-) - ¿este código solo se puede usar en un plugin o también se puede usar en un archivo php que es una plantilla para una página?

Ash Ash
2 may 2011 12:13:19

Ya sea en un plugin o en el functions.php del tema. Cualquier otra opción requeriría incluir archivos adicionales.

Bainternet Bainternet
2 may 2011 12:47:18

@Bainternet: OK. Se entiende el problema de registro. ¡Muy apreciado!

¿Podrías referirte al problema de inicio de sesión? Sé que no es el comportamiento habitual de WordPress pero así es como necesito que funcione mi sitio.

Para ser más claro, este es el comportamiento que necesito - si un visitante ha iniciado sesión como comprador y luego va a la página de inicio de sesión de vendedores, debería verse como no conectado como vendedor. Luego, si inicia sesión como vendedor, se cerrará automáticamente su sesión como comprador. De lo contrario, si regresa a la página de compradores, aún se verá conectado como comprador.

Gracias de nuevo.

Ash Ash
2 may 2011 15:40:40

@bainternet, en los errores, la función my_user_fields_validation recargará/reutilizará el enlace http://example.com/wp-login.php?action=register y no el enlace específico del rol, por ejemplo http://example.com/wp-login.php?action=register&role=seller. ¿Puedes mejorar esta función?

Iurie Iurie
28 ago 2013 14:09:19

@lurie puedes establecer y leer una cookie de un rol. haz una nueva pregunta y te ayudaré.

Bainternet Bainternet
28 ago 2013 14:39:01

@Bainternet, hice una nueva pregunta. ¡Gracias!

Iurie Iurie
28 ago 2013 15:56:14

En lugar de usar el hook register_post para validación deberías usar el filtro registration_errors. Mira http://codex.wordpress.org/Plugin_API/Action_Reference/register_post

Tim Tim
28 ago 2015 11:30:57
Mostrar los 6 comentarios restantes