Farklı roller için ayrı kayıt ve giriş


17

"Üyeler" eklentisini kullanarak sitem için 2 yeni rol belirledim - "satıcılar" ve "alıcılar".

Her rolün kendi kayıt sayfası ve girişi olmalıdır. Bir ziyaretçi hem alıcı hem de satıcı olarak kaydolabilir, ancak yalnızca bunlardan biri olarak oturum açabilir. Dolayısıyla, bir ziyaretçi satıcı olarak oturum açtıysa ve daha sonra alıcı sayfasına giderse, bir alıcı olarak giriş yapabilecektir ve bunu yaptığında otomatik olarak bir satıcı olarak çıkış yapacaktır.

Bana bunu yapma seçeneği verecek bir eklenti için saatlerce aradım ama bulamadım. Farklı rol kayıtlarına sahip web sitelerinde oldukça yaygın bir yapılandırma gibi görünüyor.

Bunun gibi bir eklenti var mı? Ve eğer değilse, bu nasıl yapılabilir?


1
ayrı formlara ihtiyacınız yoktur, sadece rol seçme aracı olan tek bir kayıt formuna ihtiyacınız vardır. bir role kaydolduktan sonra herkes aynı giriş sayfasını kullanabilir. Birisi alıcı olarak kaydolursa, kimlik bilgileriyle alıcıdan başka bir şey olarak giriş yapmasının bir yolu yoktur. belki bir şeyler böyle doğru yönde işaret eder.
Milo

Yanıtlar:


17

Farklı roller için iki ayrı kayıt oluşturmak kolaydır:

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

ve şimdi her bir rolü "kendi" kayıt formuna bağlayabilirsiniz:

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

ama Milo'nun yorumladığı gibi:

"Birisi alıcı olarak kaydolursa, kimlik bilgileriyle alıcıdan başka bir şey olarak giriş yapmasının bir yolu yoktur"

diğer bir rolü kaydetmek için farklı bir e-posta kullanmaları gerektiği anlamına gelir.

Güncelleme

bu, aynı rolü ancak her rol için farklı alanlarla nasıl kullanabileceğinizi gösteren bir güncellemedir.

Yani işlevleri biraz değiştirmeniz yeterlidir:

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

bu şekilde yalnızca belirli bir rolün ihtiyaç duyduğu alanlar gösterilir.

Sonra, bu ekstra alanlara bir tür doğrulama yapmak istiyorsanız, register_postörneğin kanca kullanabilirsiniz :

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

her şey yolundaysa, role göre kullanıcı meta alanlarındaki alanları kaydedin

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

Teşekkür ederim Bainternet & Milo! Evet, ziyaretçinin iki kez kaydolması gerekir - bir kez satıcı ve diğeri alıcı olarak, farklı e-postalarla. Ancak her biri farklı alanlar içereceğinden iki ayrı kayıt formuna ihtiyacım var. Örneğin: satıcının kayıt formu "işletme adı" ve "işletme adresi" alanlarını içerirken, alıcının kayıt formu "alıcı adı" alanını içerecektir. Yani, Bainternet, kodunuzu olduğu gibi kullanabileceğimden emin değilim (ancak çaba için çok teşekkürler) çünkü aynı sayfaya sadece farklı parametrelerle işaret ediyor. Bunu iki ayrı formla nasıl yapabilirim?
Ash

@Ash: Hala iki ayrı forma ihtiyacınız yok, sadece role göre alanları ekleyin, cevabımı bir örnekle güncelleyeceğim.
Bainternet

@Ash: cevaptaki güncellemeyi kontrol edin.
Bainternet

@Bainternet, Ek kod için çok teşekkürler!
Ash

@Bainternet: Acemi soru için özür dilerim ama ben bu :-) - bu kod sadece bir eklenti kullanılabilir mi yoksa aynı zamanda bir sayfa için bir şablon olan bir php dosyasında kullanılabilir?
Ash
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.