Registro e login separados para diferentes funções


17

Eu defini duas novas funções para o meu site usando o plug-in "Membros" - "vendedores" e "compradores".

Cada função deve ter sua própria página de registro e login. Um visitante pode se registrar como comprador e vendedor, mas ele só pode fazer login como um deles. Portanto, se um visitante tiver efetuado login como vendedor e for para a página do comprador, ele poderá efetuar login como comprador e, quando o fizer, será automaticamente desconectado como vendedor.

Procurei por horas um plugin que me desse a opção de fazer isso, mas não consegui encontrar um. Parece uma configuração bastante comum em sites com diferentes registros de funções.

Um plug-in como esse existe? E se não, como isso pode ser feito?


1
você não precisa de formulários separados, apenas um único formulário de registro com um meio de selecionar a função. Uma vez registrados para uma função, todos podem usar a mesma página de login. se alguém se registrar como comprador, não há como ele fazer login como algo que não seja o comprador com suas credenciais. talvez algo assim aponte a direção certa.
Milo

Respostas:


17

É fácil criar dois registros separados para funções diferentes:

//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);
       }
   }
}

e agora você pode vincular cada função ao formulário de registro "próprio":

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

mas como Milo comentou:

"se alguém se registrar como comprador, não há como ele fazer login como algo que não seja o comprador com suas credenciais"

o que significa que eles precisariam usar um email diferente para registrar a outra função.

Atualizar

Esta é uma atualização com um exemplo para mostrar como você pode usar o mesmo exemplo anterior, mas com campos diferentes para cada função.

Então, você só precisa alterar um pouco as funções:

//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
    }
}

dessa maneira, apenas os campos necessários para a função específica são mostrados.

A seguir, se você quiser ter algum tipo de validação para esses campos extras, poderá usar o register_posthook, por exemplo:

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");
        }
    }
}

se tudo estiver bem, salve os campos na meta do usuário com base na função

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']);
        }
   }
}

Obrigado Bainternet & Milo! Sim, quero dizer que o visitante se registrará duas vezes - uma como vendedor e outra como comprador, com e-mails diferentes. Mas preciso de dois formulários de registro separados, pois cada um deles conterá campos diferentes. Por exemplo: o formulário de registro do vendedor incluirá os campos - "nome da empresa" e "endereço comercial", enquanto o formulário de registro do comprador incluirá o campo "nome do comprador". Então, Bainternet, não tenho certeza de que posso usar seu código como ele é (mas muito obrigado pelo esforço), pois ele aponta para a mesma página apenas com parâmetros diferentes. Como posso fazer isso com dois formulários separados?
Ash

@ Ash: você ainda não precisa de dois formulários separados, basta adicionar os campos com base no papel, eu vou atualizar minha resposta com um exemplo.
Bainternet

@ Ash: verifique a atualização na resposta.
Bainternet

@Bainternet, Muito obrigado pelo código adicional!
Ash

@Bainternet: Desculpe a pergunta do novato, mas é isso que eu sou :-) - esse código é apenas utilizável em um plug-in ou também pode ser usado em um arquivo php que é um modelo para uma página?
Ash
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.