
會員網站開放註冊,常遇到兩種困擾:一是機器人每天註冊一堆假帳號,二是內容只想給特定的人看,例如上過課的學員、合作的經銷商。
這篇的做法是讓新會員註冊後先變成「待審核」:
- 待審核的帳號不能登入,登入時會看到「帳號審核中」。
- 管理員在後台的使用者列表看得到誰在等審核,按一下「核准」。
- 核准後自動寄信通知會員,會員就能登入了。
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', ... )確認目前登入的人有權限修改這個帳號。 - 核准後刪掉待審核標記,寄一封「帳號已通過審核」的信給會員,回到使用者列表顯示「已核准,並寄信通知會員」。
實際測試的流程
- 用註冊表單註冊一個新帳號:畫面顯示「註冊完成……帳號需要管理員審核」。管理員收到新使用者通知,會員收到設定密碼的信。
- 會員點信裡的連結設好密碼,回來登入:顯示「帳號審核中」。改用 Email 登入,一樣被擋。管理員自己的帳號登入不受影響。
- 管理員打開使用者列表,那個帳號顯示「待審核 核准」。按下核准後顯示成功訊息,會員收到「帳號已通過審核」的信。
- 會員再登入:成功。
- WooCommerce「我的帳號」註冊:註冊後沒有自動登入,畫面顯示「註冊完成!帳號需要管理員審核」。直接用剛設的密碼登入,被擋下來。
WooCommerce 註冊後,畫面上還會出現 WooCommerce 自己的「您的帳號已成功建立」提示,兩則提示一起顯示,意思不衝突,就沒有另外拿掉。
使用時要注意
- 這是給「會員網站」用的。購物網站顧客在結帳時順便建立的帳號,不在這段程式碼的範圍內,不會被標記待審核;購物網站也不建議讓顧客等審核才能看訂單。
- 審核要有人做。會員註冊後一直沒人核准,比不能註冊還糟。可以在管理員收到的「新使用者註冊」通知信裡多寫一句提醒,做法請看WordPress 註冊通知信自訂。
- 信要寄得出去。核准信、設定密碼的信,如果主機的寄信功能不穩,會員根本收不到。建議設定 SMTP 寄信,可以參考用 Gmail 收發公司企業信箱。
- 想擋機器人,先擋在註冊表單。待審核讓假帳號登不進來,但假帳號還是會塞滿使用者列表。註冊表單加一道驗證題,能少掉大部分,做法請看不用外掛,替 WordPress 登入頁和留言表單加簡單驗證題。
延伸閱讀
- WordPress 使用者角色與權限完整指南:預設角色、檢查權限、建立自訂角色
- WordPress 禁止非管理員進入後台:訂閱者、會員登入後自動導回首頁
- WordPress 依登入狀態、會員角色顯示部分內容:不用外掛的短代碼寫法
會員網站要好用,註冊、審核、通知每一步都要順。正威網路行銷是 25 年經驗的基隆網頁設計工作室,會員專區、審核流程都能依你的需求規劃,台北與全台客戶也歡迎來聊聊。







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