因为WordPress默认的注册页(/wp-login.php?action=register)是没有密码的,如果我们需要添加密码注册功能,可以使用ACF添加字段,并二次开发实现密码验证。
我们使用ACF为默认的注册页添加了两个password字段,但字段名是自己起的。
- 密码字段为:user_password,字段类型“密码”;
- 确认密码为:user_password_confirm,字段类型“密码”;
- 添加一个使用条款的字段:terms_agree,字段类型“复选框”;
- 位置规则为:如果“用户表格”等于“注册”,然后保存即可生效。
下图是ACF添加字段组叫做“用户默认注册”,添加了3个新字段后的截图:

但需要注意的是,ACF的字段名在输出HTML里的字段名是不同的,所以我们先查看下html源码,
F12调用控制台,查找类似于:
<div id="acf-form-data" class="acf-hidden">
<input type="hidden" id="_acf_screen" name="_acf_screen" value="user"><input type="hidden" id="_acf_post_id" name="_acf_post_id" value="user_0"><input type="hidden" id="_acf_validation" name="_acf_validation" value="0"><input type="hidden" id="_acf_nonce" name="_acf_nonce" value="7a6b282b1c"><input type="hidden" id="_acf_changed" name="_acf_changed" value="0"> </div>
<h2>用户默认注册</h2><div class="acf-user-register-fields acf-fields -clear"><div class="acf-field acf-field-password acf-field-693a995debac7 is-required" data-name="user_password" data-type="password" data-key="field_693a995debac7" data-required="1">
<div class="acf-label">
<label for="acf-field_693a995debac7">设置密码 <span class="acf-required">*</span></label></div>
<div class="acf-input">
<div class="acf-input-wrap"><input type="password" id="acf-field_693a995debac7" name="acf[field_693a995debac7]" value="lqlqql524" placeholder="请输入密码" required="required"><sider-quick-translation dir="ltr" data-gpts-theme="light" style="display: contents;"></sider-quick-translation></div></div>
</div>
<div class="acf-field acf-field-password acf-field-693a9f3d79756 is-required" data-name="user_password_confirm" data-type="password" data-key="field_693a9f3d79756" data-required="1">
<div class="acf-label">
<label for="acf-field_693a9f3d79756">确认密码 <span class="acf-required">*</span></label></div>
<div class="acf-input">
<div class="acf-input-wrap"><input type="password" id="acf-field_693a9f3d79756" name="acf[field_693a9f3d79756]" value="lqlqql524" placeholder="请再次输入密码" required="required"></div></div>
</div>
<div class="acf-field acf-field-checkbox acf-field-693a9f7479757 is-required" data-name="terms_agree" data-type="checkbox" data-key="field_693a9f7479757" data-required="1">
<div class="acf-label">
<label for="acf-field_693a9f7479757">我同意使用条款 <span class="acf-required">*</span></label></div>
<div class="acf-input">
<input type="hidden" name="acf[field_693a9f7479757]"><ul class="acf-checkbox-list acf-bl">
<li><label><input type="checkbox" id="acf-field_693a9f7479757-我已阅读并同意服务条款" name="acf[field_693a9f7479757][]" value="我已阅读并同意服务条款"> 我已阅读并同意服务条款</label></li>
</ul>
</div>
</div>
</div>
我们可以发现:
关键信息:
- 密码字段的 name 是:
acf[field_693a995debac7] - 确认密码字段的 name 是:
acf[field_693a9f3d79756] - 服务条款字段的 name 是:
acf[field_693a9f7479757][](注意末尾有[])
你之前的代码用的是字段名称(user_password),但 ACF 实际发送的是字段 ID(field_693a995debac7)。
在functions.php添加二次开发代码或使用code snippets添加:
// 密码字段的 name 是:acf[field_693a995debac7]
// 确认密码字段的 name 是:acf[field_693a9f3d79756]
// 服务条款字段的 name 是:acf[field_693a9f7479757][](注意末尾有 [])
// 你之前的代码用的是字段名称(user_password),但 ACF 实际发送的是字段 ID(field_693a995debac7)。
//
//
//
//
// // 验证密码是否匹配
add_filter('registration_errors', function($errors, $login, $email) {
// 从 ACF 字段 ID 获取值
$password = isset($_POST['acf']['field_693a995debac7']) ? sanitize_text_field($_POST['acf']['field_693a995debac7']) : '';
$password_confirm = isset($_POST['acf']['field_693a9f3d79756']) ? sanitize_text_field($_POST['acf']['field_693a9f3d79756']) : '';
$terms = isset($_POST['acf']['field_693a9f7479757']) ? $_POST['acf']['field_693a9f7479757'] : '';
// 检查密码字段
if (empty($password)) {
$errors->add('password_error', '请输入密码');
}
if (empty($password_confirm)) {
$errors->add('password_confirm_error', '请确认密码');
}
// 检查两次密码是否相同
if (!empty($password) && !empty($password_confirm)) {
if ($password !== $password_confirm) {
$errors->add('password_mismatch', '两次输入的密码不相同,请重新输入');
}
}
// 检查是否同意使用条款
if (empty($terms)) {
$errors->add('terms_error', '必须同意服务条款才能注册');
}
return $errors;
}, 10, 3);
// 使用输入的密码设置用户密码
add_action('user_register', function($user_id) {
$password = isset($_POST['acf']['field_693a995debac7']) ? sanitize_text_field($_POST['acf']['field_693a995debac7']) : '';
if (!empty($password)) {
wp_set_password($password, $user_id);
// 清除密码重置令牌
delete_user_meta($user_id, 'user_activation_key');
}
});
// 保存服务条款同意记录
add_action('user_register', function($user_id) {
if (isset($_POST['acf']['field_693a9f7479757']) && !empty($_POST['acf']['field_693a9f7479757'])) {
update_user_meta($user_id, 'terms_agree', sanitize_text_field($_POST['acf']['field_693a9f7479757'][0]));
update_user_meta($user_id, 'terms_agree_date', current_time('mysql'));
}
});
我给密码添加了svg小图标,效果如下图:

🧪 测试
现在试一次注册:
- 填写用户名、邮箱
- 输入密码:
123456 - 确认密码:
123456 - 勾选 ☑ 我已阅读并同意服务条款
- 点击注册
应该能成功注册了! ✅
📊 注册成功后的效果
新用户会被创建,并且:
- ✅ 密码被正确设置(使用你输入的密码,而不是自动生成)
- ✅ 用户 meta 中保存了
terms_agree记录(可在后台用户编辑页查看)


