Registro e inicio de sesión separados para diferentes roles

17

He establecido 2 nuevos roles para mi sitio usando 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 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 cerrará automáticamente como vendedor.

He buscado durante horas un complemento que me dé 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.

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

Ceniza
fuente
1
no necesita formularios separados, solo un formulario de registro único con un medio para seleccionar el rol. Una vez que están registrados para 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 un comprador con sus credenciales. tal vez algo como esto te guíe en la dirección correcta.
Milo
puedes usar este enlace wordpress.stackexchange.com/questions/237248/…
Charles Xavier

Respuestas:

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 el formulario de registro "propio":

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

pero como Milo comentó:

"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 registrar el otro rol.

Actualizar

Esta es una actualización con un ejemplo para mostrar cómo puede usar el mismo fore pero con diferentes campos para cada rol.

Entonces solo necesitas cambiar un poco las funciones:

//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 para estos campos adicionales, puede usar register_posthook, 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 guarde 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']);
        }
   }
}
Bainternet
fuente
Gracias Bainternet y Milo! Sí, quiero decir que el visitante se registrará dos veces, una como vendedor y otra como comprador, con diferentes correos electrónicos. Pero necesito dos formularios de registro separados, ya que cada uno de ellos contendrá diferentes campos. Por ejemplo: el formulario de registro del vendedor incluirá los campos: "nombre comercial" y "dirección comercial", mientras que el formulario de registro del comprador incluirá el campo "nombre del comprador". Entonces, Bainternet, no estoy seguro de poder usar su código tal como está (pero muchas gracias por el esfuerzo) ya que apunta a la misma página solo con diferentes parámetros. ¿Cómo puedo hacerlo con dos formas separadas?
Ash
@ Ash: todavía no necesita dos formularios separados, solo agregue los campos en función del rol, actualizaré mi respuesta con un ejemplo.
Bainternet 01 de
@ Ash: verifique la actualización en la respuesta.
Bainternet
@Bainternet, ¡Muchas gracias por el código adicional!
Ash
@Bainternet: Perdón por la pregunta de novato, pero eso es lo que soy :-): ¿este código solo se puede usar en un complemento o también se puede usar en un archivo php que es una plantilla para una página?
Ash