web-dev-qa-db-fra.com

Modification de la limite de nom d'utilisateur de quatre à moins de caractères

Je souhaite créer un compte utilisateur sur mon installation multi-site de Wordpress avec un nom d'utilisateur inférieur à 4 caractères. Mais comme Wordpress a une limite de noms d'utilisateurs d'au moins 4 caractères, ce message d'erreur est affiché:

Le nom d'utilisateur doit comporter au moins 4 caractères.

J'ai trouvé une solution impliquant un dossier mu-plugins dans le dossier wp-content, mais cela ne fonctionne pas. Existe-t-il un moyen qui me permettrait de créer un compte utilisateur avec un nom d'utilisateur de moins de 4 caractères?

7
Ratul

Vous pouvez filtrer 'wpmu_validate_user_signup' et vérifier si le code d'erreur correspond à l'avertissement de 4 caractères. Ensuite, désactivez le code d'erreur.

Exemple de plugin:

<?php # -*- coding: utf-8 -*-
/* Plugin Name: Allow short user names for multi site. */

add_filter( 'wpmu_validate_user_signup', 'wpse_59760_short_user_names' );

/**
 * Allow very short user names.
 *
 * @wp-hook wpmu_validate_user_signup
 * @param   array $result
 * @return  array
 */
function wpse_59760_short_user_names( $result )
{
    $error_name = $result[ 'errors' ]->get_error_message( 'user_name' );
    if ( empty ( $error_name )
        or $error_name !== __( 'Username must be at least 4 characters.' )
    )
    {
        return $result;
    }

    unset ( $result[ 'errors' ]->errors[ 'user_name' ] );
    return $result;
}
9
fuxia

Comme il peut y avoir plus d’une erreur pour les noms d’utilisateur, la réponse acceptée pourrait supprimer les erreurs que nous souhaiterions conserver. Par exemple, la saisie d’un nom d’utilisateur de 123 passerait alors qu’elle devrait toujours donner le message d’erreur 'Sorry, usernames must have letters too!'

Exemple de code modifié pour résoudre ce problème:

/* Plugin Name: Allow short user names for multi site. */

add_filter( 'wpmu_validate_user_signup', 'wpse_59760_short_user_names' );

/**
 * Allow very short user names.
 *
 * @wp-hook wpmu_validate_user_signup
 * @param   array $result
 * @return  array
 */
function wpse_59760_short_user_names( $result )
{
    $error_name = $result[ 'errors' ]->get_error_messages( 'user_name' );
    if ( empty ( $error_name ) 
        or false===$key=array_search( __( 'Username must be at least 4 characters.' ), $error_name)
    )
    {
        return $result;
    }

//  only remove the error we are disabling, leaving all others
    unset ( $result[ 'errors' ]->errors[ 'user_name' ][$key] );
/**
 *  re-sequence errors in case a non sequential array matters
 *  e.g. if a core change put this message in element 0 then get_error_message() would not behave as expected)
 */
    $result[ 'errors' ]->errors[ 'user_name' ] = array_values( $result[ 'errors' ]->errors[ 'user_name' ] );
    return $result;
}

EDIT: Cela fonctionne dans WordPress jusqu’à la version 3.9.6 et à nouveau dans la version 4.2.

Notez que cela ne fonctionne pas dans WordPress 4.0 ou 4.1 car https://core.trac.wordpress.org/ticket/22234 fait des erreurs une variable privée. Bien qu'une méthode magique __get ait été fournie "pour assurer la compatibilité ascendante", elle renvoie pour les tableaux une copie d'un tableau (et non une référence à l'original) qui n'est alors pas éditable. Si vous avez activé WP_DEBUG, vous obtiendrez un PHP Notice indiquant "Avis: Une modification indirecte de la propriété surchargée WP_Error :: $ errors n'aura aucun effet dans/chemin/vers/plugin sur la ligne xxx", sinon le code échoue en silence et n'a aucun effet.

Cela fonctionne à nouveau dans la version 4.2 parce que https://core.trac.wordpress.org/ticket/30891 a annulé le changement pour WP_Error et un certain nombre d’autres emplacements dans le noyau, bien que ce code ne fonctionne pas.

Pour WordPress> = 4.1 qui nous a donné une méthode de suppression, cela fonctionne également:

function wpse_59760_short_user_names( $result )
{
    $error_name = $result[ 'errors' ]->get_error_messages( 'user_name' );
    if ( empty ( $error_name ) 
        or false===$key=array_search( __( 'Username must be at least 4 characters.' ), $error_name)
    )
    {
        return $result;
    }

    // remember any error data
    $data = $result[ 'errors' ]->get_error_data( 'user_name' );

    // remove all user name errors
    $result[ 'errors' ]->remove( 'user_name' );

    // add back in any other user name errors we want to keep
    foreach ( $error_name as $index=>$message ) {
        if ( $index !== $key ) 
            $result[ 'errors' ]->add( 'user_name', $message );
    }

    // restore any user_name error data that was present
    if ( !empty( $data ) ) 
        $result[ 'errors' ]->add_data( $data, 'user_name' );

    return $result;
}
3
itinerant