Как добавить поле в профиль пользователя? Например, страну, возраст и т.д.

16 янв. 2016 г., 10:40:46
Просмотры: 138K
Голосов: 46

Я не очень хорошо разбираюсь в компьютерах/кодах и т.д. Я использую плагин, который создает форму регистрации, и в этой форме я добавил поля для страны, возрастной группы, пола и так далее. Я включил опцию, которая добавляет регистрирующегося пользователя в систему WordPress. Но когда я тестирую это, в разделе "Пользователи" в административной панели отображаются только имя пользователя и email.. Есть ли способ, чтобы другие поля также отображались в разделе пользователей?

Мне нужно, чтобы они отображались для статистических целей.

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

+1 за вступление — возможно, позаимствую его! :-D

Boycott A.I. Boycott A.I.
12 нояб. 2024 г. 21:02:50
Все ответы на вопрос 4
7
106

Вам необходимо использовать хуки show_user_profile, edit_user_profile, personal_options_update и edit_user_profile_update.

Вы можете использовать следующий код для добавления дополнительных полей в разделе пользователя.

Код для добавления дополнительных полей в разделе редактирования пользователя:

add_action( 'show_user_profile', 'extra_user_profile_fields' );
add_action( 'edit_user_profile', 'extra_user_profile_fields' );

function extra_user_profile_fields( $user ) { ?>
    <h3><?php _e("Дополнительная информация профиля", "blank"); ?></h3>

    <table class="form-table">
    <tr>
        <th><label for="address"><?php _e("Адрес"); ?></label></th>
        <td>
            <input type="text" name="address" id="address" value="<?php echo esc_attr( get_the_author_meta( 'address', $user->ID ) ); ?>" class="regular-text" /><br />
            <span class="description"><?php _e("Пожалуйста, введите ваш адрес."); ?></span>
        </td>
    </tr>
    <tr>
        <th><label for="city"><?php _e("Город"); ?></label></th>
        <td>
            <input type="text" name="city" id="city" value="<?php echo esc_attr( get_the_author_meta( 'city', $user->ID ) ); ?>" class="regular-text" /><br />
            <span class="description"><?php _e("Пожалуйста, введите ваш город."); ?></span>
        </td>
    </tr>
    <tr>
    <th><label for="postalcode"><?php _e("Почтовый индекс"); ?></label></th>
        <td>
            <input type="text" name="postalcode" id="postalcode" value="<?php echo esc_attr( get_the_author_meta( 'postalcode', $user->ID ) ); ?>" class="regular-text" /><br />
            <span class="description"><?php _e("Пожалуйста, введите ваш почтовый индекс."); ?></span>
        </td>
    </tr>
    </table>
<?php }

Код для сохранения дополнительных полей в базе данных:

add_action( 'personal_options_update', 'save_extra_user_profile_fields' );
add_action( 'edit_user_profile_update', 'save_extra_user_profile_fields' );

function save_extra_user_profile_fields( $user_id ) {
    if ( empty( $_POST['_wpnonce'] ) || ! wp_verify_nonce( $_POST['_wpnonce'], 'update-user_' . $user_id ) ) {
        return;
    }
    
    if ( !current_user_can( 'edit_user', $user_id ) ) { 
        return false; 
    }
    update_user_meta( $user_id, 'address', $_POST['address'] );
    update_user_meta( $user_id, 'city', $_POST['city'] );
    update_user_meta( $user_id, 'postalcode', $_POST['postalcode'] );
}

Также доступны несколько статей по теме, которые могут быть полезны:

16 янв. 2016 г. 13:13:41
Комментарии

Браво, это отлично работает.

AVEbrahimi AVEbrahimi
15 мар. 2018 г. 15:31:25

Это не сохраняет данные из моих дополнительных полей в БД. Есть предложения? Спасибо.

b_dubb b_dubb
3 июл. 2019 г. 19:12:40

@b_dubb, Не могли бы вы поделиться своим кодом? Я проверю и дам вам знать.

Arpita Hunka Arpita Hunka
2 авг. 2019 г. 17:38:28

Я уже решил свою проблему, но спасибо, что откликнулись.

b_dubb b_dubb
5 авг. 2019 г. 20:31:38

Вам следует добавить проверку nonce, чтобы избежать уязвимостей в безопасности. https://developer.wordpress.org/themes/theme-security/using-nonces/

squarecandy squarecandy
30 янв. 2020 г. 20:26:41

Я добавил проверку nonce.

KittMedia KittMedia
21 янв. 2021 г. 12:41:37

@KittMedia Nonce уже проверяется функцией check_admin_referer, которая вызывается в user-edit.php перед этими хуками.

Rup Rup
21 янв. 2021 г. 13:00:57
Показать остальные 2 комментариев
4
10

Плагин Advanced Custom Fields Pro позволит вам добавлять поля в профили пользователей без необходимости написания кода.

20 сент. 2017 г. 06:33:52
Комментарии

Только в Pro версии

I am the Most Stupid Person I am the Most Stupid Person
4 мар. 2019 г. 14:16:43

Есть бесплатные способы реализовать это на PHP.

Drmzindec Drmzindec
15 окт. 2019 г. 12:05:54

Да, определенно можно написать это на PHP без ACF, если предпочитаете. По моему опыту, это займет 100+ строк кода, и нужно будет позаботиться о проверке nonce, написании HTML формы и т.д. Может занять несколько часов программирования против 5-10 минут настройки в ACF. Вероятно, зависит от того, используете ли вы уже ACF Pro в проекте.

squarecandy squarecandy
15 окт. 2019 г. 19:02:01

WordPress должен делать это без необходимости жестко прописывать HTML-формы в PHP. Поддерживаю ACF, это должно быть частью ядра. Вы также можете определять поля с помощью кода и контролировать их версии.

marek.m marek.m
30 янв. 2020 г. 16:13:56
1

Лучше использовать get_user_meta (вместо get_the_author_meta):

function extra_user_profile_fields( $user ) {
    $meta = get_user_meta($user->ID, 'meta_key_name', false);
}
4 дек. 2018 г. 13:14:25
Комментарии

оба работают без проблем!

Fernando Baltazar Fernando Baltazar
18 авг. 2020 г. 22:04:25
2

Вы также можете легко добавить дополнительные поля в существующий раздел "Контактная информация" экрана редактирования профиля пользователя, при этом не требуется настройка дополнительных хуков для обновления метаполей.

function custom_user_profile_contact_fields( $methods ) {
    $methods['phone'] = 'Номер телефона';
    $methods['location'] = 'Местоположение';
    return $methods;
}
add_action( 'user_contactmethods', 'custom_user_profile_contact_fields' );
6 февр. 2023 г. 21:48:56
Комментарии

безусловно, самый простой ответ

RafaSashi RafaSashi
1 мая 2023 г. 12:19:29

@RafaSashi Возможно, но имей в виду, что иногда требуются более сложные поля, и этот метод работает только для обычных однострочных текстовых полей. ;)

Talk Nerdy To Me Talk Nerdy To Me
3 мая 2023 г. 18:36:36