如何根据用户角色保存不同的Usermeta字段?

时间:2012-05-22 作者:Fraggy

我使用插件创建了一些自定义角色,还创建了自定义用户元字段,这些字段显示在每个用户的配置文件页面中(/wp admin/Profile.php)

我在保存自定义字段时遇到问题,如果不更改用户的角色,我可以保存这些字段。举个例子:

用户1有字段a、b和c,它们的用户角色为挂起

  • 如果我将其用户角色更改为所有者,则他们拥有的字段为a和B如果我随后将其用户角色更改为挂起字段C中的详细信息消失,则似乎WP正在将其从数据库中删除。我希望能够更改角色和字段,而不会丢失存储在usermeta数据库表中的数据。

    我想我的问题是update\\u usermeta函数。

    //saving the user fields
    add_action( \'personal_options_update\', \'save_user_fields\' );
    add_action( \'edit_user_profile_update\', \'save_user_fields\' );
    
    function save_user_fields( $user_id ) {
    if ( !current_user_can( \'edit_user\', $user_id ) )
        return false;
    update_usermeta( $user_id, \'unit_type\', $_POST[\'unit_type\'] );
    update_usermeta( $user_id, \'registered_as\', $_POST[\'registered_as\'] );
    update_usermeta( $user_id, \'date_registered\', $_POST[\'date_registered\'] );
    update_usermeta( $user_id, \'unit_number\', $_POST[\'unit_number\'] );
    update_usermeta( $user_id, \'first_name\', $_POST[\'first_name\'] );
    update_usermeta( $user_id, \'last_name\', $_POST[\'last_name\'] );
    update_usermeta( $user_id, \'owner1_address\', $_POST[\'owner1_address\'] );
    update_usermeta( $user_id, \'owner1_tel_day\', $_POST[\'owner1_tel_day\'] );
    update_usermeta( $user_id, \'owner1_tel_night\', $_POST[\'owner1_tel_night\'] );
    update_usermeta( $user_id, \'emergency_contact_name\', $_POST[\'emergency_contact_name\'] );
    update_usermeta( $user_id, \'emergency_contact_tel_day\',     $_POST[\'emergency_contact_tel_day\'] );
    update_usermeta( $user_id, \'emergency_contact_tel_night\',     $_POST[\'emergency_contact_tel_night\'] );
    }
    

  • 1 个回复
    最合适的回答,由SO网友:brasofilo 整理而成

    观察:遵循指南suggested in this article, 我正在努力提高Q和A的质量。这是一个学习的过程。。。

    在您的original code, 您根据用户角色和其他条件显示了不同的输入字段。

    add_action( \'show_user_profile\', \'user_fields_for_admin\', 10);
    add_action( \'edit_user_profile\', \'user_fields_for_admin\', 10);
    function user_fields_for_admin( $user ){ 
        switch ($user->roles[0]) {
            case \'pending\':
                if ($selected_register == "Owner"){
                    // Display some fields;
                } elseif ($selected_register == "Board") {
                    // Display other fields
                }
                break;
    
            case \'owner\':
                // Display yet another fields
                break;
        }
    }
    
    但在使用保存字段时update_usermeta (根据您编辑的问题中的代码),所有字段都已保存,无论是否显示。

    您必须检查是否传递了字段值,以便在每次更新时不会用不存在的值覆盖usermeta。

    function save_user_fields($user_id) {
        if (!current_user_can(\'edit_user\', $user_id))
            return false;
        if( isset($_POST[\'unit_type\']) )     update_usermeta($user_id, \'unit_type\', $_POST[\'unit_type\']);
        if( isset($_POST[\'registered_as\']) ) update_usermeta($user_id, \'registered_as\', $_POST[\'registered_as\']);
        // ETC
    }
    
    调试和打印Html的建议供您参考,您可以使用以下代码检查PHP对象的内容:

    echo \'<pre>\'.print_r($user, true).\'</pre>\';
    
    您可以使用Heredoc sintax 便于阅读/打印Html。PHP变量放在花括号内。示例:

    echo <<<HTML
        <h3>Owner Details</h3>
        <table class="form-table"><tbody><tr>
        <tr><th>First Name</th>
        <td><input type="text" name="first_name" id="first_name1" value="{$first_name}" class="regular-text" /></td>
        </tr>
        <tr><th>Last Name</th>
        <td><input type="text" name="last_name" id="last_name1" value="{$last_name}" class="regular-text" /></td>
        </tr>
    HTML;
    

    结束