web-dev-qa-db-de.com

automatische Zuweisung des Basis-Benutzernamens während der Registrierung

ich versuche, einem neuen Benutzer bei der Registrierung einen automatisch zugewiesenen, sequenzbasierten Benutzernamen (der vom Benutzer nicht bearbeitet werden kann) zuzuweisen.

ich habe einige Codes ausprobiert, aber mein Registrierungsformular ist ausgefallen.

bitte um Hilfe.

2
Pawan Kumar

Dies hängt alles davon ab, wie Benutzer auf Ihrer Website registriert werden.

TLDRMit dem folgenden Code können Sie benutzerdefinierte Benutzer aus dem Administratorbereich erstellen, indem Sie benutzerdefinierte Benutzernamen angeben, oder GENERATE_CUSTOM_SEQ_USERNAME verwenden, um fortlaufend eine Nummer zu generieren. Wenn Sie ein anderes Registrierungsformular als wp-login.php verwenden, setzen Sie user_login auf GENERATE_CUSTOM_SEQ_USERNAME und blenden Sie das Feld mit CSS aus.

Wenn sie sich über die wp-login.php-Registrierungsseite registrieren, müssen Sie zuerst ein leeres user_login-Eingabefeld zulassen:

/**
 * 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;
}

Hierzu werden die Registrierungsfehler für wp-login.php gefiltert und der empty_username entfernt.

Als nächstes benötigen Sie eine Hilfsfunktion, um den fortlaufenden Benutzernamen mit den aufgefüllten Nullen zu generieren. Diese Funktion hat eine Länge von 10 Zeichen und erhöht diese für jeden neuen Benutzer um eins. Dies stellt auch sicher, dass user_login nicht existiert, bevor es auf diesen Wert gesetzt wird.

/**
 * 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;
}

Sie müssen dann nach dem user_login filtern, der von der wp_insert_user -Funktion verarbeitet wird. Da wir zulassen, dass der wp-login.php einen leeren user_login von der register_new_user -Funktion übergibt, können wir dann prüfen, ob dieser Wert leer ist, und unseren benutzerdefinierten Wert zurückgeben.

Sie werden auch bemerken, dass ich in GENERATE_CUSTOM_SEQ_USERNAME hinzugefügt habe, um den übergebenen user_login zu überprüfen. Dies kann nützlich sein, wenn Sie das Benutzeranmeldungsfeld (in anderen Registrierungsformularen) mit CSS ausblenden und user_login generieren lassen möchten, ohne einen Fehler für einen leeren Benutzernamen auszulösen. Da dieser Benutzername technisch gesehen niemals existieren sollte, können Sie ihn einfach als Platzhalter verwenden, um zu bestimmen, ob ein Benutzername generiert werden soll.

Hiermit können Sie auch einen neuen Benutzer im Admin-Bereich erstellen und einfach GENERATE_CUSTOM_SEQ_USERNAME als Benutzernamen festlegen. Dadurch wird eine fortlaufende Nummer für Sie generiert., oder Sie erstellen eine eigene benutzerdefinierte.

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

Der nächste Schritt wäre, die zuletzt verwendete ID in der Option zu aktualisieren, jedoch erst nachdem überprüft wurde, ob der Benutzer tatsächlich erstellt wurde (und kein anderer Fehler ein Fehler beim Erstellen des Benutzers verursacht hat):

/**
 * 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;
}

Sie werden dann wahrscheinlich die Benutzeranmeldungs-Eingabe im Formular wp-login.php verstecken wollen, was Sie mit einigem einfachen CSS tun können:

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