web-dev-qa-db-fra.com

attribution automatique du nom d'utilisateur de la base de la séquence lors de l'inscription

j'essaie d'obtenir un nouvel utilisateur avec un nom d'utilisateur basé sur une séquence attribuée automatiquement (non modifiable par l'utilisateur) lors de son inscription.

donc ça va commencer à partir de 0000000001 et ainsi de suite, j'ai essayé certains codes mais mon formulaire d'inscription est tombé.

demande d'aide.

2
Pawan Kumar

Tout dépend de la manière dont les utilisateurs sont enregistrés sur votre site.

TLDRLe code ci-dessous vous permet de créer des utilisateurs personnalisés à partir de la zone d'administration en spécifiant des noms d'utilisateur personnalisés, ou d'utiliser GENERATE_CUSTOM_SEQ_USERNAME pour générer un numéro séquentiel. Si vous utilisez un formulaire d'inscription autre que wp-login.php, définissez simplement user_login sur GENERATE_CUSTOM_SEQ_USERNAME et masquez le champ à l'aide de CSS.

S'ils s'enregistrent via la page d'enregistrement wp-login.php, vous devez d'abord autoriser le champ de saisie user_login vide:

/**
 * Filters the errors encountered when a new user is being registered.
 *
 * The filtered WP_Error object may, for example, contain errors for an invalid
 * or existing username or email address. A WP_Error object should always returned,
 * but may or may not contain errors.
 *
 * If any errors are present in $errors, this will abort the user's registration.
 *
 * @since 2.1.0
 *
 * @param WP_Error $errors               A WP_Error object containing any errors encountered
 *                                       during registration.
 * @param string   $sanitized_user_login User's username after it has been sanitized.
 * @param string   $user_email           User's email.
 */
add_filter( 'registration_errors', 'smyles_allow_wp_login_register_empty_user_login', 9999, 3 );

/**
 * Allow empty user_login (username) from wp-login.php registration form
 *
 *
 * @since @@version
 *
 * @param $errors WP_Error
 * @param $sanitized_user_login
 * @param $user_email
 *
 * @return mixed
 */
function smyles_allow_wp_login_register_empty_user_login( $errors, $sanitized_user_login, $user_email ){

    // First remove empty_username error code to make sure there aren't any other errors
    $errors->remove( 'empty_username' );
    $error_codes = $errors->get_error_codes();

    // Return errors and don't process further (we only want to proceed when empty_username is only error code)
    if( ! empty( $error_codes ) ){
        return $errors;
    }

    return $errors;
}

Pour ce faire, vous devez filtrer les erreurs d’enregistrement pour wp-login.php et supprimer le empty_username.

Ensuite, vous aurez besoin d’une fonction d’aide pour générer le nom d’utilisateur séquentiel, avec les zéros remplis. Cette fonction utilise une longueur de 10 caractères, en l'augmentant d'un pour chaque nouvel utilisateur. Cela vérifie également que le user_login n'existe pas avant de le définir à cette valeur.

/**
 * Generate sequential padded user_login
 *
 * @author Myles McNamara
 *
 * @return string
 */
function smyles_generate_next_seq_user_login(){

    // Use 0 as default (if option does not exist yet), as 1 will be used for first user
    $last_user_num = get_option( 'smyles_custom_seq_usernames_last_id', 0 );

    // Create padded username total length of 10 characters, increasing last ID by 1
    $gen_user_login = str_pad( (int) $last_user_num + 1, 10, 0, STR_PAD_LEFT );

    if( username_exists( $gen_user_login ) ){
        // If generated new user login exists, update our last id +1 and do recursive call
        update_option( 'smyles_custom_seq_usernames_last_id', (int) $last_user_num + 1 );
        return smyles_generate_next_seq_user_login();
    }

    return $gen_user_login;
}

Vous devrez ensuite filtrer sur le user_login géré par la fonction wp_insert_user. Puisque nous autorisons le wp-login.php à transmettre un user_login vide à partir de la fonction register_new_user, nous pouvons alors vérifier si cette valeur est vide et renvoyer notre valeur générée personnalisée.

Vous remarquerez également que j'ai ajouté dans GENERATE_CUSTOM_SEQ_USERNAME pour vérifier passé user_login, cela peut être utile si vous souhaitez utiliser CSS pour masquer le champ de connexion de l'utilisateur (dans tout autre formulaire d'inscription) et le faire générer user_login sans générer d'erreur pour un nom d'utilisateur vide. Comme ce nom d'utilisateur ne devrait techniquement jamais exister, vous pouvez simplement l'utiliser comme espace réservé pour déterminer si un nom d'utilisateur doit être généré.

Cela vous permet également de créer un nouvel utilisateur dans la zone d'administration et de définir simplement GENERATE_CUSTOM_SEQ_USERNAME en tant que nom d'utilisateur. Il générera un numéro séquentiel pour vous, ou créez votre propre compte personnalisé.

add_filter( 'pre_user_login', 'smyles_custom_username_seq_pre_user_login' );

/**
 * Set user_login to generated value, only if passed value is empty
 *
 * @author Myles McNamara
 *
 * @param $sanitized_user_login
 *
 * @return string
 */
function smyles_custom_username_seq_pre_user_login( $sanitized_user_login ){

    $sanitized_user_login = trim( $sanitized_user_login ); // to match wp_insert_user handling

    /**
     * The user_login should be empty string when creating from wp-login.php registration page,
     * otherwise will contain a value when called by something else.
     *
     * There is a chance this will be called for updating a user (which is incorrect as wp_update_user should be called),
     * but even when updating a user, the passed user_login should have some type of value.
     */
    if( empty( $sanitized_user_login ) || $sanitized_user_login === 'GENERATE_CUSTOM_SEQ_USERNAME' ){
        $sanitized_user_login = smyles_generate_next_seq_user_login();
    }

    return $sanitized_user_login;
}

L'étape suivante consiste à mettre à jour le dernier ID utilisé dans l'option, mais uniquement après avoir vérifié que l'utilisateur a bien été créé (et qu'aucune autre erreur n'a provoqué un échec lors de la création de l'utilisateur):

/**
 * Filters a user's meta values and keys immediately after the user is created or updated
 * and before any user meta is inserted or updated.
 *
 * Does not include contact methods. These are added using `wp_get_user_contact_methods( $user )`.
 *
 * @since 4.4.0
 *
 * @param array   $meta                 {
 *                                      Default meta values and keys for the user.
 *
 * @type string   $nickname             The user's nickname. Default is the user's username.
 * @type string   $first_name           The user's first name.
 * @type string   $last_name            The user's last name.
 * @type string   $description          The user's description.
 * @type bool     $rich_editing         Whether to enable the rich-editor for the user. False if not empty.
 * @type bool     $syntax_highlighting  Whether to enable the rich code editor for the user. False if not empty.
 * @type bool     $comment_shortcuts    Whether to enable keyboard shortcuts for the user. Default false.
 * @type string   $admin_color          The color scheme for a user's admin screen. Default 'fresh'.
 * @type int|bool $use_ssl              Whether to force SSL on the user's admin area. 0|false if SSL is
 *                                          not forced.
 * @type bool     $show_admin_bar_front Whether to show the admin bar on the front end for the user.
 *                                          Default true.
 * }
 *
 * @param WP_User $user                 User object.
 * @param bool    $update               Whether the user is being updated rather than created.
 */
add_filter( 'insert_user_meta', 'smyles_custom_username_seq_verify', 10, 3 );

/**
 * Verify user was created, and then increase option value
 *
 *
 * @author Myles McNamara
 *
 * @param $meta
 * @param $user WP_User
 * @param $update
 *
 * @return mixed
 */
function smyles_custom_username_seq_verify( $meta, $user, $update ){

    // Don't want to verify if this is just an update call
    if( ! $update && $user && $user->user_login ){

        // Check what the last user num was stored as
        $last_user_num = get_option( 'smyles_custom_seq_usernames_last_id', 0 );

        // Verify that user_login of the user that was created, matches what is supposed to be the next user_login
        if( (int) $last_user_num + 1 === (int) $user->user_login ){
            // Update our option after verification
            update_option( 'smyles_custom_seq_usernames_last_id', (int) $user->user_login ); // Type casting to int causes 0000000001 to be 1 (trim leading zeros)
        }

    }

    return $meta;
}

Vous voudrez probablement alors masquer l'entrée userlogin sur le formulaire wp-login.php, ce que vous pouvez faire avec quelques CSS simples:

add_action( 'register_form', 'smyles_hide_wp_login_username_field' );

function smyles_hide_wp_login_username_field(){

    // Hide the first <p> element in registerform, which is the userlogin input
    echo '<style>#registerform p:first-of-type { display: none; }</style>';

}

https://Gist.github.com/tripflex/1acacc19467122cdb1171a5e0b7300dd

1
sMyles