web-dev-qa-db-fra.com

Comment enregistrer différents champs Usermeta en fonction du rôle de l'utilisateur?

J'ai créé des rôles personnalisés à l'aide d'un plug-in et j'ai également créé des champs de méta utilisateur personnalisés qui s'affichent dans les pages de profil de chaque utilisateur (/wp-admin/profile.php).

J'ai un problème avec l'enregistrement des champs personnalisés. Je peux enregistrer les champs correctement si je ne modifie pas le rôle des utilisateurs. Donc, pour donner un exemple:

  • L'utilisateur 1 a les champs a, b et c et le rôle d'utilisateur En attente.
  • Si je change le rôle de l'utilisateur en Propriétaire, les champs qu'ils ont sont a et b
  • Si je change alors leur rôle d'utilisateur en En attendant les détails qui étaient dans le champ C disparaissent

Il semble que WP le supprime de la base de données. Je souhaite pouvoir modifier les rôles et les champs sans perdre les données stockées dans la table de base de données usermeta.

Je pense que mon problème est avec la fonction update_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'] );
}
3
Fraggy

Observation: en suivant les directives suggérées dans cet article , j'essaie d'améliorer la qualité du Q et du A. C'est un processus d'apprentissage. .

Dans votre code original , vous affichiez différents champs de saisie en fonction du rôle de l'utilisateur et d'autres conditions.

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;
    }
}

Mais lors de la sauvegarde des champs à l'aide de update_usermeta (conformément au code de votre question modifiée), tous les champs étaient en cours de sauvegarde, qu'ils soient affichés ou non.

Vous devez vérifier si la valeur du champ est en cours de transmission, de sorte que l'utilisateur ne sera pas remplacé par des valeurs inexistantes à chaque mise à jour.

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
}

Suggestions de débogage et d'impression HTML

Pour votre information, vous pouvez vérifier le contenu d'un objet PHP en utilisant le code suivant:

echo '<pre>'.print_r($user, true).'</pre>';

Et au lieu de faire écho d’une ligne à la fois, vous pouvez utiliser le Heredoc sintax pour une lecture et une impression faciles du code HTML. PHP variables va à l'intérieur des accolades. Exemple:

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;
3
brasofilo