Как получить доступ к данным wp_usermeta непосредственно после создания нового пользователя

Вопрос или проблема

Я пытаюсь найти хук действия 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`.
}

Пошаговое объяснение

  1. Хук user_register:

    • Сначала вы можете добавить хук user_register, чтобы обработать какие-либо действия, которые не требуют метаданных. Этот хук позволяет выполнить код сразу после регистрации пользователя.
  2. Хук 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, а ваш сайт будет работать без сбоев и ошибок, связанных с отсутствием данных.

Оцените материал
Добавить комментарий

Капча загружается...