wp_update_user nu actualizează iar update_user_meta funcționează
Construiesc o pagină de profil unde utilizatorii pot actualiza profilul lor pe front-end. Profilul utilizatorului este extins cu câteva câmpuri personalizate, precum 'Twitter', 'Facebook' și 'Oraș'.
Următorul cod actualizează cu succes toate detaliile utilizatorului, cu excepția câmpului 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);
Am încercat să folosesc update_user_meta
pentru a actualiza dCity
și a funcționat:
$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'] );
Deci problema este rezolvată, dar mă întreb de ce wp_update_user
nu actualizează toate câmpurile? Fac ceva greșit?
Mulțumesc anticipat.

wp_update_user și metadate
wp_update_user
actualizează înregistrările din tabela *_users. Nu este destinat să actualizeze metadate personalizate în tabela *_usermeta.
Prin urmare, "problema" ta este de fapt un comportament așteptat.
Argumentul $userdata
transmis la wp_update_user
poate conține următoarele câmpuri:
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
În plus, acceptă metadate recunoscute ca "metodă de contact". Acestea vor fi salvate în tabela *_usermeta.
Implicit, acestea sunt jabber, aim și yim.
Acestea pot fi modificate sau adăugate folosind filtrul 'user_contactmethods'
. În ceea ce privește întrebarea ridicată în comentarii, probabil astfel au fost făcute salvabile metadatele pentru twitter și facebook prin wp_update_user
.
Orice metadate suplimentare ar trebui salvate ca atare cu funcțiile adecvate.
Cum se întâmplă acest lucru în nucleu?
Aceasta doar ca o observație:
wp_update_user
apelează _get_additional_user_keys
care la rândul său apelează _wp_get_user_contactmethods
. Metacheile rezultate sunt iterate înapoi în wp_update_user
și, dacă există o valoare, aceasta este adăugată în tabela *_usermeta prin update_user_meta
.
Pentru referință, vezi Linia 1426 și următoarele (în versiunea 3.5.1) din /wp-includes/user.php

Sunt curios să aflu, în acest caz cum sunt salvate câmpurile "twitter" și "facebook"?

Mulțumesc pentru comentariu. Are sens, dar sunt și eu curios cum sunt salvate câmpurile "twitter" și "facebook"? De asemenea, Codex spune wp_update_user()
- Această funcție actualizează un singur utilizator în baza de date. Această actualizare poate conține mai multe elemente de metadate ale utilizatorului sub formă de array. Pentru a actualiza un singur element de metadate ale utilizatorului, folosește update_user_meta()
în schimb.

În ceea ce privește codex-ul: s-ar putea să fie pe o cale greșită și să fi ratat locul din funcțiile respective unde se salvează metadate arbitrare, dar după ce am citit cu atenție codul lor, este mult mai probabil ca pagina din codex să conțină informații înșelătoare. Codex-ul nu este nici complet, nici întotdeauna corect.

@JohannesPille Codex-ul este cu siguranță incorect sau mai degrabă oferă o explicație slabă pentru wp_update_user
. Această funcție m-a păcălit în trecut. Vă va permite să actualizați valorile care există în tabelele wp_users
și wp_usermeta
, dar numai acele valori care sunt definite implicit de WordPress, de ex. pentru usermeta -> first_name, last_name, nickname, description, rich_editing, comment_shortcuts, admin_color, use_ssl, show_admin_bar_front
dar nu orice câmp personalizat, dacă asta nu este suficient de confuz pentru utilizatorul final.
