Separate Registrierung und Anmeldung für verschiedene Rollen


17

Ich habe 2 neue Rollen für meine Website mit dem Plugin "Mitglieder" festgelegt - "Verkäufer" und "Käufer".

Jede Rolle sollte eine eigene Registrierungsseite und ein eigenes Login haben. Ein Besucher kann sich sowohl als Käufer als auch als Verkäufer registrieren, er kann jedoch nur als einer von ihnen angemeldet sein. Wenn sich ein Besucher als Verkäufer angemeldet hat und dann auf die Käuferseite wechselt, kann er sich als Käufer anmelden. In diesem Fall wird er automatisch als Verkäufer abgemeldet.

Ich habe stundenlang nach einem Plugin gesucht, das mir die Möglichkeit gibt, dies zu tun, aber kein Plugin gefunden. Klingt nach einer ziemlich häufigen Konfiguration auf Websites mit unterschiedlichen Rollenregistrierungen.

Gibt es überhaupt ein solches Plugin? Und wenn nicht, wie geht das?


1
Sie benötigen keine separaten Formulare, sondern nur ein einziges Registrierungsformular mit der Möglichkeit, eine Rolle auszuwählen. Sobald sie für eine Rolle registriert sind, kann jeder dieselbe Anmeldeseite verwenden. Wenn sich jemand als Käufer registriert, kann er sich nur mit seinen Anmeldeinformationen als Käufer anmelden. vielleicht so etwas wie diese werden Sie in die richtige Richtung weisen.
Milo

Antworten:


17

Es ist einfach, zwei separate Registrierungen für verschiedene Rollen zu erstellen:

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

und jetzt können Sie jede Rolle mit einem "eigenen" Registrierungsformular verknüpfen:

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

aber wie Milo kommentierte:

"Wenn sich jemand als Käufer registriert, kann er sich nur mit seinen Zugangsdaten als Käufer anmelden."

Dies bedeutet, dass sie eine andere E-Mail-Adresse verwenden müssten, um die andere Rolle zu registrieren.

Aktualisieren

Dies ist ein Update mit einem Beispiel, in dem gezeigt wird, wie Sie denselben Vordergrund verwenden können, jedoch mit unterschiedlichen Feldern für jede Rolle.

Sie müssen also nur die Funktionen ein wenig ändern:

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

Auf diese Weise werden nur die Felder angezeigt, die für die jeweilige Rolle erforderlich sind.

Als nächstes können Sie Hooks verwenden, wenn Sie eine Art Validierung für diese zusätzlichen Felder wünschen register_post:

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

Wenn alles in Ordnung ist, speichern Sie die Felder in der Benutzer-Meta basierend auf der Rolle

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

Vielen Dank, Bainternet & Milo! Ja, ich meine, der Besucher wird sich zweimal registrieren - einmal als Verkäufer und einmal als Käufer mit unterschiedlichen E-Mails. Ich benötige jedoch zwei separate Registrierungsformulare, da jedes unterschiedliche Felder enthält. Beispiel: Das Registrierungsformular des Verkäufers enthält die Felder "Geschäftsname" und "Geschäftsadresse", während das Registrierungsformular des Käufers das Feld "Käufername" enthält. Also, Bainternet, ich bin nicht sicher, ob ich Ihren Code so wie er ist verwenden kann (aber vielen Dank für die Mühe), da er nur mit unterschiedlichen Parametern auf dieselbe Seite verweist. Wie kann ich das mit zwei getrennten Formularen machen?
Ash

@Ash: Sie brauchen immer noch keine zwei getrennten Formulare. Fügen Sie einfach die Felder hinzu, die auf der Rolle basieren. Ich werde meine Antwort mit einem Beispiel aktualisieren.
Bainternet

@Ash: Überprüfen Sie das Update in der Antwort.
Bainternet

@Bainternet, vielen Dank für den zusätzlichen Code!
Ash

@Bainternet: Sorry für die Anfängerfrage, aber das bin ich :-) - ist dieser Code nur in einem Plugin verwendbar oder kann er auch in einer PHP-Datei verwendet werden, die eine Vorlage für eine Seite ist?
Ash
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.