使用ACF为WordPress的默认注册页添加密码字段和验证功能

因为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 实际发送的是字段 IDfield_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小图标,效果如下图:

 

 

🧪 测试

现在试一次注册:

  1. 填写用户名、邮箱
  2. 输入密码:123456
  3. 确认密码:123456
  4. 勾选 ☑ 我已阅读并同意服务条款
  5. 点击注册

应该能成功注册了! ✅


📊 注册成功后的效果

新用户会被创建,并且:

  • ✅ 密码被正确设置(使用你输入的密码,而不是自动生成)
  • ✅ 用户 meta 中保存了 terms_agree 记录(可在后台用户编辑页查看)

 

Share the Post:

相关文章

This Headline Grabs Visitors’ Attention

A short description introducing your business and the services to visitors.