如何从 foreach 数组循环中构造手动自定义字段?
How to construct manual custom fields out of a foreach array loop?
我有两个自定义字段,已连接到终极会员 - Wordpress 的用户配置文件和会员插件中。
"username" => "Username",
"license_keys" => "License Key",
foreach 循环完美地创建了字段,但我希望 $rand_str = generateRandomString();
自动生成许可证密钥字段的值。
第一个显而易见的事情是它在一个 foreach 循环中,因此输出的 HTML 上的两个值字段都变成了随机字符串,并且每次页面刷新时它都会更改为一个新值。
我还尝试了 if ($value = "License Key")
语句以在返回 true 时输出不同的 $html
,但由于我在 foreach 循环中,它无论如何都将不同的 $html
应用于两个字段。
那么我如何在循环外控制两个字段并对每个字段应用单独的逻辑?
/* make our new tab hookable */
add_action('um_account_tab__license', 'um_account_tab__license');
function um_account_tab__license($info) {
global $ultimatemember;
extract($info);
$output = $ultimatemember->account->get_tab_output('license');
if ($output) {
echo $output;
}
}
/* Finally we add some content in the tab */
add_filter('um_account_content_hook_license', 'um_account_content_hook_license');
function um_account_content_hook_license($output) {
ob_start();
function generateRandomString($length = 15) {
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, $charactersLength - 1)];
}
return $randomString;
}
$custom_fields = [
"username" => "Username",
"license_keys" => "License Key",
];
$rand_str = generateRandomString();
foreach ($custom_fields as $key => $value) {
$fields[$key] = array(
'title' => $value,
'metakey' => $key,
'type' => 'select',
'label' => $value,
);
global $ultimatemember;
$id = um_user('ID');
$field_value = get_user_meta(um_user('ID'), $key, true) ? : '';
$html = '<div class="um-field um-field-'.$key.'" data-key="'.$key.'">
<div class="um-field-label">
<label for="'.$key.'">'.$value.'</label>
<div class="um-clear"></div>
</div>
<div class="um-field-area">
<input class="um-form-field valid "
type="text" name="'.$key.'"
id="'.$key.'" value="'.$field_value.'"
placeholder=""
data-validate="" data-key="'.$key.'">
</div>
</div>';
echo $html;
}
$fields = apply_filters( 'um_account_secure_fields', $fields, $id );
$output .= ob_get_contents();
ob_end_clean();
return $output;
}
更新代码:问题在于它 returns 只是 $field_value
数组中的最后一项
foreach ($custom_fields as $key => $value) {
$fields[$key] = array(
'title' => $value,
'metakey' => $key,
'type' => 'select',
'label' => $value,
);
//$field_value = get_user_meta(um_user('ID'), $key, true) ? : '';
$field_value = [
'username' => [
'fieldvalue' => get_user_meta($id, $key, true) ? : '',
//etc
],
'license_key' => [
'fieldvalue' => generateRandomString(),
// etc
],
];
foreach ($field_value as $i => $field){
//echo um_profile_id();
$fieldsvalue[$i] = array(
'field_value' => $field,
);
$html = '<div class="um-field um-field-'.$value['label'].'" data-
key="'.$value['label'].'">
<div class="um-field-label">
<label for="'.$value['label'].'">'.$value['name'].'</label>
<div class="um-clear"></div>
</div>
<div class="um-field-area">
<input class="um-form-field valid "
type="text" name="'.$value['label'].'"
id="'.$value['label'].'" value="'.$field['fieldvalue'].'"
placeholder=""
data-validate="" data-key="'.$value['label'].'">
</div>
</div>';
}
echo $html;
}
所以你的代码现在是这样的,你需要用 IF 和 ELSE 填充它来满足 $custom_fields
数组中循环的每个值。因为你需要根据你拥有的东西设置许多变量,例如 if is username then do this
else if is license_key do this
.
这是一个糟糕的设计,使用该代码来回答您的问题会有很多变化。
所以我建议稍微重构一下。
向 $custom_fields
数组添加另一个维度,因此每个初始键都是您的主要项目(license_key、用户名等),然后这些键的每个值都是一个子数组,其中包含您的所有值每个项目的需要。
例如:
$custom_fields = [
'username' => [
'name' => 'Username',
'field_value' => set_user_meta(um_user('ID'), $key, true) ?: '',
'label' => 'Username',
'title' => 'Username',
//etc
],
'license_key' => [
'name' => 'License Key',
'field_value' => generateRandomString(),
'label' => 'License Key',
'title' => 'License Key',
// etc
],
];
foreach ($custom_fields as $key => $values) {
// The code
}
然后在你的循环中满足你需要的值,比如在 HTML 中,你会为每个值访问相同的子数组键名,比如 $values['field_value']
和 $values['label']
等
所以在每个循环中,当前项目在循环中是什么并不重要(license_key,用户名等),因为您已经在循环之前为每个项目设置了数据,所以循环中的东西是通用的并且所有项目的名称都相同(显然具有不同的值)。
您可以从数组中删除项目和添加项目,循环将只根据需要使用它们。
我有两个自定义字段,已连接到终极会员 - Wordpress 的用户配置文件和会员插件中。
"username" => "Username",
"license_keys" => "License Key",
foreach 循环完美地创建了字段,但我希望 $rand_str = generateRandomString();
自动生成许可证密钥字段的值。
第一个显而易见的事情是它在一个 foreach 循环中,因此输出的 HTML 上的两个值字段都变成了随机字符串,并且每次页面刷新时它都会更改为一个新值。
我还尝试了 if ($value = "License Key")
语句以在返回 true 时输出不同的 $html
,但由于我在 foreach 循环中,它无论如何都将不同的 $html
应用于两个字段。
那么我如何在循环外控制两个字段并对每个字段应用单独的逻辑?
/* make our new tab hookable */
add_action('um_account_tab__license', 'um_account_tab__license');
function um_account_tab__license($info) {
global $ultimatemember;
extract($info);
$output = $ultimatemember->account->get_tab_output('license');
if ($output) {
echo $output;
}
}
/* Finally we add some content in the tab */
add_filter('um_account_content_hook_license', 'um_account_content_hook_license');
function um_account_content_hook_license($output) {
ob_start();
function generateRandomString($length = 15) {
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, $charactersLength - 1)];
}
return $randomString;
}
$custom_fields = [
"username" => "Username",
"license_keys" => "License Key",
];
$rand_str = generateRandomString();
foreach ($custom_fields as $key => $value) {
$fields[$key] = array(
'title' => $value,
'metakey' => $key,
'type' => 'select',
'label' => $value,
);
global $ultimatemember;
$id = um_user('ID');
$field_value = get_user_meta(um_user('ID'), $key, true) ? : '';
$html = '<div class="um-field um-field-'.$key.'" data-key="'.$key.'">
<div class="um-field-label">
<label for="'.$key.'">'.$value.'</label>
<div class="um-clear"></div>
</div>
<div class="um-field-area">
<input class="um-form-field valid "
type="text" name="'.$key.'"
id="'.$key.'" value="'.$field_value.'"
placeholder=""
data-validate="" data-key="'.$key.'">
</div>
</div>';
echo $html;
}
$fields = apply_filters( 'um_account_secure_fields', $fields, $id );
$output .= ob_get_contents();
ob_end_clean();
return $output;
}
更新代码:问题在于它 returns 只是 $field_value
数组中的最后一项
foreach ($custom_fields as $key => $value) {
$fields[$key] = array(
'title' => $value,
'metakey' => $key,
'type' => 'select',
'label' => $value,
);
//$field_value = get_user_meta(um_user('ID'), $key, true) ? : '';
$field_value = [
'username' => [
'fieldvalue' => get_user_meta($id, $key, true) ? : '',
//etc
],
'license_key' => [
'fieldvalue' => generateRandomString(),
// etc
],
];
foreach ($field_value as $i => $field){
//echo um_profile_id();
$fieldsvalue[$i] = array(
'field_value' => $field,
);
$html = '<div class="um-field um-field-'.$value['label'].'" data-
key="'.$value['label'].'">
<div class="um-field-label">
<label for="'.$value['label'].'">'.$value['name'].'</label>
<div class="um-clear"></div>
</div>
<div class="um-field-area">
<input class="um-form-field valid "
type="text" name="'.$value['label'].'"
id="'.$value['label'].'" value="'.$field['fieldvalue'].'"
placeholder=""
data-validate="" data-key="'.$value['label'].'">
</div>
</div>';
}
echo $html;
}
所以你的代码现在是这样的,你需要用 IF 和 ELSE 填充它来满足 $custom_fields
数组中循环的每个值。因为你需要根据你拥有的东西设置许多变量,例如 if is username then do this
else if is license_key do this
.
这是一个糟糕的设计,使用该代码来回答您的问题会有很多变化。
所以我建议稍微重构一下。
向 $custom_fields
数组添加另一个维度,因此每个初始键都是您的主要项目(license_key、用户名等),然后这些键的每个值都是一个子数组,其中包含您的所有值每个项目的需要。
例如:
$custom_fields = [
'username' => [
'name' => 'Username',
'field_value' => set_user_meta(um_user('ID'), $key, true) ?: '',
'label' => 'Username',
'title' => 'Username',
//etc
],
'license_key' => [
'name' => 'License Key',
'field_value' => generateRandomString(),
'label' => 'License Key',
'title' => 'License Key',
// etc
],
];
foreach ($custom_fields as $key => $values) {
// The code
}
然后在你的循环中满足你需要的值,比如在 HTML 中,你会为每个值访问相同的子数组键名,比如 $values['field_value']
和 $values['label']
等
所以在每个循环中,当前项目在循环中是什么并不重要(license_key,用户名等),因为您已经在循环之前为每个项目设置了数据,所以循环中的东西是通用的并且所有项目的名称都相同(显然具有不同的值)。
您可以从数组中删除项目和添加项目,循环将只根据需要使用它们。