web-dev-qa-db-fra.com

Comment ajouter des champs à un utilisateur avec wp-api?

Comment ajouter, mettre à jour et récupérer des champs de méta utilisateur avec l'API wp? J'ai ajouté une fonction pour ajouter un numéro de téléphone de champ méta à un utilisateur. Une telle fonction est-elle nécessaire pour ajouter des méta-valeurs au méta-objet? La fonction n'ajoute pas le champ à l'objet méta dans la réponse de l'API, mais l'ajoute comme nouveau champ.

La fonction que j'ai maintenant:

<?php
function portal_add_user_field() {
    register_rest_field( 'user', 'phonenumber',
        array(
            'get_callback'      => function( $user, $field_name, $request ) {
                return get_user_meta( $user[ 'id' ], $field_name, true );
            },
            'update_callback'   => function( $user, $meta_key, $meta_value, $prev_value ) {
                $ret = update_user_meta( array( $user, $meta_key, $meta_value );
                return true;
            },
            'schema'            => array(
                'description'   => __( 'user phonenumber' ),
                'type'          => 'string'
            ),
         )
    );
}
add_action( 'rest_api_init', 'portal_add_user_field' );

J'ai également essayé d'ajouter le champ de numéro de téléphone à la méta de l'utilisateur avec ajax sans une fonction supplémentaire comme celle-ci: (cela n'enregistre pas le champ du numéro de téléphone)

updateUser: function () {
                   var data = {
                       username: this.username,
                       email: this.email,
                       first_name: this.firstname,
                       last_name: this.lastname,
                       meta: {
                        phonenumber: this.phonenumber
                      }
                   };
                   console.log(data);
                   $.ajax({
                       method: "POST",
                       url: wpApiSettings.current_domain + '/wp-json/wp/v2/users/' + wpApiSettings.current_user.ID,
                       data: data,
                       beforeSend: function ( xhr ) {
                           xhr.setRequestHeader( 'X-WP-Nonce', wpApiSettings.nonce );
                       }
                   })
                   .done( $.proxy( function() {
                       alert('Account saved');
                   }, this ))
                   .fail( $.proxy( function( response ) {
                       alert('something went wrong');
                   }, this ));
1
Maarten Heideman

trouvé, d'abord oui pour les métadonnées sur un utilisateur, vous aurez besoin d'une fonction personnalisée comme celle-ci:

<?php
function portal_add_user_field() {
    register_rest_field( 'user', 'userfields',
        array(
            'get_callback'      => function( $user, $field_name, $request ) {
                return get_user_meta( $user[ 'id' ], $field_name, true );
            },
            'update_callback'   => function($meta_value ) {
                $havemetafield  = get_user_meta(1, 'userfields', false);
                if ($havemetafield) {
                    $ret = update_user_meta(1, 'userfields', $meta_value );
                    return true;
                } else {
                    $ret = add_user_meta( 1, 'userfields', $meta_value ,true );
                    return true;
                }
            },
            'schema'            => null
         )
    );
}
add_action( 'rest_api_init', 'portal_add_user_field', 10, 2 );

?>

après cela avec ajax envoyez le comme ceci:

updateUser: function () {
                   var data = {
                       userfields: {
                        somefield: this.somefield,
                        somefield2: this.somefield2
                      }
                   };
                   console.log(data);
                   $.ajax({
                       method: "POST",
                       url: wpApiSettings.current_domain + '/wp-json/wp/v2/users/' + wpApiSettings.current_user.ID,
                       data: data,
                       beforeSend: function ( xhr ) {
                           xhr.setRequestHeader( 'X-WP-Nonce', wpApiSettings.nonce );
                       }
                   })
                   .done( $.proxy( function() {
                       alert('Account saved');
                   }, this ))
                   .fail( $.proxy( function( response ) {
                       alert('something went wrong');
                   }, this ));
                }
1
Maarten Heideman

J'ai réussi à faire cela avec la connexion dans rest_insert_user. J'envoie un tableau comme celui-ci:

var data = {
       first_name: user.first_name,
       last_name: user.last_name,
       name: user.display_name,
       email: user.email,
       description: user.description,
       meta: {
        'wpcf-phone': user.phone,
        'wpcf-institution': user.institution,
        'wpcf-birthday': Math.round(new Date(user.birthday).getTime()/1000)
      }
   };

Et ne traitez que les métadonnées du crochet comme ceci:

function aa_user_update($user, $request, $create)
{
    if ($request['meta']) {
        $user_id = $user->ID;
        foreach ($request['meta'] as $key => $value) {
            update_user_meta( $user_id, $key, $value );
        }
    }
}
add_action( 'rest_insert_user', 'aa_user_update', 12, 3 );

Les champs ordinaires de l'utilisateur sont mis à jour normalement par l'API.

2
Guilherme Sampaio