Pisahkan pendaftaran dan login untuk berbagai peran

17

Saya telah menetapkan 2 peran baru untuk situs saya menggunakan plugin "Anggota" - "penjual" dan "pembeli".

Setiap peran harus memiliki halaman pendaftaran dan login sendiri. Pengunjung dapat mendaftar sebagai pembeli dan penjual tetapi ia hanya dapat masuk sebagai salah satu dari mereka. Jadi, jika seorang pengunjung telah masuk sebagai penjual dan kemudian pergi ke halaman pembeli, ia akan dapat login sebagai pembeli dan ketika ia melakukannya, ia akan secara otomatis keluar sebagai penjual.

Saya telah mencari berjam-jam untuk sebuah plugin yang akan memberi saya opsi untuk melakukan ini tetapi tidak dapat menemukannya. Kedengarannya seperti konfigurasi yang cukup umum di situs web dengan pendaftaran peran yang berbeda.

Apakah ada plugin seperti ini? Dan jika tidak, bagaimana ini bisa dilakukan?

Abu
sumber
1
Anda tidak perlu formulir terpisah, hanya formulir pendaftaran tunggal dengan cara memilih peran. begitu mereka terdaftar ke suatu peran, semua orang dapat menggunakan halaman login yang sama. jika seseorang mendaftar sebagai pembeli, tidak mungkin mereka dapat masuk sebagai pembeli selain kredensial mereka. mungkin sesuatu seperti ini akan mengarahkan Anda ke arah yang benar.
Milo
Anda dapat menggunakan tautan ini wordpress.stackexchange.com/questions/237248/…
Charles Xavier

Jawaban:

17

Membuat dua pendaftaran terpisah untuk peran yang berbeda itu mudah:

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

dan sekarang Anda dapat menautkan setiap peran dengan formulir pendaftaran "sendiri":

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

tetapi seperti yang dikatakan Milo:

"Jika seseorang mendaftar sebagai pembeli, tidak mungkin mereka bisa masuk sebagai selain pembeli dengan kredensial mereka"

yang berarti bahwa mereka harus menggunakan email yang berbeda untuk mendaftarkan peran lainnya.

Memperbarui

ini adalah pembaruan dengan contoh untuk menunjukkan bagaimana Anda dapat menggunakan kedepan yang sama tetapi dengan bidang yang berbeda untuk setiap peran.

Jadi, Anda hanya perlu mengubah sedikit fungsi:

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

dengan cara ini hanya bidang yang dibutuhkan oleh peran tertentu yang ditampilkan.

Berikutnya adalah jika Anda ingin memiliki semacam validasi untuk bidang tambahan ini, Anda dapat menggunakan register_posthook misalnya:

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

maka jika semuanya baik-baik saja simpan saja field dalam meta pengguna berdasarkan peran

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
sumber
Bainternet & Milo terima kasih! Ya, maksud saya pengunjung akan mendaftar dua kali - sekali sebagai penjual dan lainnya sebagai pembeli, dengan email yang berbeda. Tapi saya perlu dua formulir pendaftaran yang terpisah karena masing-masing akan berisi bidang yang berbeda. Misalnya: formulir reg penjual akan menyertakan bidang - "nama bisnis" dan "alamat bisnis" sedangkan formulir reg pembeli akan menyertakan bidang "nama pembeli". Jadi, Bainternet, saya tidak yakin saya bisa menggunakan kode Anda sebagaimana adanya (tapi terima kasih banyak atas usahanya) karena menunjuk ke halaman yang sama hanya dengan parameter yang berbeda. Bagaimana saya bisa melakukannya dengan dua bentuk terpisah?
Ash
@ Ash: Anda masih tidak perlu dua formulir terpisah, cukup tambahkan bidang berdasarkan peran, saya akan memperbarui jawaban saya dengan contoh.
Bainternet
@ Ash: periksa pembaruan di jawabannya.
Bainternet
@ Netternet, Terima kasih banyak untuk kode tambahan!
Ash
@Bainternet: Maaf untuk pertanyaan pemula tapi itulah saya :-) - apakah kode ini hanya dapat digunakan dalam sebuah plugin atau dapatkah itu juga digunakan dalam file php yang merupakan templat untuk sebuah halaman?
Ash