wp_update_user non aggiorna mentre update_user_meta funziona

24 mar 2013, 10:31:18
Visualizzazioni: 18.8K
Voti: 7

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.

2
Commenti

puoi installare il plugin WP_DEBUG e poi approfondire cosa sta succedendo dietro le quinte, i messaggi di errore (se presenti) e penso che questo ti darà qualche indizio su questo strano scenario

Hasin Hayder Hasin Hayder
24 mar 2013 10:41:35

Penso che abbia qualcosa a che fare con il modo in cui i dati vengono salvati nel database di WordPress, ci sono due tabelle separate "wp_users" e "wp_usermeta".

Dameer Dameer
24 mar 2013 11:20:21
Tutte le risposte alla domanda 1
6

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

24 mar 2013 11:20:48
Commenti

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

Hasin Hayder Hasin Hayder
24 mar 2013 11:35:10

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().

Tomas Tomas
24 mar 2013 11:39:50

Vedi la risposta aggiunta, @Hasin

Johannes Pille Johannes Pille
24 mar 2013 12:18:32

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.

Johannes Pille Johannes Pille
24 mar 2013 12:23:21

Sei d'oro Johannes! Grazie per aver chiarito tutti i dettagli.

Tomas Tomas
24 mar 2013 12:48:54

@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.

Adam Adam
28 mar 2014 08:04:12
Mostra i restanti 1 commenti