WordPressのマルチサイトのユーザー名の制限の解除

WordPressでマルチサイトで複数のサイトを運営している。特定分野に特化したサイトで、プロフィールも変更したくなり、専用のユーザーを作りたくなって作ったところ、ユーザー名にアンダースコア (_) が使えず困った。
senooken_money
のような自分の基本ユーザー名+ジャンル名のようなユーザー名を作りたかった。Twitterなどの多くのサービスではユーザー名でのアンダースコアは許容されており、これらと統一したかった。そこで、WordPressのマルチサイトのユーザー名でアンダースコアを使う方法を整理した。
まず、WordPressのユーザー名に使用できる文字は「wordpressの「ユーザー名」で使用できる文字は?」で議論されているように、シングルサイトとマルチサイトで異なっている。
シングルサイトでは、英数字と記号 (._-@)、スペース (先頭と末尾以外) を組み合わせた60文字以下の文字列となっている。
ただし、マルチサイトの場合、この制限が厳しくなっており、数字と英小文字のみしか使えない。さらに、NG文字列 (‘www’, ‘web’, ‘root’, ‘admin’, ‘main’, ‘invite’, ‘administrator’) も存在する。
特に、マルチサイトでアンダースコア (_) が使えないのが困る。「パソコンのユーザー名の形式は [A-Za-z0-9._-] で最低8文字まで可能 – Kenchant」に投稿した通り、ユーザー名の_は使えることが多い。
この文字制限はフィルターが用意されており、ユーザー側で変更することができる。以下のサイトに情報があった。
これらを参考に以下のプラグインを作成した。
wpmu_allow_single_site_username.php
<?php
add_filter( 'wpmu_validate_user_signup', 'wpmu_allow_single_site_username');
/**
* Allow single site username on multiple site.
*
* @wp-hook wpmu_validate_user_signup
* @param array $result
* @return array
*/
function wpmu_allow_single_site_username( $result ) {
$error_name = $result[ 'errors' ]->get_error_message( 'user_name' );
if ( ! empty ( $error_name )
&& $error_name == __( 'Usernames can only contain lowercase letters (a-z) and numbers.' )
&& $result['user_name'] == $result['orig_username']
&& $result['user_name'] == sanitize_user($result['user_name'], true)
) {
unset ( $result[ 'errors' ]->errors[ 'user_name' ] );
return $result;
}
return $result;
}
一応上記ファイルをGitHubにも格納した。
シングルサイトで使用可能な文字列の判定に使われているsanitize_user
をマルチサイトのユーザー名の条件に採用することで、シングルサイトと同じユーザー名を使えるようにした。
作成したプラグインを、wp-content/mu-plugins/
に配置する。これでマルチサイトでもシングルサイトと同じく、ユーザー名にアンダースコアを使えるようになった。念のため、シングルサイトでも禁止されている$をユーザー名に入れて登録すると、エラーになるので問題ないだろう。
ひとまず解決できてよかった。
“WordPressのマルチサイトのユーザー名の制限の解除” に対して1件のコメントがあります。