web-dev-qa-db-fra.com

Enregistrement des champs de profil personnalisés

J'ajoute un champ de profil personnalisé aux utilisateurs d'un rôle spécifique, tel que:

function add_custom_profile_fields( $fields ) {

    // get current user ID
    $user = new WP_User( $_GET['user_id'] );

    // get current user role
    if ( !empty( $user->roles ) && is_array( $user->roles ) ) {
        foreach ( $user->roles as $role ) {

            // filter roles
            if ($role == "paying_member"){
               $fields['Paypal_account'] = 'Paypal account';        
            }
         }
     }

    return $fields;
}
add_filter('user_contactmethods','add_custom_profile_fields',10,1);

Le problème est que la valeur du champ n'est pas sauvegardée. Lorsque je me connecte en tant qu'administrateur, je modifie le profil d'un utilisateur. Cela tient en quelque sorte au fait que je filtre par rôle d'utilisateur, car lorsque je supprime cette partie, les valeurs sont parfaitement sauvegardées.

EDIT: Je pense que toute la méthode est peut-être fausse, je vais plutôt essayer ceci .

1
mike23

Ok, je me trompais, voici une solution qui fonctionne, basée sur le tutoriel de Justin Tadlock .

<?php
/* Add custom profile fields (call in theme : echo $curauth->fieldname;) */ 

add_action( 'show_user_profile', 'my_show_extra_profile_fields' );
add_action( 'edit_user_profile', 'my_show_extra_profile_fields' );

function my_show_extra_profile_fields( $user ) { ?>

    <?php if(user_can($user->ID, "paying_member")) : ?>

        <h3>Extra profile information</h3>

        <table class="form-table">

            <tr>
                <th><label for="Paypal_account">Paypal</label></th>

                <td>
                    <input type="text" name="Paypal_account" id="Paypal_account" value="<?php echo esc_attr( get_the_author_meta( 'Paypal_account', $user->ID ) ); ?>" class="regular-text" /><br />
                    <span class="description">Please enter your Paypal account.</span>
                </td>
            </tr>

        </table>

    <?php endif; ?>

<?php }

add_action( 'personal_options_update', 'my_save_extra_profile_fields' );
add_action( 'edit_user_profile_update', 'my_save_extra_profile_fields' );

function my_save_extra_profile_fields( $user_id ) {

    if ( !current_user_can( 'edit_user', $user_id ) )
        return false;

    /* Copy and paste this line for additional fields. Make sure to change 'Paypal_account' to the field ID. */
    update_usermeta( $user_id, 'Paypal_account', $_POST['Paypal_account'] );
}


?>

Le principal ajout à son code est cette ligne de code:

<?php if(user_can($user->ID, "paying_member")) : ?>

Ce qui affiche les champs personnalisés uniquement pour les utilisateurs ayant le rôle "payment_member" et les administrateurs.

4
mike23

Vous pouvez ignorer la boucle sur les rôles et utiliser user_can

La fonction prend soit une capacité , soit un rôle en tant que paramètre.

if (user_can($user->ID, "paying_member")) { 
    $fields['Paypal_account'] = 'Paypal account';
}

Cela vaut également la peine de vérifier current_user_can pour ignorer la recherche de l'utilisateur.

2
Dave Konopka

Le problème est que $ _GET ['user_id'] n'est pas renseigné. Vous voulez extraire la variable utilisateur actuelle. Essayez ceci:

function add_custom_profile_fields( $fields ) {
  global $current_user;
  if user_can($current_user, "paying_member") { 
    $fields['Paypal_account'] = 'Paypal account';
  }
  return $fields;
}
0
Dave Konopka