Woocommerce 注册中的附加用户角色选择字段

Posted

技术标签:

【中文标题】Woocommerce 注册中的附加用户角色选择字段【英文标题】:Additional user role select field in Woocommerce registration 【发布时间】:2018-08-09 17:27:16 【问题描述】:

.

需要在 WooCommerce 注册表单中选择用户角色。用户应该有一个下拉菜单可以在“客户”和“经销商”(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');

【问题讨论】:

【参考方案1】:

需要先在 Wordpress 中创建用户角色“经销商”。这可以通过代码或by a plugin 完成,但这不是本问题/答案的目的。

用户角色在wp_usermeta 表中注册,使用meta_key wp_capabilities 作为一组值,因为一个用户可以有多个用户角色。

在 Woocommerce 注册中,用户无论如何都会使用 'customer' 用户角色注册。所以您只需要对'reseller'choice 进行更改

此时你可以做两件事:

案例 1 - 将用户角色从“客户”更改为“经销商” 案例 2 - 添加到客户用户角色,即“经销商”用户角色

所以你的代码将是:

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;

你将添加这个:

对于案例 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 读取,但前提是用户角色“经销商”存在):

或者对于案例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 读取,但前提是用户角色“经销商”存在):

代码进入您的活动子主题(或主题)的 function.php 文件中。经过测试并且可以工作。


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

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

我得到了这个显示:

对于案例 1:Array ( [0] =&gt; reseller ) 对于案例 2:Array ( [0] =&gt; customer [1] =&gt; reseller )

您肯定需要使用像User Role Editor 这样的插件(如果尚未完成)来创建和定义您的“经销商” 用户角色的功能……

【讨论】:

感谢您的合格回答。 I tested both cases and they end in "no role" when reseller is choosen.私人作品。有什么想法吗? 指定:“无角色”表示-此站点无角色- @John 抱歉,我已经更新了……它已经过测试并且可以工作。这次数据正确地存储在数据库中,对于这两种情况。 再次感谢。不幸的是,当现在选择经销商时,这两种情况都会导致角色“客户”。我认为,您的上一个版本使 meta_value a:1:i:0;s:8:"reseller"; 这个值无法被 wordpress 解释。如果我在后端设置角色手册,它是 a:1:s:8:"reseller";b:1; 知道了!我可以使用您以前的代码来存储元密钥并对其进行插件搜索以设置正确的角色。非常感谢

以上是关于Woocommerce 注册中的附加用户角色选择字段的主要内容,如果未能解决你的问题,请参考以下文章

WooCommerce 根据用户角色更改 BACS 订单状态

为 Woocommerce 中的特定用户角色自定义我的帐户新菜单项

根据 Woocommerce 中的用户角色更改 COD 支付网关的默认订单状态

Woocommerce 中特定支付网关的结帐附加字段

根据 WooCommerce 3+ 中的用户角色添加自定义我的帐户菜单项

从 WooCommerce 的“客户”角色中隐藏我的帐户中的帐户资金充值