通过前端表单更新用户元数据

时间:2020-10-12 作者:Duke Yin

我在WordPress主题前端制作了一个表单,允许注册用户更改页面上的一些用户元数据,但它不起作用,代码如下:

    <form name="update_basic_user_meta" id="update_basic_user_meta" action="<?php echo esc_url( home_url() ); ?>?update_basic_user_meta=true" method="POST">

    <select name="gender">
        <option value="male" ><?php _e(\'Male\',\'text-domain\');?></option>
        <option value="female" ><?php _e(\'Female\',\'text-domain\');?></option>
    </select>
    
    <div>
        <label><input type="radio" name="specialty" value="0"> <?php _e(\'Read\',\'text-domain\');?></label><br>
        <label><input type="radio" name="specialty" value="1"> <?php _e(\'Write\',\'text-domain\');?></label><br>
        <label><input type="radio" name="specialty" value="2"> <?php _e(\'Translate\',\'text-domain\');?></label>
    </div>
    
    <button name="submit" type="submit"><?php _e(\'Submit\',\'text-domain\');?></button>
    <input type="hidden" name="redirect_to" value="<?php echo $_SERVER[\'REQUEST_URI\']; ?>" />

    </form>

    <?php
    function update_basic_user_meta() {
      $user_id = current_user_id();
    update_user_meta( $user_id, \'gender\', $_POST[\'gender\'] );
    update_user_meta( $user_id, \'specialty\', $_POST[\'specialty\'] );
    }
    add_filter(\'init\', \'update_basic_user_meta\');
    ?>
“The”;性别“"E;“专业”;用户元数据字段已存在,并且可以在后端用户配置文件页面上正常工作。

不知道此表单如何不影响任何用户元数据。

请帮忙:)谢谢大家。

2 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

代码中有3个主要问题:

我知道你在用current_user_id() WordPress中不存在,所以我认为应该是get_current_user_id().

您的update_basic_user_meta() 函数基本上可以用于更新用户的元数据,但您需要检查POST数据(genderspecialty) 实际上是在继续更新元数据之前设置的,并且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;
        }
    }
}

SO网友:Duke Yin

首先我要感谢@SallyCJ,你帮了我很多:)

在你写答案的时候,我正在修改代码,下面有一个工作代码。

<?php 
function update_basic_user_meta() {     //define this function
$user_id = get_current_user_id();       //save the current user id number for further use 

?>

<form name="update_basic_user_meta" id="update_basic_user_meta" action="" method="POST"> <!-- figured out should be empty on "action"  -->

        <input name="nickname" type="text" placeholder="<?php _e(\'Your name here\',\'journey\');?>">  <!-- A text field to get user\'s nickname change -->

        <select  name="gender">     <!-- An select to tell is it he or her -->
                <option value="male" ><?php _e(\'Male\',\'journey\');?></option>
                <option value="female" ><?php _e(\'Female\',\'journey\');?></option> 
        </select>

        <div>       <!-- Radio buttons to select what they are good at -->
            <label><input class="uk-radio" type="radio" name="specialty" value="0"> <?php _e(\'Strong\',\'journey\');?></label><br>
            <label><input class="uk-radio" type="radio" name="specialty" value="1"> <?php _e(\'Balanced\',\'journey\');?></label><br>
            <label><input class="uk-radio" type="radio" name="specialty" value="2"> <?php _e(\'Wise\',\'journey\');?></label>
        </div>
        
    <button name="submit" class="uk-button uk-button-primary uk-width-1 uk-margin-small-bottom" type="submit"><?php _e(\'Inject Soul\',\'journey\');?></button>

</form>
<?php
    if($_POST[\'nickname\'] != \'\'){ //check one of the field is filled then go, prevent empty stuff goes to database.
    update_user_meta( $user_id, \'nickname\', $_POST[\'nickname\'] ); //Save Nickname
    update_user_meta( $user_id, \'gender\', $_POST[\'gender\'] );   //Save Gender
    update_user_meta( $user_id, \'specialty\', $_POST[\'specialty\'] ); //Save Specialty
    }
}           //end the function
update_basic_user_meta();   //call to the function
add_action(\'init\', \'update_basic_user_meta\'); // don\'t know is this necessary after calling the function but still add action of this function.
?>
不知道这是否是正确的方法,主要思想是,在php函数中扭曲表单,然后调用函数让表单显示出来,当提交表单时,php使用$\\u POST[]获取数据。

正如您@SallyCJ所提到的,用户应该看到配置文件中已经有了什么,谢谢,实际上我将进一步向表单中添加get\\u user\\u meta()部分。

这是我迄今为止取得的进展,虽然不太漂亮,但确实有效。

无论如何,我应该在调用(执行)函数后再次调用add\\u action()?仍然困扰着我哈哈。

再次感谢您。从你的回答中学到了很多。

相关推荐

添加用户角色:预先保存在User-Meta中[已解决]

我在用户注册后添加一个操作,以根据users meta\\u值添加另一个用户角色。使用时:add_action(\'um_after_save_registration_details\', \'custom_after_new_user_register\', 10, 2); function custom_after_new_user_register($user_id) { $user = get_user_by(\'id\', $user_id); if