wp_update_user no actualiza pero update_user_meta sí lo hace - Solución
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.

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

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

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.

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.

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