Зачем добавлять дополнительные поля в профиль пользователя WordPress
Иногда стандартного набора полей профиля пользователя в WordPress недостаточно для решения конкретных задач. Например, вам может потребоваться добавить телефон, должность, ссылку на соцсеть или любую другую информацию, важную для сайта или бизнеса. Это особенно актуально для сайтов с регистрацией пользователей, форумов, корпоративных порталов и образовательных платформ.
Добавление пользовательских полей позволяет расширить функциональность, повысить удобство работы администратора и пользователей, а также облегчить интеграцию с внешними сервисами. В данной статье мы разберем, как добавить такие поля в раздел редактирования профиля и как сохранить введенные данные.
Как добавить новое поле в профиль пользователя WordPress: хук show_user_profile и edit_user_profile
Для вывода дополнительного поля в профиле пользователя используются хуки show_user_profile и edit_user_profile. Первый срабатывает при просмотре собственного профиля, второй — при редактировании профиля другого пользователя (администратором).
Рассмотрим пример добавления поля "Телефон" с помощью функции wpreboot_add_custom_user_profile_fields:
function wpreboot_add_custom_user_profile_fields($user) {
?>
<h3>Дополнительная информация</h3>
<table class="form-table">
<tr>
<th><label for="phone">Телефон</label></th>
<td>
<input type="text" name="phone" id="phone" value="<?php echo esc_attr(get_the_author_meta('phone', $user->ID)); ?>" class="regular-text" /><br />
<span class="description">Пожалуйста, укажите ваш номер телефона.</span>
</td>
</tr>
</table>
<?php
}
add_action('show_user_profile', 'wpreboot_add_custom_user_profile_fields');
add_action('edit_user_profile', 'wpreboot_add_custom_user_profile_fields');В этом коде мы выводим поле ввода с названием "Телефон" в виде таблицы, которая органично вписывается в стандартный интерфейс профиля WordPress.
Сохраняем данные дополнительного поля: хуки personal_options_update и edit_user_profile_update
Чтобы данные, введённые в новое поле, сохранялись, нужно обработать их при обновлении профиля. Для этого используются хуки personal_options_update (когда пользователь обновляет свой профиль) и edit_user_profile_update (когда администратор редактирует профиль другого пользователя).
Реализуем функцию wpreboot_save_custom_user_profile_fields, которая валидирует и сохраняет данные:
function wpreboot_save_custom_user_profile_fields($user_id) {
// Проверяем права текущего пользователя
if (!current_user_can('edit_user', $user_id)) {
return false;
}
if (isset($_POST['phone'])) {
// Очищаем данные и сохраняем
update_user_meta($user_id, 'phone', sanitize_text_field($_POST['phone']));
}
}
add_action('personal_options_update', 'wpreboot_save_custom_user_profile_fields');
add_action('edit_user_profile_update', 'wpreboot_save_custom_user_profile_fields');Здесь важно проверять права пользователя, чтобы избежать несанкционированных изменений. Функция sanitize_text_field очищает ввод от потенциально опасных символов.
Пример добавления нескольких полей и улучшение интерфейса
Вы можете добавить сразу несколько полей, например, "Должность" и "Сайт":
function wpreboot_add_multiple_custom_fields($user) {
?>
<h3>Дополнительные контакты</h3>
<table class="form-table">
<tr>
<th><label for="position">Должность</label></th>
<td>
<input type="text" name="position" id="position" value="<?php echo esc_attr(get_the_author_meta('position', $user->ID)); ?>" class="regular-text" />
</td>
</tr>
<tr>
<th><label for="website_custom">Сайт</label></th>
<td>
<input type="url" name="website_custom" id="website_custom" value="<?php echo esc_attr(get_the_author_meta('website_custom', $user->ID)); ?>" class="regular-text" />
</td>
</tr>
</table>
<?php
}
add_action('show_user_profile', 'wpreboot_add_multiple_custom_fields');
add_action('edit_user_profile', 'wpreboot_add_multiple_custom_fields');И дополним сохранение:
function wpreboot_save_multiple_custom_fields($user_id) {
if (!current_user_can('edit_user', $user_id)) {
return false;
}
if (isset($_POST['position'])) {
update_user_meta($user_id, 'position', sanitize_text_field($_POST['position']));
}
if (isset($_POST['website_custom'])) {
update_user_meta($user_id, 'website_custom', esc_url_raw($_POST['website_custom']));
}
}
add_action('personal_options_update', 'wpreboot_save_multiple_custom_fields');
add_action('edit_user_profile_update', 'wpreboot_save_multiple_custom_fields');Обратите внимание, что для URL используется функция esc_url_raw, которая корректно очищает ссылку.
Использование плагинов для добавления полей профиля: преимущества и популярные решения
Если вы не хотите писать код вручную, можно воспользоваться готовыми плагинами, которые позволяют легко и гибко добавлять пользовательские поля:
- Advanced Custom Fields (ACF) — мощный плагин, который позволяет создавать поля различного типа, включая поля для профиля пользователя. С помощью ACF можно быстро настроить интерфейс и вывести поля в шаблонах.
- User Meta Manager — специализированный плагин для управления пользовательскими полями, включая возможность отображать их в профиле и на регистрационных формах.
- Profile Builder — позволяет создать расширенные формы регистрации и редактирования профиля с дополнительными полями без навыков программирования.
Преимущество плагинов в том, что они предоставляют удобный интерфейс, интеграцию с другими плагинами и часто включают валидацию и стилизацию полей.
Вывод данных дополнительных полей на сайте: использование get_user_meta
После того как данные сохранены, вы можете вывести их в любом месте сайта. Для этого используется функция get_user_meta. Пример вывода телефона пользователя с ID 1:
$phone = get_user_meta(1, 'phone', true);
echo 'Телефон пользователя: ' . esc_html($phone);Если вы создаете шаблон автора (author.php или author-{slug}.php), то ID пользователя можно получить с помощью get_the_author_meta('ID') и вывести дополнительные поля динамически.
Советы по безопасности и производительности при работе с пользовательскими полями
При работе с дополнительными полями важно учитывать безопасность:
- Всегда проверяйте права пользователя с помощью
current_user_canперед сохранением данных. - Очищайте ввод с помощью функций
sanitize_text_field,esc_url_rawили других подходящих методов. - Экранируйте вывод через
esc_html,esc_attrи аналогичные функции.
По производительности: не добавляйте слишком много полей без необходимости, т.к. каждое поле — это отдельный мета-запрос к базе данных. Для оптимизации можно кешировать данные или использовать сложные запросы с объединением таблиц.