如何在foreach循环外构建Ultimate Member插件的自定义字段并自动生成值
我懂你遇到的问题了——现在你用foreach循环渲染Ultimate Member的自定义字段,结果每次循环都调用generateRandomString(),导致两个字段的value都变成随机串,而且刷新页面还会重新生成新的串。咱们一步步来解决:
第一步:让只有license_keys字段生成随机值
核心就是在循环里加个判断,只对license_keys字段调用随机生成函数,其他字段用用户已有的值(或者空)。代码示例如下:
// 假设你的自定义字段数组是这样的 $custom_fields = [ 'username' => 'Username', 'license_keys' => 'License Key' ]; foreach ($custom_fields as $field_key => $field_label) { // 初始化字段值 $field_value = ''; // 只给license_keys字段赋值随机串 if ($field_key === 'license_keys') { $rand_str = generateRandomString(); $field_value = $rand_str; } else { // 用UM内置函数获取用户已保存的username值 $field_value = um_user($field_key); } // 输出字段HTML(这里用基础的input示例,你可以根据UM的样式调整) echo '<div class="um-field">'; echo '<label>' . esc_html($field_label) . '</label>'; echo '<input type="text" name="' . esc_attr($field_key) . '" value="' . esc_attr($field_value) . '" />'; echo '</div>'; }
第二步:解决刷新页面随机串就变化的问题
上面的代码每次刷新都会重新生成随机串,如果希望这个license key生成一次就固定下来,我们需要先检查用户的元数据里有没有已保存的license值,没有的话再生成并保存:
foreach ($custom_fields as $field_key => $field_label) { $field_value = ''; if ($field_key === 'license_keys') { // 先读取用户已有的license key $existing_license = um_user($field_key); if (empty($existing_license)) { // 没有的话生成新随机串,并存到用户元数据里 $rand_str = generateRandomString(); um_update_user_meta(get_current_user_id(), $field_key, $rand_str); $field_value = $rand_str; } else { // 有已保存的值就直接用 $field_value = $existing_license; } // 可选:给license字段加readonly,防止用户修改 $readonly_attr = 'readonly'; } else { $field_value = um_user($field_key); $readonly_attr = ''; } // 输出HTML echo '<div class="um-field">'; echo '<label>' . esc_html($field_label) . '</label>'; echo '<input type="text" name="' . esc_attr($field_key) . '" value="' . esc_attr($field_value) . '" ' . $readonly_attr . '/>'; echo '</div>'; }
补充:如果还没写generateRandomString()函数,这里给个示例
function generateRandomString($length = 16) { // 定义随机字符串的字符集 $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $char_length = strlen($characters); $random_str = ''; for ($i = 0; $i < $length; $i++) { $random_str .= $characters[rand(0, $char_length - 1)]; } return $random_str; }
注意事项
- 确保这段代码是在用户登录后执行的,因为
um_user()和um_update_user_meta()都依赖当前用户ID。 - 如果是在注册页面生成license key,建议改用UM的
um_registration_complete钩子,在用户注册成功后再生成并保存,避免页面刷新重复生成。
内容的提问来源于stack exchange,提问作者demo7up
相关产品推荐
相关产品推荐

