Как создать страницу редактирования профиля для пользователей?
Как создать страницу редактирования профиля для пользователей во фронтенде с пользовательскими полями в WordPress?
Примеры полей:
Поле для загрузки изображения
Текстовое поле
И так далее...
И как пользователь может сохранить эти поля?
Вот пример решения:
// Создаем шорткод для формы редактирования профиля
add_shortcode('edit_profile_form', 'custom_edit_profile_form');
function custom_edit_profile_form() {
if (!is_user_logged_in()) {
return 'Пожалуйста, войдите в систему для редактирования профиля.';
}
$current_user = wp_get_current_user();
// Обработка отправки формы
if ($_POST['update_profile']) {
// Обновление текстового поля
update_user_meta($current_user->ID, 'custom_text_field', sanitize_text_field($_POST['custom_text_field']));
// Обработка загрузки изображения
if ($_FILES['profile_image']) {
require_once(ABSPATH . 'wp-admin/includes/image.php');
require_once(ABSPATH . 'wp-admin/includes/file.php');
require_once(ABSPATH . 'wp-admin/includes/media.php');
$attachment_id = media_handle_upload('profile_image', 0);
if (!is_wp_error($attachment_id)) {
update_user_meta($current_user->ID, 'profile_image', $attachment_id);
}
}
}
// Получаем текущие значения
$custom_text = get_user_meta($current_user->ID, 'custom_text_field', true);
$profile_image_id = get_user_meta($current_user->ID, 'profile_image', true);
// Форма HTML
$form = '
<form method="post" enctype="multipart/form-data">
<div>
<label>Текстовое поле:</label>
<input type="text" name="custom_text_field" value="' . esc_attr($custom_text) . '">
</div>
<div>
<label>Изображение профиля:</label>
<input type="file" name="profile_image">
</div>';
if ($profile_image_id) {
$form .= '<div>Текущее изображение:<br>' . wp_get_attachment_image($profile_image_id, 'thumbnail') . '</div>';
}
$form .= '
<input type="submit" name="update_profile" value="Обновить профиль">
</form>';
return $form;
}
Чтобы использовать эту форму, добавьте шорткод [edit_profile_form] на любую страницу или в шаблон.
Этот код:
- Создает форму редактирования профиля с текстовым полем и загрузкой изображения
- Проверяет авторизацию пользователя
- Безопасно обрабатывает и сохраняет данные
- Показывает текущее изображение профиля, если оно существует
Для дополнительной безопасности рекомендуется добавить nonce-проверку и дополнительную валидацию полей.

Это довольно масштабная задача, но в целом вы делаете следующее:
Добавляете дополнительные поля пользователя с помощью кода из этого ответа: Дополнительные поля пользователя
Изменяете их с помощью пользовательского шаблона:
/* Получаем информацию о пользователе. */
global $current_user, $wp_roles;
get_currentuserinfo();
Теперь у вас есть данные авторизованного пользователя, которые можно изменить. Создаете поля для изменения пользователем и заполняете их текущей информацией, например:
<input name="first_name" type="text" id="first_name" value="<?php the_author_meta( 'first_name', $current_user->ID ); ?>" />
Затем сохраняете данные: сначала проверяете на пустоту, затем перезаписываете данные.
if ( ! empty( $_POST['first_name'] ) )
update_user_meta( $current_user->ID, 'first_name', sanitize_text_field( $_POST['first_name'] ) );
Затем перенаправляете пользователя, если данные сохранены:
/* Перенаправляем, чтобы страница отобразила обновленную информацию. */
if ( count( $error ) == 0 ) {
//хук для плагинов и сохранения дополнительных полей
do_action('edit_user_profile_update', $current_user->ID);
$location = get_user_meta( $current_user->ID, 'user_location', true );
wp_safe_redirect( get_bloginfo('url') . str_replace( ' ','-', $location ) );
exit;
}
Это работает именно так. Я сделал точно так же.

@Interactive - не могли бы вы подробнее объяснить редирект с отображением обновленной информации? У меня все работает, кроме того, что после отправки формы на странице отображаются старые данные в полях формы. Если обновить страницу, то появляется новая информация. Пользователь обновляется, как я проверил в админке. Спасибо!
