为何保存后select标签始终显示首个选项?如何设置选中用户上次选择项
解决方法
核心是给与用户已保存的display_name匹配的<option>标签添加selected属性,让页面加载时自动选中对应选项。
修改后的代码(推荐循环写法,更易维护)
<!-- Nickname (nome visualizzato nel sito) --> <p class="form-row"> <label class="t2" for="account_display_name"><?php esc_html_e( 'Display name', 'woocommerce' ); ?> <span class="required">*</span></label> <select class="field-settings" name="account_display_name" id="account_display_name"> <?php // 整理所有可选的昵称组合 $display_options = [ $user->first_name, $user->last_name, $user->first_name . $user->last_name, $user->last_name . $user->first_name ]; foreach ($display_options as $option) { $escaped_option = esc_attr($option); // 判断当前选项是否匹配用户已保存的昵称 $selected = ($escaped_option === esc_attr($user->display_name)) ? 'selected="selected"' : ''; echo "<option value=\"{$escaped_option}\" {$selected}>{$escaped_option}</option>"; } ?> </select> <span class="t4-light"><?php esc_html_e( 'This will be how your name will be displayed in the account section and in reviews', 'woocommerce' ); ?></span> </p>
代码说明
- 循环生成选项:把所有昵称组合放到数组里循环输出,避免重复代码,后续要加新组合也更方便。
- 选中状态判断:每次循环对比当前选项的转义值和用户已保存的
display_name转义值,相等就添加selected属性。 - 安全输出:用
esc_attr()处理所有输出内容,符合WordPress/WooCommerce的安全规范,防止XSS攻击。
直接修改原代码的写法(不使用循环)
如果不想用循环,也可以给每个选项单独加判断:
<select class="field-settings" name="account_display_name" id="account_display_name"> <option value="<?php echo esc_attr( $user->first_name ); ?>" <?php echo (esc_attr($user->first_name) === esc_attr($user->display_name)) ? 'selected="selected"' : ''; ?>><?php echo esc_attr( $user->first_name ); ?></option> <option value="<?php echo esc_attr( $user->last_name ); ?>" <?php echo (esc_attr($user->last_name) === esc_attr($user->display_name)) ? 'selected="selected"' : ''; ?>><?php echo esc_attr( $user->last_name ); ?></option> <option value="<?php echo esc_attr( $user->first_name . $user->last_name ); ?>" <?php echo (esc_attr($user->first_name . $user->last_name) === esc_attr($user->display_name)) ? 'selected="selected"' : ''; ?>><?php echo esc_attr( $user->first_name . $user->last_name ); ?></option> <option value="<?php echo esc_attr( $user->last_name . $user->first_name ); ?>" <?php echo (esc_attr($user->last_name . $user->first_name) === esc_attr($user->display_name)) ? 'selected="selected"' : ''; ?>><?php echo esc_attr( $user->last_name . $user->first_name ); ?></option> </select>
修改完成后,页面加载时select就会自动选中用户上次保存的昵称选项。
内容的提问来源于stack exchange,提问作者Snorlax
相关产品推荐
相关产品推荐

