每个级别的HTML select标记都具有相同的名称和ID,并且会相互覆盖。他们must独一无二。You will need separate names, IDs, and meta for each user level input.
同样,用户元密钥需要是唯一的。代码还需要使用get_user_meta
相反(get_the_author_meta
仅在post循环中使用)。
我建议使用类似的方法:
foreach ($user_levels as $user_level) {
update_user_meta( $user_id, \'time-selector-\' . $user_level, $_POST[ \'time-selector\' . $user_level ] );
}
然后相应地更改输入名称和ID。e、 g。
<select name=\'time-selector-\' . $user_level . \'
您还需要调整
get_user_meta
调用以使用新键
然而,您的代码中还有另一个错误。selected
不返回字符串,而是将其输出,因此selected="selected"
HTML将输出到错误的位置。您需要传递第三个参数false
否则,HTML标记将不正确,并且在显示输入标记之前将显示选定属性。
以下是一个示例:
保存元:
$rua_user = rua_get_user( $user->ID );
$user_levels = $rua_user->get_level_ids();
// save existing values if they exist
foreach ( $user_levels as $level ) {
$metakey = \'time-selector-\' . $level;
if ( isset( $_POST[ $metakey ] ) ) {
update_user_meta( $user_id, $metakey, $_POST[ $metakey ] );
}
}
显示输入:
$choices = [
\'two\' => \'Two Weeks\',
\'nine\' => \'9 months\',
];
$rua_user = rua_get_user( $user->ID );
$user_levels = $rua_user->get_level_ids();
foreach ( $user_levels as $level ) {
$metakey = \'time-selector-\' . $level;
$time = get_user_meta( $user->ID, $metakey, true );
ob_start();
echo esc_html( get_the_title( $level ) ) . \' -> \';
?>
<select
name=\'time-selector-<?php echo esc_attr( $level ); ?>\'
id=\'time-selector-<?php echo esc_attr( $level ); ?>\'
style=\'width:180px;\'
>
<option value=\'default\'>Select time</option>
<?php
foreach ( $choices as $value => $label ) {
?>
<option
value="<?php echo esc_attr( $value ); ?>"
<?php selected( $value, $time ); ?>
>
<?php echo esc_html( $label ); ?>
</option>
<?php
}
?>
</select>
<br>
<br>
<?php
$html = ob_get_clean();
$elements[] = $html;
}
// ... etc
请注意以下几点:
所有级别都有唯一且独立的HTML标记,post meta每个字段之间都没有共享内容,如果共享了内容,它们就不会分开。我使用了输出缓冲区,使HTML更易于读取和生成。我添加了转义,这是一个重要的安全功能。时间列表不再是硬编码的,并被移动到一个单独的数组中,以简化代码并减少重复。这也意味着可以对其进行筛选、添加等。保存代码位于单独的代码段中,处理post/用户保存不应与显示数据发生在同一挂钩上<通过将保存代码放在原始问题的显示代码中,您可能引入了一个错误,因为用户元密钥已更改,所有以前的数据都需要重新保存。这不应该是一个问题,因为先前的数据由于原始代码的工作方式而被破坏。在编写问题之前,可能发生的任何数据丢失都已发生如果您尝试使用此代码段,将看不到完整的时间列表。我故意将数组限制为2个条目,以防止人们将其用作复制粘贴解决方案。任何具有初级PHP技能的人都可以更新数组以添加其他选项