function insert_user()

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
        );
        
    }