代码中有3个主要问题:
我知道你在用current_user_id()
WordPress中不存在,所以我认为应该是get_current_user_id()
.
您的update_basic_user_meta()
函数基本上可以用于更新用户的元数据,但您需要检查POST数据(gender
和specialty
) 实际上是在继续更新元数据之前设置的,并且update_basic_user_meta
也设置了,这意味着表单已提交。
然而,如果我是你,我会使用nonce field 而不是简单的GET查询。
您需要突出显示;性别“;和;“专业”;选项,以便用户知道他们选择了什么以及是否实际保存了。所以
对于;性别“;选项(使用select
菜单),您可以使用selected()
.
对于;“专业”;选项(使用radio
按钮),您可以使用checked()
.
尽管如此add_filter()
作品init
是一个动作挂钩,所以你应该使用add_action()
:
add_action( \'init\', \'update_basic_user_meta\' ); // use this
//add_filter( \'init\', \'update_basic_user_meta\' ); // not this
使表单按预期工作的示例片段突出显示当前选择的;性别“;选项:
<?php $gender = get_user_meta( get_current_user_id(), \'gender\', true ); ?>
<select name="gender">
<option value="male"<?php selected( \'male\', $gender ); ?>><?php _e( \'Male\', \'text-domain\' ); ?></option>
<option value="female"<?php selected( \'female\', $gender ); ?>><?php _e( \'Female\', \'text-domain\' ); ?></option>
</select>
突出显示当前选择的;“专业”;选项:
<?php $specialty = get_user_meta( get_current_user_id(), \'specialty\', true ); ?>
<div>
<label><input type="radio" name="specialty" value="0"<?php checked( \'0\', $specialty ); ?>> <?php _e( \'Read\', \'text-domain\' ); ?></label><br>
<label><input type="radio" name="specialty" value="1"<?php checked( \'1\', $specialty ); ?>> <?php _e( \'Write\', \'text-domain\' ); ?></label><br>
<label><input type="radio" name="specialty" value="2"<?php checked( \'2\', $specialty ); ?>> <?php _e( \'Translate\', \'text-domain\' ); ?></label>
</div>
更新用户元数据的函数:
function update_basic_user_meta() {
if ( ! empty( $_GET[\'update_basic_user_meta\'] ) &&
isset( $_POST[\'gender\'], $_POST[\'specialty\'] ) &&
$user_id = get_current_user_id()
) {
update_user_meta( $user_id, \'gender\', sanitize_text_field( $_POST[\'gender\'] ) );
update_user_meta( $user_id, \'specialty\', sanitize_text_field( $_POST[\'specialty\'] ) );
if ( ! empty( $_POST[\'redirect_to\'] ) ) {
wp_redirect( $_POST[\'redirect_to\'] );
exit;
}
}
}