Skip to content
Advertisement

User Role Select on Woocommerce Registration Stopped Working

I use a drop down menu to select between two user roles on my Woocommerce registration form. After updating to Woocommerce 3.0.8 the drop down menu stopped working and I cannot figure out why. Below is the code I’ve been using. Any ideas?

// Add two new roles.
add_role('dealer', 'Dealer', array( 
'delete_posts' => false,
'delete_published_posts' => false,
'edit_posts' => false,
'edit_published_posts' => false,
'publish_posts' => false,
'read' => true,
'upload_files' => true,
'edit_users' => false
));
add_role('distributor', 'Distributor', array(
'delete_posts' => false,
'delete_published_posts' => false,
'edit_posts' => false,
'edit_published_posts' => false,
'publish_posts' => false,
'read' => true,
'upload_files' => true,
'edit_users' => false
));
add_action('register_form','role_registration_form');
function role_registration_form(){
$wp_roles = new WP_Roles();
$wp_roles->use_db = true;
$role_names = $wp_roles->get_names();

foreach( $role_names as $role_name ) {
    // Ensure that the options exclude default WordPress roles
    if ( ($role_name !== 'Administrator') and ($role_name !== 'Editor') and ($role_name !== 'Author') and ($role_name !== 'Contributor' ) and ($role_name !== 'Subscriber') and ($role_name !== 'Customer') and ($role_name !== 'Shop Manager')) {
        //  Role value below needs to be in lowercase only
        $role_option .= "<option value='".strtolower($role_name)."'>";
        $role_option .= $role_name;
        $role_option .= "</option>";
    }
}
$html = '
<style type="text/css">
        #role {
        background:#FBFBFB none repeat scroll 0 0;
        border:1px solid #E5E5E5;
        font-size:15px;
                    color:#3a3a3a;
        margin-bottom:16px;
        margin-right:6px;
        margin-top:2px;
        padding:3px;
        width:35%;
    }
</style>

<div width="100%">
    <p>
        <label style="display: block; margin-bottom: 5px;">' . __('Are you a Dealer or Distributor?', 'Role') . '
            <select id="role" name="role" class="input">
            ' . $role_option . '
            </select>
        </label>
    </p>
</div>
';
echo $html;
}
add_action('user_register', 'register_role');
function register_role($user_id, $password="", $meta=array()) {
$userdata = array();
$userdata['ID'] = $user_id;
$userdata['role'] = $_POST['role'];
// allow if a role is selected
if ( $userdata['role'] ){
  wp_update_user($userdata);
}
}
add_action( 'show_user_profile', 'role_selection_field' );
add_action( 'edit_user_profile', 'role_selection_field' );
function role_selection_field( $user ) {
$wp_roles = new WP_Roles();
$wp_roles->use_db = true;
$role_names = $wp_roles->get_names();
foreach( $role_names as $role_name ) {
    if ( ($role_name !== 'Administrator') and ($role_name !== 'Editor') and ($role_name !== 'Author') and ($role_name !== 'Contributor' ) and ($role_name !== 'Subscriber') and ($role_name !== 'Customer') and ($role_name !== 'Shop Manager')) {
        if ( !empty( $user->roles ) && is_array( $user->roles ) ) {
            foreach ( $user->roles as $role ) {         
                if ( strtolower($role_name) == $role ) {
                    $role_option .= "<option value='".strtolower($role_name)."' selected='selected'>";
                    $currentrole = strtolower($role_name);
                } else {
                    $role_option .= "<option value='".strtolower($role_name)."'>";
                }

                $role_option .= $role_name;
                $role_option .= "</option>";
            }
        }
    }
}
?>

<?php }

add_action( 'personal_options_update', 'save_role_selection_field' );
add_action( 'edit_user_profile_update', 'save_role_selection_field' );
function save_role_selection_field( $user_id ) {
//if ( !current_user_can( 'edit_user', $user_id ) ) { return false; }
update_user_meta( $user_id, 'role', $_POST['role'] );

$user = new WP_User( $user_id );
// Remove role
$current_user_role = get_current_user_role();

$user->remove_role( $current_user_role );
// Add role
$user->add_role( $_POST['role'] );
}
function get_current_user_role () {
global $current_user;
get_currentuserinfo();
$user_roles = $current_user->roles;
$user_role = array_shift($user_roles);
return $user_role;
};

?>

Advertisement

Answer

I decided to scrap the old code and replaced it with the following code and it works now.

/* 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( 'Dealer or Distributor', 'woocommerce' ); ?></label>
    <select class="input-text" name="role" id="reg_role"> 
    <option <?php if ( ! empty( $_POST['role'] ) && $_POST['role'] == 'dealer') esc_attr_e( 'selected' ); ?> value="dealer">Dealer</option> 
    <option <?php if ( ! empty( $_POST['role'] ) && $_POST['role'] == 'distributor') esc_attr_e( 'selected' ); ?> value="distributor">Distributor</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', __('Dealer or Distributor is 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');
User contributions licensed under: CC BY-SA
9 People found this is helpful
Advertisement