Hello there.
WooCommerce has already had that feature. Go to WooCommerce > Settings > Accounts. In “Account Creation” option, uncheck “Automatically generate username from customer email“. See this screenshot.
Thread Starter
SJF
(@sjf)
Kharis – thank you for your reply — however it is already unchecked.
The issue is not that the username is automatically created based on the email, but rather the username is not being validated upon account creation.
Let me give you an example. Let’s say there is an account that exists with the username JohnDoe, and uses the email address John@Doe.com — when a user registers on the site and puts their username as anything, but the email as John@Doe.com – it will say there is a user with that email already.
However, in this case, if a user tries registering their username as JohnDoe, with a different email (even though the username exists) it allows it, and appends a number at the end (in this case, the number 1, making it JohnDoe1 – and the numbers count upwards as more users create accounts with the same username).
Thread Starter
SJF
(@sjf)
is there not a fix for this? We just need to know how to proceed. If there is not a fix for this, then perhaps we need to allow username generation from email, and then forget custom usernames – but we would prefer to have the ability to validate usernames like emails already have.
Hello SJF,
Sorry for the late reply.
Try to use this function on your theme’s functions.php file
add_filter('woocommerce_new_customer_data', 'risbl_custom_customer_data', 10 );
function risbl_custom_customer_data() {
$username = $_POST['username'];
$password = $_POST['password'];
$email = $_POST['email'];
// Check the e-mail address
if ( empty( $email ) || ! is_email( $email ) ) {
return new WP_Error( 'registration-error', __( 'Please provide a valid email address.', 'woocommerce' ) );
}
if ( email_exists( $email ) ) {
return new WP_Error( 'registration-error', __( 'An account is already registered with your email address. Please login.', 'woocommerce' ) );
}
// Handle username creation
$username = sanitize_user( $username );
if ( empty( $username ) || ! validate_username( $username ) ) {
return new WP_Error( 'registration-error', __( 'Please enter a valid account username.', 'woocommerce' ) );
}
// Check username
// Display alert message if username has already existed
if ( username_exists( $username ) ) {
return new WP_Error( 'registration-error', __( 'An account is already registered with that username. Please choose another.', 'woocommerce' ) );
}
$customer_data = array(
'user_login' => $username,
'user_pass' => $password,
'user_email' => $email,
'role' => 'customer'
);
return $customer_data;
}
Let me know how it works for you.
Cheers!
Thread Starter
SJF
(@sjf)
Kharis — you are a God among men! THANK YOU!
No, I am just an ordinary man. 😀
Glad to hear that the code works for you.
Happy creating with WooCommerce.
Cheers!