0%

正威網路行銷工作室,專注於基隆、台北與全台客製化網頁設計,提供專業 RWD 響應式、SEO 搜尋引擎優化、品牌形象設計與網站維護託管服務。

搜尋文章
聯絡資訊
地址基隆市仁二路 220 號 5 樓
追蹤我們

WordPress 新會員註冊後要管理員審核才能登入(免外掛)

WordPress 新會員註冊後要管理員審核才能登入(免外掛) 封面

會員網站開放註冊,常遇到兩種困擾:一是機器人每天註冊一堆假帳號,二是內容只想給特定的人看,例如上過課的學員、合作的經銷商。

這篇的做法是讓新會員註冊後先變成「待審核」:

  • 待審核的帳號不能登入,登入時會看到「帳號審核中」。
  • 管理員在後台的使用者列表看得到誰在等審核,按一下「核准」。
  • 核准後自動寄信通知會員,會員就能登入了。

WordPress 內建的註冊表單和 WooCommerce「我的帳號」頁面的註冊都適用。程式碼放在子佈景主題的 functions.php,或用 Code Snippets 這類外掛新增。

程式碼

PHP
// 1. 從註冊表單建立的新會員,先標記為「待審核」
add_action( 'register_new_user', function ( $user_id ) {
	update_user_meta( $user_id, 'zw_pending', 1 );
} );

// 註冊完成的提示多一句說明
add_filter( 'wp_login_errors', function ( $errors ) {
	if ( in_array( 'registered', $errors->get_error_codes(), true ) ) {
		$errors->add( 'zw_pending_note', '帳號需要管理員審核,核准後會再寄信通知你。', 'message' );
	}
	return $errors;
} );

// WooCommerce「我的帳號」註冊的也一樣:先不要自動登入,標記待審核
add_filter( 'woocommerce_registration_auth_new_customer', function ( $auth, $customer_id ) {
	update_user_meta( $customer_id, 'zw_pending', 1 );
	wc_add_notice( '註冊完成!帳號需要管理員審核,核准後會寄信通知你。', 'notice' );
	return false;
}, 10, 2 );

// 2. 待審核的帳號不能登入
add_filter( 'wp_authenticate_user', function ( $user ) {
	if ( $user instanceof WP_User && get_user_meta( $user->ID, 'zw_pending', true ) ) {
		return new WP_Error( 'zw_pending', '<strong>帳號審核中</strong>:管理員核准後會寄信通知你,到時候就可以登入。' );
	}
	return $user;
} );

// 3. 後台使用者列表多一欄「審核」,待審核的帳號有「核准」連結
add_filter( 'manage_users_columns', function ( $columns ) {
	$columns['zw_pending'] = '審核';
	return $columns;
} );
add_filter( 'manage_users_custom_column', function ( $output, $column, $user_id ) {
	if ( 'zw_pending' !== $column ) {
		return $output;
	}
	if ( ! get_user_meta( $user_id, 'zw_pending', true ) ) {
		return '已核准';
	}
	$url = wp_nonce_url( admin_url( 'users.php?zw_approve=' . $user_id ), 'zw_approve_' . $user_id );
	return '<strong style="color:#b32d2e">待審核</strong><br><a href="' . esc_url( $url ) . '">核准</a>';
}, 10, 3 );

// 4. 按下「核准」:拿掉待審核標記,寄信通知會員
add_action( 'admin_init', function () {
	if ( empty( $_GET['zw_approve'] ) ) {
		return;
	}
	$user_id = (int) $_GET['zw_approve'];
	check_admin_referer( 'zw_approve_' . $user_id );
	if ( ! current_user_can( 'edit_user', $user_id ) ) {
		wp_die( '你沒有權限核准這個帳號。' );
	}
	delete_user_meta( $user_id, 'zw_pending' );
	$user      = get_userdata( $user_id );
	$site_name = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES );
	wp_mail(
		$user->user_email,
		'【' . $site_name . '】帳號已通過審核',
		"你好:\n\n你在「{$site_name}」註冊的帳號已經通過審核,現在可以登入了。\n\n" . wp_login_url()
	);
	wp_safe_redirect( admin_url( 'users.php?zw_approved=1' ) );
	exit;
} );
add_action( 'admin_notices', function () {
	if ( isset( $_GET['zw_approved'] ) ) {
		echo '<div class="notice notice-success is-dismissible"><p>已核准,並寄信通知會員。</p></div>';
	}
} );

逐段說明

1. 註冊時標記待審核

  • register_new_user 只在有人用 WordPress 內建的註冊表單註冊時執行。管理員在後台「使用者 → 新增使用者」建立的帳號不會被標記,不用另外核准。
  • 標記就是在使用者資料裡存一個 zw_pending,有這個值就代表待審核。
  • 註冊完成的畫面原本只寫「請檢查電子郵件收件匣」,用 wp_login_errors 多加一句「帳號需要管理員審核」,會員才不會以為註冊壞了。
  • WooCommerce「我的帳號」註冊完會自動登入。woocommerce_registration_auth_new_customer 這個篩選器回傳 false,就不會自動登入,同時標記待審核、顯示提示。

2. 待審核的帳號不能登入

wp_authenticate_user 在 WordPress 確認帳號存在之後、檢查密碼之前執行。這裡發現有待審核標記,就回傳錯誤,登入會被擋下來,畫面顯示「帳號審核中」。用帳號或 Email 登入都會經過這裡,WooCommerce 的登入表單也是。

3. 使用者列表多一欄「審核」

使用者 → 全部使用者 的列表最右邊多一欄,待審核的人顯示紅色的「待審核」和「核准」連結,其他人顯示「已核准」。加上這段程式碼之前就註冊的會員,沒有待審核標記,一律算已核准,不會突然全部登入不了。

4. 按下核准

  • 連結裡帶了 WordPress 的安全碼(nonce),check_admin_referer() 會檢查。別人寄一個假的核准連結給管理員點,或自己改網址上的編號,都會被擋下來。測試時把安全碼改掉,WordPress 回應 403 拒絕。
  • 再用 current_user_can( 'edit_user', ... ) 確認目前登入的人有權限修改這個帳號。
  • 核准後刪掉待審核標記,寄一封「帳號已通過審核」的信給會員,回到使用者列表顯示「已核准,並寄信通知會員」。

實際測試的流程

  1. 用註冊表單註冊一個新帳號:畫面顯示「註冊完成……帳號需要管理員審核」。管理員收到新使用者通知,會員收到設定密碼的信。
  2. 會員點信裡的連結設好密碼,回來登入:顯示「帳號審核中」。改用 Email 登入,一樣被擋。管理員自己的帳號登入不受影響。
  3. 管理員打開使用者列表,那個帳號顯示「待審核 核准」。按下核准後顯示成功訊息,會員收到「帳號已通過審核」的信。
  4. 會員再登入:成功。
  5. WooCommerce「我的帳號」註冊:註冊後沒有自動登入,畫面顯示「註冊完成!帳號需要管理員審核」。直接用剛設的密碼登入,被擋下來。

WooCommerce 註冊後,畫面上還會出現 WooCommerce 自己的「您的帳號已成功建立」提示,兩則提示一起顯示,意思不衝突,就沒有另外拿掉。

使用時要注意

  • 這是給「會員網站」用的。購物網站顧客在結帳時順便建立的帳號,不在這段程式碼的範圍內,不會被標記待審核;購物網站也不建議讓顧客等審核才能看訂單。
  • 審核要有人做。會員註冊後一直沒人核准,比不能註冊還糟。可以在管理員收到的「新使用者註冊」通知信裡多寫一句提醒,做法請看WordPress 註冊通知信自訂。
  • 信要寄得出去。核准信、設定密碼的信,如果主機的寄信功能不穩,會員根本收不到。建議設定 SMTP 寄信,可以參考用 Gmail 收發公司企業信箱。
  • 想擋機器人,先擋在註冊表單。待審核讓假帳號登不進來,但假帳號還是會塞滿使用者列表。註冊表單加一道驗證題,能少掉大部分,做法請看不用外掛,替 WordPress 登入頁和留言表單加簡單驗證題。

延伸閱讀

會員網站要好用,註冊、審核、通知每一步都要順。正威網路行銷是 25 年經驗的基隆網頁設計工作室,會員專區、審核流程都能依你的需求規劃,台北與全台客戶也歡迎來聊聊。

分享這篇文章

返回文章列表更多「Wordpress代碼教學」文章

發表留言

還沒有人留言,歡迎第一個分享你的想法或問題。留言經審核後才會顯示,Email 不會公開。

讓我們一起打造
您的專屬網站!