wp_update_user no actualiza pero update_user_meta sí lo hace - Solución

24 mar 2013, 10:31:18
Vistas: 18.8K
Votos: 7

Estoy construyendo una página de perfil de usuario donde los usuarios puedan actualizar su perfil desde el front-end. El perfil de usuario está extendido con algunos campos personalizados como 'Twitter', 'Facebook' y 'Ciudad'.

El siguiente código actualiza correctamente todos los detalles del usuario excepto el 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);

Intenté usar update_user_meta para actualizar dCity y funcionó:

$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'] );

Así que problema resuelto, pero me pregunto ¿por qué wp_update_user no actualiza todos los registros? ¿Estoy haciendo algo mal?

Gracias de antemano.

2
Comentarios

puedes instalar el plugin WP_DEBUG y luego investigar lo que está pasando detrás de escena, mensajes de error (si los hay) y creo que eso te dará alguna pista sobre este escenario extraño

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

creo que tiene algo que ver con cómo se guardan los datos en la base de datos de WordPress, hay dos tablas separadas "wp_users" y "wp_usermeta".

Dameer Dameer
24 mar 2013 11:20:21
Todas las respuestas a la pregunta 1
6

wp_update_user y metadatos

wp_update_user actualiza registros en la tabla *_users. No está diseñado para actualizar metadatos personalizados en la tabla *_usermeta.

Por lo tanto, tu "problema" es en realidad el comportamiento esperado.

El argumento $userdata que se pasa a wp_update_user puede contener los siguientes campos:

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

Además, acepta metadatos que son reconocidos como un "método de contacto". Estos los guardará en la tabla *_usermeta.

Por defecto, estos son jabber, aim y yim.

Sin embargo, estos pueden ser modificados o ampliados mediante el filtro 'user_contactmethods'. En cuanto a la pregunta planteada en los comentarios, es probable que así es como se han hecho guardables los metadatos de twitter y facebook a través de wp_update_user.

Cualquier metadato adicional debe guardarse como tal con las funciones apropiadas.

¿Cómo ocurre esto en el núcleo?

Esto solo como un apunte:

wp_update_user llama a _get_additional_user_keys que a su vez llama a _wp_get_user_contactmethods. Las claves de metadatos resultantes se iteran de nuevo en wp_update_user y si existe un valor, se añade a la tabla *_usermeta mediante update_user_meta.

Para referencia, ver Línea 1426 y siguientes (en la versión 3.5.1) de /wp-includes/user.php

24 mar 2013 11:20:48
Comentarios

Tengo curiosidad por saber, en ese caso, ¿cómo se guardan sus campos "twitter" y "facebook"?

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

Gracias por tu comentario. Tiene sentido, pero también tengo curiosidad por saber ¿cómo se guardan los campos "twitter" y "facebook"? Además, el Codex dice wp_update_user() - Esta función actualiza un único usuario en la base de datos. Esta actualización puede contener múltiples elementos de metadatos de usuario como un array. Para actualizar un único elemento de metadatos de usuario, usa update_user_meta() en su lugar.

Tomas Tomas
24 mar 2013 11:39:50

Mira la respuesta adjunta, @Hasin

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

En cuanto al codex: Puede que esté equivocado y haya pasado por alto el punto en las funciones en cuestión donde se guardan metadatos arbitrarios, pero después de leer su código fuente detenidamente, es mucho más probable que la página del codex contenga información engañosa. El codex no es completo ni siempre correcto.

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

¡Eres oro Johannes! Gracias por aclarar todos los detalles.

Tomas Tomas
24 mar 2013 12:48:54

@JohannesPille El codex definitivamente es incorrecto, o más bien da una mala explicación de wp_update_user. Esta función me ha causado problemas en el pasado. Te permitirá actualizar valores que existen tanto en las tablas wp_users como wp_usermeta, pero solo aquellos valores definidos como predeterminados por WordPress, por ejemplo, para usermeta -> first_name, last_name, nickname, description, rich_editing, comment_shortcuts, admin_color, use_ssl, show_admin_bar_front pero no ningún campo personalizado, lo que no deja de ser confuso para el usuario final.

Adam Adam
28 mar 2014 08:04:12
Mostrar los 1 comentarios restantes