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:
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'] );
}
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
}
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;