Почему wp_update_user не обновляет все данные, а update_user_meta работает?

24 мар. 2013 г., 10:31:18
Просмотры: 18.8K
Голосов: 7

Я создаю страницу профиля пользователя, где пользователи могут обновлять свои данные на фронтенде. Профиль расширен несколькими дополнительными полями, такими как '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 не обновляет все поля? Я делаю что-то не так?

Заранее спасибо.

2
Комментарии

вы можете установить плагин WP_DEBUG и затем разобраться, что происходит за кулисами, просмотреть сообщения об ошибках (если они есть), и я думаю, это даст вам некоторые подсказки касательно этой странной ситуации

Hasin Hayder Hasin Hayder
24 мар. 2013 г. 10:41:35

Я думаю, это связано с тем, как данные сохраняются в базу данных WordPress, есть две отдельные таблицы "wp_users" и "wp_usermeta".

Dameer Dameer
24 мар. 2013 г. 11:20:21
Все ответы на вопрос 1
6

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

24 мар. 2013 г. 11:20:48
Комментарии

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

Hasin Hayder Hasin Hayder
24 мар. 2013 г. 11:35:10

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

Tomas Tomas
24 мар. 2013 г. 11:39:50

Смотрите добавленный ответ, @Hasin

Johannes Pille Johannes Pille
24 мар. 2013 г. 12:18:32

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

Johannes Pille Johannes Pille
24 мар. 2013 г. 12:23:21

Ты просто золото, Йоханнес! Спасибо за разъяснение всех деталей.

Tomas Tomas
24 мар. 2013 г. 12:48:54

@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 Adam
28 мар. 2014 г. 08:04:12
Показать остальные 1 комментариев