wppartner.ru wordpress WP Partner

Как изменить регистрацию пользователей в WordPress с помощью хуков

Регистрация пользователей — важный элемент любого сайта на WordPress, особенно если вы хотите создать сообщество или ограничить доступ к определённому контенту. По умолчанию WordPress предоставляет базовую форму регистрации и минимальный набор полей, но часто возникает необходимость её изменить: добавить новые поля, проверить ввод, отправить дополнительные уведомления или изменить поведение после регистрации.

Почему стоит использовать хуки для изменения регистрации пользователей в WordPress

Изменение стандартного поведения через хуки — это правильный и безопасный способ кастомизации. Хуки позволяют вмешиваться в процесс без изменения исходного кода ядра WordPress, что сохраняет совместимость с обновлениями и снижает риск ошибок.

Основные хуки, связанные с регистрацией пользователей:

  • register_form — позволяет добавить дополнительные поля в форму регистрации;
  • registration_errors — фильтр для проверки и валидации введённых данных;
  • user_register — действие, которое срабатывает после успешной регистрации пользователя;
  • wp_insert_user_data — позволяет изменить данные пользователя перед их сохранением.

Добавление дополнительных полей в форму регистрации через хук register_form

Например, добавим поле «Телефон» в форму регистрации. Для этого используем хук register_form и выведем HTML-код поля.

function wppartner_register_form_phone_field() {
    $phone = isset($_POST['phone']) ? esc_attr($_POST['phone']) : '';
    echo '<p>'
       . '<label for="phone">Телефон</label>'
       . '<input type="text" name="phone" id="phone" class="input" value="' . $phone . '" size="25" />'
       . '</p>';
}
add_action('register_form', 'wppartner_register_form_phone_field');

Этот код добавит простое текстовое поле в форму регистрации. Значение поля сохраняется, чтобы пользователь не терял введённые данные при ошибке.

Валидация новых полей с помощью фильтра registration_errors

Важно проверять введённые данные, чтобы избежать некорректной информации. Используем фильтр registration_errors для проверки поля «Телефон».

function wppartner_registration_errors_phone_validation($errors, $sanitized_user_login, $user_email) {
    if (empty($_POST['phone']) || !preg_match('/^\+?\d{10,15}$/', $_POST['phone'])) {
        $errors->add('phone_error', '<strong>Ошибка:</strong> Введите корректный номер телефона.');
    }
    return $errors;
}
add_filter('registration_errors', 'wppartner_registration_errors_phone_validation', 10, 3);

Здесь мы проверяем, что телефон содержит от 10 до 15 цифр с возможным плюсом в начале. Если проверка не проходит, добавляем ошибку, которую WordPress покажет пользователю.

Сохранение дополнительных полей в метаданных пользователя после регистрации

После успешной регистрации нам нужно сохранить введённый телефон в профиле пользователя. Для этого используем хук user_register.

function wppartner_save_phone_user_meta($user_id) {
    if (!empty($_POST['phone'])) {
        update_user_meta($user_id, 'phone', sanitize_text_field($_POST['phone']));
    }
}
add_action('user_register', 'wppartner_save_phone_user_meta');

Функция update_user_meta добавляет или обновляет метаданные пользователя. Благодаря этому в админке WordPress или через код можно получить номер телефона пользователя.

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

Чтобы администраторы могли видеть и редактировать номер телефона, добавим поле в профиль пользователя.

function wppartner_show_phone_in_profile($user) {
    $phone = get_user_meta($user->ID, 'phone', true);
    ?>
    <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($phone); ?>" class="regular-text" />
            </td>
        </tr>
    </table>
    <?php
}
add_action('show_user_profile', 'wppartner_show_phone_in_profile');
add_action('edit_user_profile', 'wppartner_show_phone_in_profile');

function wppartner_save_phone_profile_field($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', 'wppartner_save_phone_profile_field');
add_action('edit_user_profile_update', 'wppartner_save_phone_profile_field');

Теперь администраторы и сами пользователи могут видеть и редактировать номер телефона в профиле.

Пример плагинов для расширения регистрации пользователей

Если не хочется писать код, можно использовать готовые решения. Вот несколько популярных плагинов, которые позволяют кастомизировать регистрацию:

  • User Registration — простой конструктор форм с множеством полей и интеграциями;
  • Profile Builder — позволяет создавать настраиваемые формы регистрации, редактирования профиля и многое другое;
  • WP User Manager — мощный плагин для управления регистрацией, профилями и ролями.

Однако знание того, как работать с хуками, даст больше гибкости и позволит интегрировать регистрацию с вашим уникальным бизнес-процессом.

Безопасность и рекомендации при кастомизации регистрации

При добавлении новых полей и изменений в форме регистрации важно соблюдать несколько правил:

  • Всегда валидируйте и фильтруйте входящие данные, чтобы избежать XSS и инъекций.
  • Используйте nonce для защиты форм от CSRF-атак.
  • Не храните чувствительные данные в открытом виде, при необходимости используйте шифрование.
  • Проверяйте права доступа при редактировании данных профиля.

Пример добавления nonce в форму регистрации:

function wppartner_register_form_nonce() {
    wp_nonce_field('wppartner_register_action', 'wppartner_register_nonce');
}
add_action('register_form', 'wppartner_register_form_nonce');

И проверка nonce в валидации:

function wppartner_registration_errors_nonce_check($errors) {
    if (!isset($_POST['wppartner_register_nonce']) || !wp_verify_nonce($_POST['wppartner_register_nonce'], 'wppartner_register_action')) {
        $errors->add('nonce_error', '<strong>Ошибка:</strong> Ошибка безопасности, попробуйте снова.');
    }
    return $errors;
}
add_filter('registration_errors', 'wppartner_registration_errors_nonce_check');
×
Делай сайт лучше!!

-20% на премиум темы и плагины

Использовать скидку ⋙