2026年7月5日

2026年7月5日

WordPressで管理者承認制の会員登録フローを実装する方法

WordPressで「登録はだれでもできるが、管理者が承認するまでログインできない」会員登録フローを作るには、承認機能を持つ会員プラグインを使う方法と、承認待ちの状態をユーザーメタで管理してログインを止める小さなmu-pluginを書く方法があります。この記事では両方の選び方と、自作する場合の安全な実装(nonce・権限チェック付きの承認操作、既存ユーザーを締め出さない設計)を説明します。

承認制にする前に決めておくこと

実装に入る前に、次の3点を決めておくと後で迷いません。

  • 承認待ちの間に何をさせないか:ログインそのものを止めるのか、ログインは許して会員限定コンテンツだけ見せないのか。この記事では前者を扱います
  • だれが承認するか:管理者だけか、ユーザーを編集できる権限を持つ担当者も含めるか
  • 却下したときにどうするか:アカウントを削除するのか、却下状態として残すのか。個人情報を必要以上に保持しないため、却下した登録は一定期間後に削除する運用が無難です

もう一つ、WordPress標準の設定も確認します。「設定」→「一般」の「メンバーシップ」でだれでも登録できるようにし、「新規ユーザーのデフォルト権限グループ」は購読者にしておきます。ここを管理者や編集者にしていると、承認制以前に重大な問題になります。

方法1:承認機能のあるプラグインを使う

画面やメール文面まで含めて手早く整えたいなら、プラグインが現実的です。代表的なものは次のとおりです(2026年10月現在)。

  • Ultimate Member:会員登録・プロフィール・会員ページをまとめて扱う会員プラグイン。権限グループごとに、登録後の状態を「管理者の確認待ち」にする設定がある
  • User Registration(WPEverest):フォームビルダー型の登録プラグイン。登録後のログイン方法として管理者承認を選べる
  • New User Approve:標準の登録画面に承認ステップを追加することに特化したプラグイン

設定名や画面の場所はバージョンで変わるため、各プラグインの説明やドキュメントで確認してください。会員サイト全体(有料会員、コンテンツ制限)まで必要なら会員プラグイン、標準の登録画面に承認だけ足したいなら特化型、と考えると選びやすくなります。

方法2:mu-pluginで承認フローを自作する

標準の登録画面(wp-login.php)をそのまま使い、承認だけを追加したい場合は、数十行のコードで実装できます。設計の要点は次の3つです。

  • 承認待ちのユーザーにだけ、ユーザーメタ lsc_account_status に pending を入れる。値が無いユーザーは承認済みとみなすので、導入前からいる管理者や既存会員が締め出されない
  • 承認待ちを付けるのは、wp-login.phpから自分で登録したとき(register_new_user アクション)だけにする。管理者が管理画面から作ったユーザーは対象外
  • ログインの拒否は authenticate フィルターの優先度30で行う。標準のパスワード確認(優先度20)の後なので、正しいパスワードを入力した人にだけ「承認待ち」と伝わり、他人がユーザー名を入れて承認状態を探ることはできない

作業前にバックアップを取り、ステージング環境で試してから本番に置いてください。

<?php
/**
 * Plugin Name: Registration Approval
 * 置き場所: wp-content/mu-plugins/registration-approval.php
 */
defined( 'ABSPATH' ) || exit;

const LSC_STATUS_KEY = 'lsc_account_status';

// 1. wp-login.php から自分で登録したユーザーだけを承認待ちにする
add_action( 'register_new_user', function ( $user_id ) {
	update_user_meta( $user_id, LSC_STATUS_KEY, 'pending' );
} );

// 2. パスワード確認の後で、承認待ちならログインを拒否する
add_filter( 'authenticate', function ( $user ) {
	if ( $user instanceof WP_User && 'pending' === get_user_meta( $user->ID, LSC_STATUS_KEY, true ) ) {
		return new WP_Error(
			'lsc_pending',
			esc_html( 'アカウントは管理者の承認待ちです。承認の連絡をお待ちください。' )
		);
	}
	return $user;
}, 30 );

// 3. ユーザー一覧に「承認する」リンクを出す(権限がある人だけ)
add_filter( 'user_row_actions', function ( $actions, $user ) {
	if ( 'pending' === get_user_meta( $user->ID, LSC_STATUS_KEY, true )
		&& current_user_can( 'edit_user', $user->ID ) ) {
		$url = wp_nonce_url(
			add_query_arg(
				array(
					'action'  => 'lsc_approve_user',
					'user_id' => $user->ID,
				),
				admin_url( 'admin-post.php' )
			),
			'lsc_approve_user_' . $user->ID
		);
		$actions['lsc_approve'] = '<a href="' . esc_url( $url ) . '">' . esc_html( '承認する' ) . '</a>';
	}
	return $actions;
}, 10, 2 );

// 4. 承認処理:nonceと権限を確認してから状態を外し、本人に通知する
add_action( 'admin_post_lsc_approve_user', function () {
	$user_id = isset( $_GET['user_id'] ) ? absint( $_GET['user_id'] ) : 0;
	check_admin_referer( 'lsc_approve_user_' . $user_id );

	if ( ! $user_id || ! current_user_can( 'edit_user', $user_id ) ) {
		wp_die( esc_html( 'この操作を行う権限がありません。' ), '', array( 'response' => 403 ) );
	}

	delete_user_meta( $user_id, LSC_STATUS_KEY );

	$user = get_userdata( $user_id );
	if ( $user ) {
		$site = wp_specialchars_decode( get_bloginfo( 'name' ), ENT_QUOTES );
		wp_mail(
			$user->user_email,
			sprintf( '[%s] アカウントが承認されました', $site ),
			"会員登録が承認されました。次のページからログインできます。\n" . wp_login_url()
		);
	}

	wp_safe_redirect( admin_url( 'users.php' ) );
	exit;
} );

コードの動き

登録したユーザーには、WordPress標準のメールでパスワード設定用のリンクが届きます。パスワードを設定してログインしようとすると、承認待ちのメッセージが表示されて止まります。管理者は「ユーザー」一覧で該当ユーザーにマウスを合わせると「承認する」リンクが表示され、クリックするとメタが削除され、本人に承認メールが送られます。

承認リンクを wp_nonce_url() で作り、処理側で check_admin_referer() と current_user_can( 'edit_user', ... ) を確認しているのは、管理者が罠のリンクを踏まされて意図しない承認をするCSRFや、権限の無いユーザーによる直接アクセスを防ぐためです。どちらかを省くと、承認制そのものが迂回されます。

authenticate フィルターはアプリケーションパスワードによるAPI認証にも適用されるため、承認待ちのユーザーはAPI経由でもログインできません。

つまずきやすい点

  • 管理者に新規登録を知らせたい:標準でも登録時に管理者宛ての通知メールが送られます。届かない場合はサイトのメール送信設定を先に見直してください
  • 承認待ちの一覧が欲しい:ユーザー数が増えたら、manage_users_columns と manage_users_custom_column で状態の列を追加すると見分けやすくなります
  • 退会や却下:却下した登録はユーザー削除で消します。削除の前に、そのユーザーの投稿をどう扱うかを確認してください

スパム登録への対策

承認制にすると、ボットの登録が「承認待ち」として溜まります。承認の手間を減らすため、登録フォームにCAPTCHAを追加する、登録の試行回数を制限するといった対策を併用してください。承認前に本人確認が必要なら、登録時に入力してもらう情報を最小限にとどめ、取得する個人情報と利用目的をプライバシーポリシーに書いておきます。

まとめ

  • 承認制は「承認待ちの状態を持たせ、ログインを止め、権限のある人が承認する」の3要素で成り立つ
  • 画面まで整えたいならUltimate Member、User Registration、New User Approveなどのプラグインを使う
  • 自作するなら、自分で登録したユーザーだけを承認待ちにし、authenticate の優先度30で止め、承認操作はnonceと権限チェックで守る
  • CAPTCHAなどのスパム対策と、却下した個人情報の削除まで運用に含める

お気軽にご相談ください

お見積りへ お問い合わせへ
▲