Registro e inicio de sesión separados para diferentes roles
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?
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']);
}
}
}

¡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: aún no necesitas dos formularios separados, simplemente añade los campos según el rol, actualizaré mi respuesta con un ejemplo.

@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?

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

@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.

@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?

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

@Bainternet, hice una nueva pregunta. ¡Gracias!

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
