Вопрос или проблема
Я пытаюсь найти хук действия WordPress, который позволит мне получить информацию wp_usermeta нового пользователя сразу после его создания. В нашем процессе регистрации вводятся кастомные поля вместе со стандартными полями пользователя WordPress. Пока что я пробовал использовать хук user_register
, но это не сработало. Я как бы ожидал, что user_register
не будет работать, потому что в его справке сказано:
https://codex.wordpress.org/Plugin_API/Action_Reference/user_register
“Не все метаданные пользователя были сохранены в базе данных, когда это
действие срабатывает. Например, ник в базе данных, но
имя и фамилия нет (по состоянию на 3.9.1)”
И это оказалось правдой. Моя функция не возвращает никаких метаданных пользователя, если я использую хук user_register
.
Общий план моей функции:
add_action( 'user_register', 'myfunction', 10, 1 );
function myfunction ( $userid ) {
$user_object = get_userdata( $userid );
$user_fields = array(
//это возвращается при использовании хука user_register
$user_object->user_login,
//это *не* возвращается при использовании хука user_register
$user_object->некоторое пользовательское поле
);
//делаем что-то с массивом $user_fields
}
Итак, мой вопрос: какой хук я могу использовать, который срабатывает после регистрации пользователя и после, того как их метаданные пользователя были записаны в wp_usermeta?
Хук edit_user_created_user
будет работать для добавления пользователей через user-new.php
:
add_action( 'edit_user_created_user', 'wpse_edit_user_created_user', 10, 2 ); //для страницы user-new.php при добавлении нового пользователя
function wpse_edit_user_created_user( $user_id, $notify ) {
$meta = get_user_meta( $user_id, 'my_field', true );
}
Для полноты картины я использовал следующий код для тестирования метаданных пользователя, который я взял из этого ответа.
/**
* Объявление полей формы
*/
function show_my_fields( $user ) {
$fetched_field = get_user_meta( $user->ID, 'my_field', true ); ?>
<tr class="form-field">
<th scope="row"><label for="my-field"><?php _e('Имя поля') ?> </label></th>
<td><input name="my_field" type="text" id="my-field" value="<?php echo esc_attr($fetched_field); ?>" /></td>
</tr>
<?php
}
add_action( 'show_user_profile', 'show_my_fields' ); //показать на странице my profile.php
add_action( 'edit_user_profile', 'show_my_fields' ); //показать на странице my profile.php
//add_action( 'user_new_form_tag', 'show_my_fields' ); //чтобы добавить поля перед формой user-new.php
add_action( 'user_new_form', 'show_my_fields' ); //чтобы добавить поля после формы user-new.php
/**
* Сохранение моих полей формы
*/
function save_my_form_fields( $user_id ) {
update_user_meta( $user_id, 'my_field', $_POST['my_field'] );
}
add_action( 'personal_options_update', 'save_my_form_fields' ); //для обновления на странице профиля
add_action( 'edit_user_profile_update', 'save_my_form_fields' ); //для обновления на странице профиля
add_action( 'user_register', 'save_my_form_fields' ); //для страницы user-new.php при добавлении нового пользователя
Ответ или решение
Чтобы получить доступ к данным wp_usermeta
сразу после создания нового пользователя в WordPress, следует использовать правильный хук, который срабатывает после того, как данные пользователя уже сохранены. Как вы заметили, стандартный хук user_register
не всегда предоставляет доступ ко всем метаданным пользователя, поскольку данные, такие как first_name
и last_name
, могут быть недоступны в этот момент.
Решение проблемы с доступом к wp_usermeta
Вы можете использовать несколько подходов для получения информации о метаданных пользователя после его регистрации. Наиболее подходящий хук для этой цели — это user_register
, за которым следует использование user_meta
. Однако, чтобы обеспечить правильный доступ к метаданным, можно использовать хук edit_user_created_user
, который вызывается при добавлении пользователя через интерфейс администрирования.
Вот пример этого подхода:
add_action('user_register', 'custom_user_register', 10, 1);
function custom_user_register($user_id) {
// Прочие операции, которые не требуют метаданных.
// Например, вы можете сразу установить некоторые значения по умолчанию.
}
add_action('edit_user_created_user', 'handle_new_user_meta', 10, 2);
function handle_new_user_meta($user_id, $notify) {
// После создания пользователя можно получить доступ ко всем метаданным.
$custom_field = get_user_meta($user_id, 'my_field', true);
// Здесь можно выполнять необходимые действия с вашим `custom_field`.
}
Пошаговое объяснение
-
Хук
user_register
:- Сначала вы можете добавить хук
user_register
, чтобы обработать какие-либо действия, которые не требуют метаданных. Этот хук позволяет выполнить код сразу после регистрации пользователя.
- Сначала вы можете добавить хук
-
Хук
edit_user_created_user
:- После этого используйте
edit_user_created_user
, чтобы получить доступ к метаданным пользователя. Этот хук срабатывает сразу после создания пользователя и после того, как все поля метаданных были сохранены.
- После этого используйте
Дополнительные рекомендации
-
Сохранение пользовательских полей:
Если вы создаете кастомные поля для пользователя, убедитесь, что они сохраняются правильно. Для этого используйте хуки, такие какpersonal_options_update
иedit_user_profile_update
, чтобы сохранить изменения, внесенные администратором в метаданные пользователя. -
Проверка существующих метаданных:
После получения метаданных черезget_user_meta
, всегда проверяйте, существуют ли данные, чтобы избежать потенциальных ошибок. -
Обработка ошибок:
Убедитесь, что в вашем коде правильно обрабатываются возможные ошибки, например, когда метаданные отсутствуют.
Заключение
Использование edit_user_created_user
наряду с user_register
является правильным подходом для доступа к метаданным пользователя сразу после его создания. Этот метод гарантирует, что все метаданные, в том числе пользовательские поля, доступны для работы. Таким образом, ваш код будет работать более надежно и эффективно.
Следуя этим рекомендациям, вы сможете успешно управлять метаданными пользователей в WordPress, а ваш сайт будет работать без сбоев и ошибок, связанных с отсутствием данных.