Saltar navegación

[Resuelto] Auto generate username from form fields

Este hilo está resuelto. Aquí tiene una descripción del problema y la solución.

Problem:

I have a user registration form, I'd like the generated username to be in the form:
company-firstname-lastname

Solution:

It needs custom codes, see example here:

https://toolset.com/forums/topic/auto-generate-username-from-form-fields/#post-1258333

Relevant Documentation:

https://toolset.com/documentation/programmer-reference/cred-api/#cred_save_data

This support ticket is created hace 5 años, 6 meses. There's a good chance that you are reading advice that it now obsolete.

This is the technical support forum for Toolset - a suite of plugins for developing WordPress sites without writing PHP.

Everyone can read this forum, but only Toolset clients can post in it. Toolset support works 6 days per week, 19 hours per day.

Sun Mon Tue Wed Thu Fri Sat
- 9:00 – 13:00 9:00 – 13:00 9:00 – 13:00 9:00 – 13:00 9:00 – 13:00 -
- 14:00 – 18:00 14:00 – 18:00 14:00 – 18:00 14:00 – 18:00 14:00 – 18:00 -

Supporter timezone: Asia/Hong_Kong (GMT+08:00)

Este tema contiene 9 respuestas, tiene 2 mensajes.

Última actualización por Tim Elliott hace 5 años, 6 meses.

Asistido por: Luo Yang.

Autor
Mensajes
#1256469

Hi Support Team,

I have a user registration form:
enlace oculto

I'd like the username it generates to be a specific format. Other fields in the form are:
Email
First Name
Last Name
Company

I'd like the generated username to be in the form:
company-firstname-lastname

Is this possible using cred forms?

I've tried to use jQuery in the form as follows:

jQuery(document).ready(function(){
    var company = document.getElementById("cred_user_form_48232_2-textfield-5-1559428536").value;        
    var fname   = document.getElementById("cred_user_form_48232_2-textfield-3-1559428536").value;
    var lname   = document.getElementById("cred_user_form_48232_2-textfield-4-1559428536").value;
    document.getElementById("cred_user_form_48232_2-textfield-1-1559428536").value = company + "-" + fname + "-" + lname ;

    jQuery("#cred_user_form_48232_2-textfield-5-1559428536, #cred_user_form_48232_2-textfield-3-1559428536, #cred_user_form_48232_2-textfield-4-1559428536").change(function(){
        company = document.getElementById("cred_user_form_48232_2-textfield-5-1559428536").value;        
        fname   = document.getElementById("cred_user_form_48232_2-textfield-3-1559428536").value;
        lname   = document.getElementById("cred_user_form_48232_2-textfield-4-1559428536").value;
        document.getElementById("cred_user_form_48232_2-textfield-1-1559428536").value = company + "-" + fname + "-" + lname ;
  });
});

But
1 - this causes other jQuery items on the page not to load
2 - the last part of the id (1559428536) changes every time I save the form so the id isn't ever right.

If you have a way to make this work it would be much appreciated.

Thanks
Tim

#1257477

I've received an notification of a reply by email, but the reply isn't showing up in here. I can follow use the email for my solution but it seems like there's a bug in the support system you might want to look at.

#1257819

Hello,

I remember I have answered this ticket yesterday:
Using Form API action hook cred_save_data to update the user's login name with PHP codes.
https://toolset.com/documentation/programmer-reference/cred-api/#cred_save_data
https://wordpress.stackexchange.com/questions/103504/how-to-programatically-change-username-user-login

It seems to be a mistake that the answer was trashed and lost, sorry for the inconvenience, please let me know if you need more assistance for it. thanks

#1257949

Thanks for your help. FYI your original reply was:

In your case, it needs custom codes, for example:
1) When user submit the user form for creating user, you can use action hook cred_save_data to trigger a custom PHP function

2) In this PHP function, get all those three custom user field values:
- Email
- First Name
- Last Name
- Company
https://developer.wordpress.org/reference/functions/get_user_meta/

Generate the new user username, and update the database:
https://codex.wordpress.org/Function_Reference/wp_update_user
user_login A string that contains the user's username for logging in. Please note that the function cannot alter this field, since WordPress does not allow usernames to be changed.

#1257959

There is a mistake in above answer, you need to setup custom PHP codes to update the user login name, see the thread link I mentioned above:
https://wordpress.stackexchange.com/questions/103504/how-to-programatically-change-username-user-login

For your reference.

#1257961

I've tried to make this update the nickname as follows:

add_action('cred_save_data', 'my_save_data_action',10,2);
function my_save_data_action($new_user_id, $form_data)
{
    // if a specific form
    if ($form_data['id']==48232)
    {
		$usercompany = get_post_meta($new_user_id, 'wpcf-user-company', true);
        if(isset($_POST['first_name']) && isset($_POST['last_name'])){
            update_user_meta( $new_user_id, 'nickname', $usercompany."-".$_POST['first_name']."-".$_POST['last_name']);
        }
    }
}

The usercompany is not coming through into the nickname though so I end up with -firstname-lastname
I guess there's something wrong with my get_post_meta line.

My other problem is that I wanted to make this update the username but the WordPress codex says:
user_login A string that contains the user's username for logging in. Please note that the function (wp_update_user) cannot alter this field, since WordPress does not allow usernames to be changed.

That was one reason I was trying to do it with jQuery on the frontend prior to form submission.

I might be able to utilize the nickname instead but would prefer to set the username if possible.

#1257975

Right, I was still writing my answer when you answered the previous...
So I see that should be a solution to updating the username - I'll give it a try.

So can you just help on the reason the user_company field isn't getting passed into the $usercompany variable.

#1257977

It's going to be user get_user_meta instead of get_post_meta isn't it...

#1257983

Yes, you are right, since it is a WordPress user field, you need to use get_user_meta function:
https://developer.wordpress.org/reference/functions/get_user_meta/

#1258333

My issue is resolved now. Thanks for your help.

The final function I now have in my child theme functions.php is

/* Registration form - Set the Username and Nickname to company-firstname-lastname */
add_action('cred_save_data', 'my_save_data_action',10,2);
function my_save_data_action($new_user_id, $form_data)
{
    // if a specific form
    if ($form_data['id']==48232)
    {
        if(isset($_POST['first_name']) && isset($_POST['last_name'])){
			$first_name = sanitize_text_field($_POST['first_name']);
			$last_name = sanitize_text_field($_POST['last_name']);
			$usercompany = sanitize_text_field(get_user_meta($new_user_id, 'wpcf-user-company', true));
			
            $my_nickname = $usercompany . "-" . $first_name . "-" . $last_name;
			$my_username = strtolower($my_nickname);
			
			update_user_meta( $new_user_id, 'nickname', $my_nickname);
			global $wpdb;
			$wpdb->update($wpdb->users, array('user_login' => $my_username), array('ID' => $new_user_id));
        }
    }
}