wp_update_user nu actualizează iar update_user_meta funcționează

24 mar. 2013, 10:31:18
Vizualizări: 18.8K
Voturi: 7

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.

2
Comentarii

poți instala plugin-ul WP_DEBUG și apoi să investighezi ce se întâmplă în spatele scenei, mesajele de eroare (dacă există) și cred că asta îți va oferi câteva indicii despre acest scenariu ciudat

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

Cred că are legătură cu modul în care datele sunt salvate în baza de date wp, există două tabele separate "wp_users" și "wp_usermeta".

Dameer Dameer
24 mar. 2013 11:20:21
Toate răspunsurile la întrebare 1
6

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

24 mar. 2013 11:20:48
Comentarii

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

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

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.

Tomas Tomas
24 mar. 2013 11:39:50

Vezi răspunsul adăugat, @Hasin

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

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

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

Ești aur, Johannes! Mulțumesc pentru clarificarea tuturor detaliilor.

Tomas Tomas
24 mar. 2013 12:48:54

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

Adam Adam
28 mar. 2014 08:04:12
Arată celelalte 1 comentarii