You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Ultimate Member插件生日验证问题求助:实现用户年满13岁校验

解决Ultimate Member生日年龄验证不生效的问题

我来帮你搞定这个年龄验证的问题,你的代码思路是对的,但有几个细节没处理好,导致自定义校验逻辑没生效,咱们一步步调整:

问题分析

  1. 钩子名称可能有误:你用的um_submit_form_errors_hook_student_birthdate并不是Ultimate Member的标准表单错误钩子,UM默认的全局表单错误钩子是um_submit_form_errors,更适合用来添加自定义校验。
  2. 日期格式不匹配:UM的日期选择器默认返回的格式是YYYY-MM-DD(比如2015-05-20),而你的代码用explode("/", $birthDate)来分割,会直接导致日期解析失败,年龄计算出错。
  3. 钩子参数不正确:标准的um_submit_form_errors钩子会传递两个参数:$errors(当前错误集合)和$form_data(表单提交的数据),你的函数只接收了一个参数,可能无法正确获取表单值。

修正后的代码

add_action('um_submit_form_errors', 'um_custom_validate_birthdate', 999, 2);
function um_custom_validate_birthdate( $errors, $form_data ) {
    // 确认你的生日字段键和UM后台设置的一致,这里假设是birth_date
    $birth_date_key = 'birth_date';
    
    // 检查表单中是否存在生日字段且有值
    if ( isset( $form_data[$birth_date_key] ) && !empty( $form_data[$birth_date_key] ) ) {
        $birthDate = $form_data[$birth_date_key];
        
        // 解析UM默认的YYYY-MM-DD格式日期
        $birthDateParts = explode("-", $birthDate);
        if ( count($birthDateParts) !== 3 ) {
            UM()->form()->add_error( $birth_date_key, "请输入有效的出生日期。" );
            return $errors;
        }
        
        list($year, $month, $day) = $birthDateParts;
        
        // 计算年龄
        $today = new DateTime();
        $birth = new DateTime("$year-$month-$day");
        $ageInterval = $today->diff($birth);
        $age = $ageInterval->y;
        
        // 检查是否满13岁
        if ( $age < 13 ) {
            UM()->form()->add_error( $birth_date_key, "你必须年满13岁才能创建账户。" );
        }
    }
    
    return $errors;
}

关键调整说明

  • 更换为标准钩子:用um_submit_form_errors确保能捕获所有表单提交的错误校验环节。
  • 适配UM日期格式:针对默认的YYYY-MM-DD格式做解析,避免因格式不匹配导致的逻辑中断。
  • 更可靠的年龄计算:用PHP的DateTime类来计算年龄,比手动拼接日期字符串的方式更准确,还能处理闰年、跨月等边界情况。
  • 字段键确认:记得把$birth_date_key的值改成你在UM后台实际设置的生日字段的键(比如如果字段叫"student_birthdate",就改成这个)。

测试步骤

  1. 把修正后的代码添加到你的主题functions.php文件,或者自定义插件中。
  2. 进入UM的表单设置,确认生日字段的键和代码中$birth_date_key一致。
  3. 提交一个未满13岁的生日(比如2012-01-01),检查是否弹出错误提示。
  4. 如果还是不生效,打开PHP错误日志,查看是否有语法错误或变量未定义的提示。

内容的提问来源于stack exchange,提问作者Jose Cabrera Jr

火山引擎 最新活动