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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 03:20:03