问题描述
我想在我的 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。