問題描述

我想在我的 multi-site 安裝的 Wordpress 上建立一個使用者名稱,使用者名稱少於 4 個字元。但由於 Wordpress 的使用者名稱限制至少為 4 個字元,因此會顯示此錯誤訊息:

Username must be at least 4 characters.

我在 wp-content 資料夾中找到了一個涉及 mu-plugins 資料夾的解決方案,但它不起作用。是否有任何可能的方式允許我建立一個使用者名稱少於 4 個字元的使用者帳戶?

最佳解決方案

您可以過濾'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;
}

次佳解決方案

由於使用者名稱可能有多個錯誤,所接受的答案可能會刪除我們希望保留的錯誤。例如,輸入 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;
}

編輯:這可以在 WordPress 中達到版本 3.9.6,再次在 4.2

請注意,這在 WordPress 4.0 或 4.1 中不起作用,因為 https://core.trac.wordpress.org/ticket/22234 將錯誤作為私有變數。雖然為 「向後相容性」 提供了一個魔術__get 方法,但是對於陣列,它返回一個陣列的副本 (而不是原始的引用),然後不能編輯它。如果你開啟了 WP_DEBUG,你會得到一個 PHP 注意事項:「注意:間接修改過載屬性 WP_Error :: $錯誤在/path /to /plugin on line xxx 上沒有影響」,否則程式碼無效,無效。

它在版本 4.2 中再次工作,因為 https://core.trac.wordpress.org/ticket/30891 恢復了 WP_Error 的更改和核心中的其他一些位置,儘管不像這樣的程式碼將起作用。

對於 WordPress> = 4.1 它給了我們一個刪除方法這也可以:

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

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。