in web/wp-content/plugins/acf-extended/includes/modules/form/module-form-action-user.php [635:777]
function insert_user($form, $action){
$args = array();
$save = $action['save'];
$user_id = (int) acf_extract_var($save, 'target');
// update user
if($action['type'] === 'update_user'){
// stop action
if(!$user_id){
return false;
}
// set user to update
$args['ID'] = $user_id;
}
// construct user arguments
foreach($save as $user_field => $value){
// name, slug, taxonomy, parent etc...
if(in_array($user_field, $this->fields) && !acf_is_empty($value)){
$args[ $user_field ] = $value;
}
}
// filters
$args = apply_filters("acfe/form/submit_user_args", $args, $form, $action);
$args = apply_filters("acfe/form/submit_user_args/form={$form['name']}", $args, $form, $action);
$args = apply_filters("acfe/form/submit_user_args/action={$action['name']}", $args, $form, $action);
// bail early
if($args === false){
return false;
}
// switch action type
switch($action['type']){
// insert user
case 'insert_user':{
// fallback for empty password
// this should exist, but can be manually deleted within filter above
// and throw a notice
if(!isset($args['user_pass'])){
$args['user_pass'] = '';
}
// insert user
$user_id = wp_insert_user($args);
// validate
if(!$user_id || is_wp_error($user_id)){
return false;
}
// log user once created
if($action['save']['log_user']){
// catch auth setcookie
// and assign $_COOKIE so we don't need to reload the page
add_action('set_auth_cookie', array($this, 'set_auth_cookie'));
add_action('set_logged_in_cookie', array($this, 'set_logged_in_cookie'));
wp_clear_auth_cookie();
wp_set_current_user($user_id);
wp_set_auth_cookie($user_id);
remove_action('set_auth_cookie', array($this, 'set_auth_cookie'));
remove_action('set_logged_in_cookie', array($this, 'set_logged_in_cookie'));
}
break;
}
// update user
case 'update_user':{
// update user
$user_id = wp_update_user($args);
// validate
if(!$user_id || is_wp_error($user_id)){
return false;
}
// manually update login & nicename
// we must use $wpdb->update() here because WP doesn't allow to change user login
if(!empty($args['user_login']) && $args['user_login'] !== get_userdata($user_id)->user_login){
// user_login is already sanitized in setup_action()
// prepare nicename
$user_nicename = mb_substr($args['user_login'], 0, 50); // max 50 chars
$user_nicename = sanitize_title($user_nicename);
$user_nicename = apply_filters('pre_user_nicename', $user_nicename);
// global wpdb
global $wpdb;
// manual update
// this logout the user (because user_login is changed)
$wpdb->update($wpdb->users,
array(
'user_login' => $args['user_login'], // login
'user_nicename' => $user_nicename, // url
),
array(
'ID' => $user_id
)
);
// we must re-log the user
// catch auth setcookie
// and assign $_COOKIE so we don't need to reload the page
add_action('set_auth_cookie', array($this, 'set_auth_cookie'));
add_action('set_logged_in_cookie', array($this, 'set_logged_in_cookie'));
// we must clear cache since the user is updated above
clean_user_cache($user_id);
wp_clear_auth_cookie();
wp_set_current_user($user_id);
wp_set_auth_cookie($user_id);
remove_action('set_auth_cookie', array($this, 'set_auth_cookie'));
remove_action('set_logged_in_cookie', array($this, 'set_logged_in_cookie'));
}
break;
}
}
return array(
'user_id' => $user_id,
'args' => $args
);
}