Woocommerce注册中的其他用户角色选择字段

时间:2018-03-01 15:33:42

标签: php wordpress woocommerce user-roles user-registration

WooCommerce注册表单中需要用户角色选择。用户应该有一个下拉菜单,可以选择" customer"和"经销商" (ID)wordpress角色。不幸的是,我尝试组装代码失败了。

以下代码未指定所选角色,而且我被卡住了。注册用户仍然可以获得默认角色"客户"虽然"经销商"被选中了。

我已经更改the code from this answer(我不知道此代码是否正常工作)

我做错了什么?

我正在使用的代码:

/* To add WooCommerce registration form custom fields. */

function WC_extra_registation_fields() {?>
<p class="form-row form-row-first">
    <label for="reg_role"><?php _e( 'Privat or commercial?', 'woocommerce' ); ?></label>
    <select class="input-text" name="role" id="reg_role"> 
    <option <?php if ( ! empty( $_POST['role'] ) && $_POST['role'] == 'customer') esc_attr_e( 'selected' ); ?> value="customer">private</option> 
    <option <?php if ( ! empty( $_POST['role'] ) && $_POST['role'] == 'reseller') esc_attr_e( 'selected' ); ?> value="reseller">commercial</option>
    </select> 
</p>

<?php
}

add_action( 'woocommerce_register_form', 'WC_extra_registation_fields');


/* To validate WooCommerce registration form custom fields.  */
function WC_validate_reg_form_fields($username, $email, $validation_errors) {
if (isset($_POST['role']) && empty($_POST['role']) ) {
    $validation_errors->add('role_error', __('Role required!', 'woocommerce'));
}

return $validation_errors;
}

add_action('woocommerce_register_post', 'WC_validate_reg_form_fields', 10, 3);


/* To save WooCommerce registration form custom fields. */
function WC_save_registration_form_fields($customer_id) {

//Role field
if (isset($_POST['role'])) {
    update_user_meta($customer_id, 'role', sanitize_text_field($_POST['role']));
}

}

add_action('woocommerce_created_customer', 'WC_save_registration_form_fields');

2 个答案:

答案 0 :(得分:4)

  

用户角色&#34;经销商&#34;需要在Wordpress中首先创建。这可以使用代码或by a plugin完成,但这不是此问题/答案的目的。

用户角色使用wp_usermeta meta_keywp_capabilities表中注册了一组值,因为用户可以拥有许多用户角色。

在Woocommerce注册中,用户无论如何都会注册'customer'用户角色。因此您只需对'reseller'选项进行更改。

此时你可以做两件事:

  • 案例1 - 从&#39;客户&#39;更改用户角色到经销商&#39;
  • 案例2 - 添加到客户用户角色,&#39;经销商&#39;用户角色

所以你的代码将是:

add_action( 'woocommerce_register_form', 'wc_extra_registation_fields' );
function wc_extra_registation_fields() {
    ?>
        <p class="form-row form-row-first">
            <label for="reg_role"><?php _e( 'Privat or commercial?', 'woocommerce' ); ?></label>
            <select class="input-text" name="role" id="reg_role">
            <option <?php if ( ! empty( $_POST['role'] ) && $_POST['role'] == 'customer') esc_attr_e( 'selected' ); ?> value="customer">private</option>
            <option <?php if ( ! empty( $_POST['role'] ) && $_POST['role'] == 'reseller') esc_attr_e( 'selected' ); ?> value="reseller">commercial</option>
            </select>
        </p>
    <?php
}

// Validate WooCommerce registration form custom fields.
add_action( 'woocommerce_register_post', 'wc_validate_reg_form_fields', 10, 3 );
function wc_validate_reg_form_fields($username, $email, $validation_errors) {
    if (isset($_POST['role']) && empty($_POST['role']) ) {
        $validation_errors->add('role_error', __('Role required!', 'woocommerce'));
    }
    return $validation_errors;
}

你将添加这个:

CASE 1

// To save WooCommerce registration form custom fields.
add_action( 'woocommerce_created_customer', 'wc_save_registration_form_fields' );
function wc_save_registration_form_fields( $customer_id ) {
    if ( isset($_POST['role']) ) {
        if( $_POST['role'] == 'reseller' ){
            $user = new WP_User($customer_id);
            $user->set_role('reseller');
        }
    }
}

因此,在数据库中正确注册(因为它应该是Wordpress可读,但仅当用户角色&#34;经销商&#34;存在时):

enter image description here

CASE 2

// To save WooCommerce registration form custom fields.
add_action( 'woocommerce_created_customer', 'wc_save_registration_form_fields' );
function wc_save_registration_form_fields( $customer_id ) {
    if ( isset($_POST['role']) ) {
        if( $_POST['role'] == 'reseller' ){
            $user = new WP_User($customer_id);
            $user->add_role('reseller');
        }
    }
}

因此,在数据库中正确注册(因为它应该是Wordpress可读,但仅当用户角色&#34;经销商&#34;存在时):

enter image description here

代码进入活动子主题(或主题)的function.php文件。经过测试并正常工作。

如果我在注册用户后使用以下代码:

$user_roles = wp_get_current_user()->roles;
print_r($user_roles);

我得到这个显示:

  • 案例1:Array ( [0] => reseller )
  • 案例2:Array ( [0] => customer [1] => reseller )

您肯定需要使用User Role Editor之类的插件(如果尚未完成)来创建和定义&#34;经销商&#34; 用户角色的功能...... < / p>

答案 1 :(得分:0)

您可以使用此插件自动执行所有操作。 https://wordpress.org/plugins/user-drop-down-roles-in-registration/

安装它,会有一个名为 - &#34;添加用户角色&#34;

的菜单项

进入它,移动您希望客户能够选择的所有角色:

enter image description here

按下提交后,您的选择将被保存,您的注册页面将如下所示:

enter image description here

编辑:你在PHP中需要这个吗?这种方式更容易......