wp_update_user non aggiorna mentre update_user_meta funziona
Sto costruendo una pagina profilo utente dove gli utenti possono aggiornare il loro profilo dal front-end. Il profilo utente è esteso con alcuni campi personalizzati, come 'Twitter', 'Facebook' e 'Città'.
Il seguente codice aggiorna con successo tutti i dettagli dell'utente tranne il campo dCity
:
$user_fields = array(
'ID' => $current_user->ID,
'nickname' => esc_attr($_POST['nickname']),
'first_name' => esc_attr($_POST['first_name']),
'last_name' => esc_attr($_POST['last_name']),
'display_name' => esc_attr($_POST['display_name']),
'user_email' => esc_attr($_POST['email']),
'user_url' => esc_attr($_POST['url']),
'twitter' => esc_attr($_POST['twitter']),
'facebook' => esc_attr($_POST['facebook']),
'description' => esc_attr($_POST['description']),
'dCity' => esc_attr($_POST['dCity'])
);
wp_update_user($user_fields);
Ho provato a usare update_user_meta
per aggiornare dCity
e ha funzionato:
$user_fields = array(
'ID' => $current_user->ID,
'nickname' => esc_attr($_POST['nickname']),
'first_name' => esc_attr($_POST['first_name']),
'last_name' => esc_attr($_POST['last_name']),
'display_name' => esc_attr($_POST['display_name']),
'user_email' => esc_attr($_POST['email']),
'user_url' => esc_attr($_POST['url']),
'twitter' => esc_attr($_POST['twitter']),
'facebook' => esc_attr($_POST['facebook']),
'description' => esc_attr($_POST['description'])
);
wp_update_user($user_fields);
update_user_meta( $current_user->ID, 'dCity', $_POST['dCity'] );
Quindi il problema è risolto, ma mi chiedo perché wp_update_user
non aggiorni tutti i record? Sto facendo qualcosa di sbagliato?
Grazie in anticipo.

wp_update_user & metadata
wp_update_user
aggiorna i record nella tabella *_users. Non è pensato per aggiornare metadati personalizzati nella tabella *_usermeta.
Quindi il tuo "problema" è in realtà il comportamento previsto.
L'argomento $userdata
passato a wp_update_user
può contenere i seguenti campi:
ID, user_pass, user_login, user_nicename, user_url, user_email, display_name, nickname, first_name, last_name, description, rich_editing, user_registered, role, show_admin_bar_front
Inoltre accetta metadati riconosciuti come "metodo di contatto". Questi verranno salvati nella tabella *_usermeta.
Di default, questi sono jabber, aim & yim.
Tuttavia, questi possono essere modificati/aggiunti tramite il filtro 'user_contactmethods'
. Per quanto riguarda la domanda sollevata nei commenti, è probabile che in questo modo i metadati di twitter e facebook siano stati resi salvabili tramite wp_update_user
.
Qualsiasi metadato aggiuntivo dovrebbe essere salvato come tale con le apposite funzioni.
Come avviene nel core?
Solo come informazione aggiuntiva:
wp_update_user
chiama _get_additional_user_keys
che a sua volta chiama _wp_get_user_contactmethods
. I metakey risultanti vengono iterati nuovamente in wp_update_user
e se esiste un valore viene aggiunto alla tabella *_usermeta tramite update_user_meta
.
Per riferimento, vedi Linea 1426 e seguenti (a partire dalla 3.5.1) di /wp-includes/user.php

Sono curioso di sapere, in quel caso come vengono salvati i suoi campi "twitter" e "facebook"?

Grazie per il tuo commento. Ha senso, ma sono anche curioso di sapere come vengono salvati i campi "twitter" e "facebook"? Inoltre il Codex dice wp_update_user()
- Questa funzione aggiorna un singolo utente nel database. Questo aggiornamento può contenere più elementi di metadati utente come array. Per aggiornare un singolo elemento di metadati utente, usa invece update_user_meta()
.

Per quanto riguarda il codex: potrei essere sulla strada sbagliata qui e aver perso il punto nelle funzioni in questione dove vengono salvati i metadati arbitrari, ma avendo letto accuratamente il loro codice sorgente, è molto più probabile che la pagina del codex contenga informazioni fuorvianti. Il codex non è né completo né sempre corretto.

@JohannesPille Il codex è decisamente errato, o meglio fornisce una spiegazione insufficiente di wp_update_user
. Questa funzione mi ha già creato problemi in passato. Ti permette di aggiornare valori che esistono sia nella tabella wp_users
che in wp_usermeta
ma solo quei valori che sono definiti come predefiniti da WordPress, ad esempio per usermeta -> first_name, last_name, nickname, description, rich_editing, comment_shortcuts, admin_color, use_ssl, show_admin_bar_front
ma non nessun campo personalizzato, il che non è proprio intuitivo per l'utente finale.
