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

