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

如何在Ultimate Member插件中更新WordPress数据库字段

解决WordPress中修改um_cache_userdata_*序列化字段的问题

兄弟,先给你捋捋你原来代码里的几个问题:

  • SQL查询逻辑完全错了:你要找的是option_name为um_cache_userdata_用户ID的记录,而不是option_value等于用户ID的
  • 直接echo $posts没用,get_row返回的是对象,得访问它的属性,而且你要的是序列化的option_value,不是ID和license_keys

接下来给你两种靠谱的解决方案,优先用第一种,因为WordPress内置函数已经帮你踩过序列化的坑,不用自己操心长度匹配的问题:

方案一:用WordPress内置函数(推荐)

这种方式最安全,get_option和update_option会自动处理序列化和反序列化,省得你手动折腾:

// 获取当前用户ID(如果是指定用户,直接替换成具体数字就行,比如123)
$user_id = um_user('ID');
if ( empty($user_id) ) {
    // 处理用户未登录的情况,比如直接返回或者提示
    return;
}

// 构造对应的option名称
$option_name = 'um_cache_userdata_' . $user_id;

// 获取缓存的用户数据(自动帮你反序列化)
$user_cache_data = get_option($option_name, []);

// 修改msn和test字段
if ( isset($user_cache_data['msn']) ) {
    $user_cache_data['msn'] = '你要设置的新msn值'; // 替换成你的目标值
}
if ( isset($user_cache_data['test']) ) {
    $user_cache_data['test'] = '你要设置的新test值'; // 替换成你的目标值
}

// 如果原来没有这两个字段,直接添加也行
// $user_cache_data['msn'] = '新msn值';
// $user_cache_data['test'] = '新test值';

// 保存修改后的数据(自动重新序列化)
update_option($option_name, $user_cache_data);

方案二:直接用$wpdb操作数据库

如果你非要直接碰数据库,记得一定要手动处理序列化,绝对不能直接字符串替换(序列化的字符串长度是硬编码的,直接改内容会导致WordPress无法解析数据):

global $wpdb;
$user_id = um_user('ID');
if ( empty($user_id) ) {
    return;
}

// 构造option名称
$option_name = 'um_cache_userdata_' . $user_id;

// 查询对应的option记录,用prepare防止SQL注入
$cache_record = $wpdb->get_row(
    $wpdb->prepare(
        "SELECT option_value FROM {$wpdb->prefix}options WHERE option_name = %s",
        $option_name
    )
);

if ( empty($cache_record) || empty($cache_record->option_value) ) {
    // 没找到对应记录,自己加处理逻辑
    return;
}

// 反序列化数据
$user_cache_data = unserialize($cache_record->option_value);
if ( !is_array($user_cache_data) ) {
    $user_cache_data = [];
}

// 修改目标字段
$user_cache_data['msn'] = '新msn值';
$user_cache_data['test'] = '新test值';

// 重新序列化并更新数据库
$wpdb->update(
    "{$wpdb->prefix}options",
    ['option_value' => serialize($user_cache_data)],
    ['option_name' => $option_name],
    ['%s'],
    ['%s']
);

重要提醒

  • 绝对不要直接用字符串替换序列化后的内容!比如你想把s:3:"msn";s:8:"oldvalue";直接改成新值,会因为字符串长度不匹配导致WordPress无法反序列化数据,直接搞崩缓存。
  • 一定要用$wpdb->prepare防止SQL注入,你的原代码直接拼接字符串有安全风险,必须改掉。
  • 如果是批量修改多个用户的字段,记得循环处理每个用户ID,别一次性操作所有记录,避免拖垮数据库。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:53:21