update_user_meta函数无法更新用户手机号自定义元数据求助
问题排查与修复
代码中的核心问题
- $user_id 未全局有效:原代码仅在
IS_PROFILE_PAGE为真时赋值$user_id,但edit_user_profile_update钩子触发时(管理员编辑其他用户),该条件不成立,导致$user_id未定义,后续验证和元数据更新全部失效。 - Nonce 验证逻辑错误:原代码把手机号输入框的值当作nonce验证的字段,这完全错误——nonce需要单独的隐藏字段,且验证时的action参数要和创建nonce时一致。
- 用户ID获取错误:编辑其他用户时,不能用
get_current_user_id()(这是当前登录管理员的ID),应该从$_POST['user_id']获取被编辑用户的ID。
修正后的代码
add_action( "personal_options_update", "save_custom_user_field" ); add_action( "edit_user_profile_update", "save_custom_user_field" ); function save_custom_user_field() { // 获取正确的用户ID:个人资料页取当前用户,编辑用户页取POST中的user_id $user_id = isset( $_POST['user_id'] ) ? intval( $_POST['user_id'] ) : get_current_user_id(); // 验证nonce:假设你在表单里添加了名为user_phone_nonce的隐藏字段 if ( !isset( $_POST['user_phone_nonce'] ) || !wp_verify_nonce( $_POST['user_phone_nonce'], 'update_user_phone_' . $user_id ) ) { return; } // 权限检查:确保当前用户能编辑目标用户 if ( !current_user_can( "edit_user", $user_id ) ) { return; } // 处理手机号字段,确保存在且过滤值 if ( isset( $_POST['user_phone'] ) ) { $phone = sanitize_text_field( $_POST['user_phone'] ); update_user_meta( $user_id, "user_phone", $phone ); } }
补充说明
别忘了在用户资料编辑表单里添加对应的nonce隐藏字段,比如在显示手机号输入框的函数里加上:
wp_nonce_field( 'update_user_phone_' . $user_id, 'user_phone_nonce' );
这样才能让nonce验证生效,避免CSRF风险,同时保证元数据更新逻辑正常运行。
内容的提问来源于stack exchange,提问作者olifire
相关产品推荐
相关产品推荐

