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件のコメントがあります。

コメントを残す

メールアドレスが公開されることはありません。