この記事は最後に更新してから1年以上経過しています。

連番のユーザーIDを回避できないか考えた

説明

WordPressのユーザーIDは最初の管理者が1、次に追加したユーザーが2といった感じの連番になる。連番のIDはサイトによっては好ましくないケースがあり、連番を回避する方法がないか検討した。

wp_insert_user関数はIDを指定すると更新になる

wp_insert_user関数は、パラメータ(連想配列かオブジェクト)にIDがある場合はユーザー情報の追加ではなく、指定されたIDのユーザー情報を更新する(ユーザー情報が見つからなかった場合はエラーになる)。この仕様により、パラメータで任意のIDを指定してユーザー情報を登録することができない。

ユーザーを登録する独自の関数を作ることは可能だが、今後の仕様変更やセキュリティを考えると現実的ではない(積極的には作りたくない)。そんな状況でソースコードを眺めていると、wp_pre_insert_user_dataフィルターが見つかった。

wp_pre_insert_user_dataフィルターでIDを追加する

wp_pre_insert_user_dataフィルターはバージョン4.9.0で追加されたもので、ユーザー情報を更新・追加する直前に実行される。

$data = apply_filters( 'wp_pre_insert_user_data', $data, $update, $id );

このフィルターには3つのパラメータがあり、第1パラメータ$dataにはユーザー情報の連想配列が格納されている。次のコードは8桁のランダムな数字をIDとして設定するフィルター関数となる。

if ( ! function_exists( 'set_random_ID_when_insert_user' ) ) {
	function set_random_ID_when_insert_user( $data, $update, $id ) {
		if ( ! isset( $data['ID'] ) &&
			isset( $data['user_login'] ) && 
			false === get_user_by( 'login', $data['user_login'] ) ) {
			do {
				$new_id = random_int( 10000001, 99999999 );
			} while ( false !== get_user_by( 'ID', $new_id ) );
			$data['ID'] = $new_id;
		}
		return $data;
	}
}

実際にこのフィルターを使用し、ユーザー'taro'を登録してみる。

add_filter( 'wp_pre_insert_user_data', 'set_random_ID_when_insert_user', 10, 3 );

$userdata = array(
	'user_login' => 'taro',
	'user_pass' => wp_generate_password()
);
$user_id = wp_insert_user( $userdata );

このコードを実行し、登録されたユーザー情報を確認。IDはランダムに生成された8桁の数値になっている。

+----------+------------+------------------------------------+---------------------+
| ID       | user_login | user_pass                          | user_registered     |
+----------+------------+------------------------------------+---------------------+
| 98462053 | taro       | $P$BQeLlcmC5Rpkk8eQULjGDSZdBlwQTH1 | 2019-05-30 07:45:13 |
+----------+------------+------------------------------------+---------------------+

なお、ランダムで生成したIDの最大値はデータベースに保持され、次にIDを指定せずにユーザーを登録すると、その最大値に1を加えた値がIDになる。サイト運営側のユーザー登録時、一般ユーザーと区分けしたい場合は別のルールでIDを指定する必要があるので、その点は留意してほしい。


最終更新 : 2019年06月04日 17:34


お勧め

wp_print_inline_script_tag(2021年4月19日 更新)

void wp_print_inline_script_tag( string $javascript [ , array $attributes = array() ] )
インラインJavaScriptを含むscript要素を出力する。

register_rest_route(2022年8月17日 更新)

bool register_rest_route( string $namespace, string $route [ , array $args = array() [ , bool $override = false ] ] )
REST APIのルートを登録する。

wp_determine_option_autoload_value(2024年7月22日 更新)

string wp_determine_option_autoload_value( string $option, mixed $value, mixed $serialized_value, boo l |string $autoload )
自動ロードのトリガー値を取得する。

single_tag_title(2018年5月27日 更新)

string single_tag_title( [ string $prefix = '' [ , bool $display = true ] ] )
投稿タグアーカイブページの投稿タグ名を取得し、パラメータ$displayがtrueならば表示する。$displayがfalseの場合は、文字列として返す。

home_url(2023年3月31日 更新)

string home_url( [ string $path = '' [ , string $scheme = null ] ] )
現在のブログ(サイト)のホームURLを取得する。ホームURLは、管理者ページの「設定」-「一般」の「サイトのアドレス(URL)」のこと。