Почему wp_update_user не обновляет все данные, а update_user_meta работает?
Я создаю страницу профиля пользователя, где пользователи могут обновлять свои данные на фронтенде. Профиль расширен несколькими дополнительными полями, такими как 'Twitter', 'Facebook' и 'City'.
Следующий код успешно обновляет все данные пользователя, кроме поля 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);
Я попробовал использовать update_user_meta
для обновления поля 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'])
);
wp_update_user($user_fields);
update_user_meta( $current_user->ID, 'dCity', $_POST['dCity'] );
Таким образом, проблема решена, но мне интересно, почему wp_update_user
не обновляет все поля? Я делаю что-то не так?
Заранее спасибо.

wp_update_user и метаданные
wp_update_user
обновляет записи в таблице *_users. Эта функция не предназначена для обновления пользовательских метаданных в таблице *_usermeta.
Таким образом, ваша "проблема" на самом деле является ожидаемым поведением.
Аргумент $userdata
, передаваемый в wp_update_user
, может содержать следующие поля:
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
Кроме того, функция принимает метаданные, которые распознаются как "контактные методы". Эти данные она сохранит в таблицу *_usermeta.
По умолчанию это поля jabber, aim и yim.
Однако их можно изменить или добавить новые с помощью фильтра 'user_contactmethods'
. Что касается вопроса, поднятого в комментариях, скорее всего, именно таким образом метаданные для Twitter и Facebook стали сохраняемыми через wp_update_user
.
Любые дополнительные метаданные должны сохраняться соответствующими функциями для работы с метаданными.
Как это реализовано в ядре WordPress?
Просто для справки:
wp_update_user
вызывает функцию _get_additional_user_keys
, которая в свою очередь вызывает _wp_get_user_contactmethods
. Полученные ключи метаданных перебираются в wp_update_user
, и если значение существует, оно добавляется в таблицу *_usermeta через update_user_meta
.
Для справки смотрите строку 1426 и далее (начиная с версии 3.5.1) в файле /wp-includes/user.php

Мне интересно узнать, в таком случае как сохраняются его поля "twitter" и "facebook"?

Спасибо за ваш комментарий. Это имеет смысл, но мне также интересно, как сохраняются поля "twitter" и "facebook"? Также Codex говорит wp_update_user()
- Эта функция обновляет одного пользователя в базе данных. Это обновление может содержать несколько элементов метаданных пользователя в виде массива. Чтобы обновить один элемент метаданных пользователя, используйте вместо этого update_user_meta()
.

Что касается codex: Возможно, я двигаюсь в неправильном направлении и упустил место в рассматриваемых функциях, где сохраняются произвольные метаданные, но тщательно изучив их исходный код, гораздо более вероятно, что страница codex содержит вводящую в заблуждение информацию. Codex не является ни полным, ни всегда корректным.

@JohannesPille Codex определенно неверен или, точнее, дает плохое объяснение функции wp_update_user
. Эта функция уже вводила меня в заблуждение в прошлом. Она позволяет обновлять значения, которые существуют в таблицах wp_users
и wp_usermeta
, но только те значения, которые определены WordPress по умолчанию, например, для usermeta -> first_name, last_name, nickname, description, rich_editing, comment_shortcuts, admin_color, use_ssl, show_admin_bar_front
, но не любые пользовательские поля, что может сбивать с толку конечного пользователя.
