You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在WordPress中获取add_user_contact_method字段的旧值?

解决WordPress自定义用户联系字段修改时获取旧值的问题

针对你用add_user_contact_method添加secondary_mail字段后,无法获取修改前旧值的问题,给你几个靠谱的解决方案:

方案一:用pre_user_update钩子(推荐)

这个钩子在用户数据写入数据库之前触发,能直接拿到数据库里的旧值,同时从POST请求中获取即将提交的新值,逻辑最清晰:

add_action('pre_user_update', function($user_id) {
    // 获取数据库中存储的旧备用邮箱值
    $old_secondary_mail = get_user_meta($user_id, 'secondary_mail', true);
    // 从后台提交的表单数据中获取新值(做邮箱格式校验)
    $new_secondary_mail = isset($_POST['secondary_mail']) ? sanitize_email($_POST['secondary_mail']) : '';
    
    // 只有当值发生变化时才执行后续逻辑
    if ($old_secondary_mail !== $new_secondary_mail) {
        // 这里替换成你的业务逻辑,比如记录日志、发送通知等
        error_log("备用邮箱修改:旧值=$old_secondary_mail,新值=$new_secondary_mail");
    }
});

方案二:修正profile_update钩子的用法

之前你用$old_user_data->secondary_mail拿到新值,是因为WP_User对象的自定义meta字段是动态加载的——当你访问这个属性时,WordPress会直接去数据库取最新值(此时用户数据已经更新)。正确的做法是调用WP_User的get_meta方法,从旧对象的缓存中获取值:

add_action('profile_update', function($user_id, $old_user_data) {
    // 从旧用户对象的缓存中获取旧值(避免读取已更新的数据库)
    $old_secondary_mail = $old_user_data->get_meta('secondary_mail', true);
    // 获取更新后的新值
    $new_secondary_mail = get_user_meta($user_id, 'secondary_mail', true);
    
    if ($old_secondary_mail !== $new_secondary_mail) {
        // 执行你的业务逻辑
        error_log("备用邮箱变更:旧=$old_secondary_mail,新=$new_secondary_mail");
    }
}, 10, 2);

关于update_user_metadata钩子的说明

你遇到prev_value为空的情况,是因为WordPress处理用户联系字段时,调用update_user_meta没有传入prev_value参数。如果想用这个钩子,也可以手动对比新旧值:

add_filter('update_user_metadata', function($check, $object_id, $meta_key, $meta_value) {
    if ($meta_key !== 'secondary_mail') return $check;
    
    $old_value = get_user_meta($object_id, $meta_key, true);
    if ($old_value !== $meta_value) {
        // 处理逻辑
        error_log("备用邮箱修改记录:旧=$old_value,新=$meta_value");
    }
    return $check;
}, 10, 4);

内容的提问来源于stack exchange,提问作者Mensoif

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 00:30:44