Почему 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"?
Hasin Hayder
Спасибо за ваш комментарий. Это имеет смысл, но мне также интересно, как сохраняются поля "twitter" и "facebook"? Также Codex говорит wp_update_user() - Эта функция обновляет одного пользователя в базе данных. Это обновление может содержать несколько элементов метаданных пользователя в виде массива. Чтобы обновить один элемент метаданных пользователя, используйте вместо этого update_user_meta().
Tomas
Что касается codex: Возможно, я двигаюсь в неправильном направлении и упустил место в рассматриваемых функциях, где сохраняются произвольные метаданные, но тщательно изучив их исходный код, гораздо более вероятно, что страница codex содержит вводящую в заблуждение информацию. Codex не является ни полным, ни всегда корректным.
Johannes Pille
@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, но не любые пользовательские поля, что может сбивать с толку конечного пользователя.
Adam