【问题标题】:How to construct manual custom fields out of a foreach array loop?如何从 foreach 数组循环中构建手动自定义字段?
【发布时间】:2018-09-21 22:40:01
【问题描述】:

我有两个自定义字段,我连接到 Ultimate Member - Wordpress 的用户配置文件和会员插件..

"username" => "Username",
"license_keys" => "License Key",

foreach 循环完美地创建了这些字段,但我希望拥有由$rand_str = generateRandomString(); 自动生成的许可证密钥字段的值。

第一个明显的事情是它在 foreach 循环中,因此输出的 HTML 上的两个值字段都变成随机字符串,并且每次页面刷新时都会更改为新值。

我还尝试了if ($value = "License Key") 语句以输出不同的$html 如果返回true,但由于我在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;
}

更新的代码:问题在于它只返回 $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;
}

【问题讨论】:

  • 你能简化你的问题吗?那里有很多理论和愿望。如果您想拥有$rand_str = generateRandomString() 自动生成的许可证密钥字段的值,那么当您尝试时会发生什么,例如$foo['license_field'] = generateRandomString();
  • 明白我现在会尝试,我只是想以某种方式自动生成 L_K 字段,似乎我尝试的所有内容都适用于这两个字段
  • 你指的L_K字段是什么。您尝试的“什么”适用于这两个领域,“两个领域”是什么意思? DB中的字段,数组,哪个数组?里面有很多代码和很多关于“许可证密钥”和“L K”的引用
  • Sorry L_K as in "license key", 自定义输入字段 html 输出 Screenshot -> imgur.com/a/7j1Vy
  • 现在看来我需要修改 $field_value = get_user_meta(um_user('ID'), $key, true) 的输出? : '';它填充了 html 输入标签的 value="'.$field_value.'"

标签: php wordpress plugins hook


【解决方案1】:

因此,您的代码现在需要用 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、用户名等)并不重要,因为您已经在循环之前为每个项目设置了数据,因此循环中的内容是通用的并且命名相同所有项目(显然具有不同的值)。

您可以从数组中删除项和添加项,循环将根据需要使用它们。

【讨论】:

  • 它为两个字段返回get_user_meta(um_user('ID'), $key, true) ? : '';。并且$field_value = $key = 'license_keys' 将随机密钥插入到两个框中。
  • 除了'field_value' =&gt; get_user_meta($id, $key, true) ? : '', 不喜欢它之外,一切似乎都有效。将Array 输出到文本框,第二个文本框是许可证密钥,其中包含随机字符串:D 非常接近
  • 我明白为什么 get_user_meta(um_user('ID'), $key, true) ? : ''; 在 foreach 循环中生成它不存在于它之外。
  • 我更新了帖子中的代码,问题是它只返回$field_value数组中的最后一项:(截图->imgur.com/a/DgSCB
  • foreach 循环中的$key 是什么?因此,循环之外是什么?只是用户名,是在循环之前设置的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-24
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多