web-dev-qa-db-ja.com

ユーザー名の文字数制限を4文字以下に変更する

Wordpressのマルチサイトインストールで、4文字以下のユーザー名でユーザーアカウントを作成したいです。しかし、Wordpressには最低4文字のユーザー名の制限があるので、このエラーメッセージが表示されます。

ユーザー名は4文字以上にする必要があります。

Wp-contentフォルダにmu-pluginsフォルダを含む解決策を見つけましたが、うまくいきません。ユーザー名が4文字未満のユーザーアカウントを作成する方法はありますか。

7
Ratul

'wpmu_validate_user_signup'をフィルタリングして、エラーコードが4文字の警告と一致するかどうかを確認できます。それからエラーコードの設定を解除してください。

サンプルプラグイン

<?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

ユーザー名には複数のエラーがある可能性があるため、承認された回答では保持したいエラーを削除できます。たとえば、123というユーザー名を入力してもパスするようになりましたが、おそらくエラーメッセージ'Sorry, usernames must have letters too!'が表示されるはずです。

これを修正するためにサンプルコードを修正しました:

/* 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 _ :これはWordPressのバージョン3.9.6までで、4.2でも機能します。

https://core.trac.wordpress.org/ticket/22234 がエラーをプライベート変数にしているため、これはWordPress 4.0または4.1では機能しません。魔法の__getメソッドは "後方互換性のために"提供されていましたが、配列の場合は(元の参照ではなく)配列のコピーを返しますが、これは編集できません。 WP_DEBUGを有効にしている場合は、[注意:オーバーロードされたプロパティWP_Error :: $ errorsの間接的な変更はxxx行の/ path/to/pluginには影響しません]というPHP通知が表示されます。効果はありません。

https://core.trac.wordpress.org/ticket/30891 はWP_Errorと他の多くの場所への変更を元に戻すため、バージョン4.2でも機能します。ただし、このようなコードではうまくいきません。

WordPress> = 4.1の場合、removeメソッドが使用されます。これも機能します。

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