如何在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
相关产品推荐
相关产品推荐

