Добавляем дополнительные поля в профиль пользователя WordPress

Здравствуйте, уважаемые читатели XoZbloga! Когда Вы работаете над проектами, в которых большое внимание уделяется работе с пользователями сайта, может возникнуть ситуация при которой уже не хватает стандартных полей в профиле пользователя WordPress. Следовательно, необходимо самостоятельно добавлять не достающие. В базе данных WordPress есть таблица называется wp_usermeta. Она хранит всю дополнительную информацию, которую можно найти в профиле пользователя. Эта таблица имеет следующую структуру:

  • umeta_id — уникальный идентификатор;
  • user_id — идентификатор пользователя;
  • meta_key — ключ поля;
  • meta_value — значение поля.

Структура этой таблицы означает, что мы можем добавить произвольное количество дополнительных полей для учетной записи пользователя. Этим мы и займемся!

Добавляем дополнительные поля в профиль пользователя

Все следующие манипуляции с кодом будут происходить в файле function.php активной темы. В результате, в профиле пользователя появятся 3 дополнительных поля.

Дополнительные поля в профиле пользователя WordPress

Для добавления полей на страницу профиля, будем использовать WordPress хаки: show_user_profile (просмотр и изменение дополнительных полей только собственного профиля) и edit_user_profile (тоже самое, но для всех профилей), а также функцию для формирования полей.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
add_action( 'show_user_profile', 'add_extra_social_links' );
add_action( 'edit_user_profile', 'add_extra_social_links' );

function add_extra_social_links( $user )
{
    ?>
        <h3>Дополнительные данные пользователя</h3>

        <table class="form-table">
            <tr>
                <th><label for="facebook_profile">Facebook Profile</label></th>
                <td><input type="text" name="facebook_profile" value="<?php echo esc_attr(get_the_author_meta( 'facebook_profile', $user->ID )); ?>" class="regular-text" /></td>
            </tr>

            <tr>
                <th><label for="twitter_profile">Twitter Profile</label></th>
                <td><input type="text" name="twitter_profile" value="<?php echo esc_attr(get_the_author_meta( 'twitter_profile', $user->ID )); ?>" class="regular-text" /></td>
            </tr>

            <tr>
                <th><label for="google_profile">Google+ Profile</label></th>
                <td><input type="text" name="google_profile" value="<?php echo esc_attr(get_the_author_meta( 'google_profile', $user->ID )); ?>" class="regular-text" /></td>
            </tr>
        </table>
    <?php
}

Приведенный выше код добавляет на страницу с профилем пользователя 3 новых поля. Стоит обратить внимание на атрибут name у input полей, наименования полей понадобятся при сохранении введенных данных в базу. Также обратите внимание на атрибут value, мы используем функцию get_the_author_meta() для того, чтобы получить уже хранящиеся данные по этому пользователю и выводим их в поля для редактирования.

Для использования этой функции требуется два параметра:

  • $meta_key — ключ поля;
  • $user_id — идентификатор пользователя.
1
2
3
<?php
get_the_author_meta( $meta_key, $user_id );
?>

Функция esc_attr кодирует символы <, >, &, » и ‘.

Сохраняем введенные данные

Когда происходит сохранение данных профиля пользователя WordPress, мы должны добавить собственное действие для сохранения информации в новых полях. В этом нам помогут хаки personal_options_update (сохранение данных пользовательских полей собственного профиля WordPress) и edit_user_profile_update (сохранение данных пользовательских полей чужих профилей WordPress).

Затем мы можем использовать глобальный массив $_POST, чтобы получить данные введенные в пользовательские поля (получаем значение поля по его наименованию) на странице профиля пользователя и занести эти данные в базу. Чтобы обновить данные пользователя в базе мы должны использовать WordPress функцию update_user_meta().

1
2
3
<?php
update_user_meta( $user_id, $meta_key, $meta_value, $prev_value );
?>

Данная функция принимает 4 параметра:

  • $user_id — идентификатор пользователя;
  • $meta_key — ключ поля;
  • $meta_value — значение, которое необходимо сохранить;
  • $prev_value — старое значение, используется для сравнения.
1
2
3
4
5
6
7
8
9
add_action( 'personal_options_update', 'save_extra_social_links' );
add_action( 'edit_user_profile_update', 'save_extra_social_links' );

function save_extra_social_links( $user_id )
{
    update_user_meta( $user_id,'facebook_profile', sanitize_text_field( $_POST['facebook_profile'] ) );
    update_user_meta( $user_id,'twitter_profile', sanitize_text_field( $_POST['twitter_profile'] ) );
    update_user_meta( $user_id,'google_profile', sanitize_text_field( $_POST['google_profile'] ) );
}

Также используется функция sanitize_text_field для обработки сохраняемых данных, удаляет все потенциально опасные символы.

Результат сохранения данных введенных в пользовательские поля

Отображение данных пользователя

Если Вы хотите отобразить информацию о пользователе не только в админке, но и в пределах вашей темы, то есть две функции, которые можно использовать:

  • the_author_meta( $field, $userID )
  • get_the_author_meta( $field, $userID )

Разница между этими двумя функциями в том, что get_the_author_meta() вернет данные, а the_author_meta() выведет данные на экране.

1
2
3
4
5
6
<?php
// вернет значение, можно присвоить переменной
$twitter = get_the_author_meta( 'twitter_profile', $userID );
// выведет на экран (аналогично echo)
the_author_meta( 'twitter_profile', $userID );
?>

Чтобы оставаться в курсе свежих статей и уроков подписывайтесь на еженедельную почтовую рассылку или на новостную ленту RSS. Спасибо!