Проблема: стандартная авторизация WooCommerce не поддерживает вход по телефону
По умолчанию WooCommerce использует email и пароль для авторизации. Если вы хотите реализовать вход через номер телефона (без использования сторонних плагинов), нужно доработать функционал регистрации и авторизации, а также корректно сохранять и проверять телефон пользователя.
Диагностика: как понять, что авторизация по телефону не работает
- Пользователи не могут войти по номеру телефона — форма принимает только email.
- В админке отсутствует поле для телефона в профиле пользователя.
- При попытке использовать номер телефона для входа — появляется ошибка «Неверное имя пользователя».
Пошаговое решение: добавляем авторизацию по номеру телефона
1. Добавляем поле телефона в профиль пользователя и регистрацию
В functions.php вашей темы или дочерней темы добавьте следующий код, чтобы расширить профиль пользователя:
function add_phone_field_to_user_profile( $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_user_meta( $user->ID, 'phone', true ) ); ?>" class="regular-text" /><br />
<span class="description">Введите номер телефона пользователя.</span>
</td>
</tr>
</table>
<?php
}
add_action( 'show_user_profile', 'add_phone_field_to_user_profile' );
add_action( 'edit_user_profile', 'add_phone_field_to_user_profile' );
function save_phone_field( $user_id ) {
if ( !current_user_can( 'edit_user', $user_id ) ) {
return false;
}
update_user_meta( $user_id, 'phone', sanitize_text_field( $_POST['phone'] ) );
}
add_action( 'personal_options_update', 'save_phone_field' );
add_action( 'edit_user_profile_update', 'save_phone_field' );2. Добавляем поле телефона в форму регистрации WooCommerce
В functions.php добавьте:
function add_phone_field_to_registration() {
?>
<p class="form-row form-row-wide">
<label for="reg_phone">Телефон <span class="required">*</span></label>
<input type="text" class="input-text" name="phone" id="reg_phone" value="<?php if ( ! empty( $_POST['phone'] ) ) echo esc_attr( wp_unslash( $_POST['phone'] ) ); ?>" />
</p>
<?php
}
add_action( 'woocommerce_register_form_start', 'add_phone_field_to_registration' );
function validate_phone_field_registration( $errors, $username, $email ) {
if ( empty( $_POST['phone'] ) || ! preg_match( '/^\+?\d{10,15}$/', $_POST['phone'] ) ) {
$errors->add( 'phone_error', 'Пожалуйста, введите корректный номер телефона.' );
}
return $errors;
}
add_filter( 'woocommerce_registration_errors', 'validate_phone_field_registration', 10, 3 );
function save_phone_field_registration( $customer_id ) {
if ( isset( $_POST['phone'] ) ) {
update_user_meta( $customer_id, 'phone', sanitize_text_field( $_POST['phone'] ) );
}
}
add_action( 'woocommerce_created_customer', 'save_phone_field_registration' );3. Реализуем вход через телефон вместо email
Заменим обработку логина, чтобы можно было ввести телефон или email:
function login_with_phone_or_email( $user, $username, $password ) {
if ( is_email( $username ) ) {
return $user; // Стандартная авторизация по email
}
// Поиск пользователя по телефону
$user_query = new WP_User_Query( array(
'meta_key' => 'phone',
'meta_value' => sanitize_text_field( $username ),
'number' => 1,
'count_total' => false,
) );
if ( ! empty( $user_query->results ) ) {
$user = $user_query->results[0];
if ( wp_check_password( $password, $user->user_pass, $user->ID ) ) {
return $user;
}
}
return new WP_Error( 'invalid_login', 'Неверный номер телефона или пароль.' );
}
add_filter( 'authenticate', 'login_with_phone_or_email', 20, 3 );Проверка результата после внедрения
- Зарегистрируйтесь новым пользователем, указав телефон.
- Войдите на сайт, используя номер телефона в поле логина.
- Проверьте, что в профиле пользователя в админке отображается и сохраняется телефон.
- Попробуйте войти с неверным номером или паролем — должна появиться ошибка.
Частые ошибки и как их исправить
- Номер телефона не сохраняется в профиле: Проверьте, что в форме есть поле с name="phone" и что функция сохранения вызывается.
- Ошибка «Неверный номер телефона или пароль» даже при правильных данных: Проверьте формат телефона, он должен совпадать с записью, используйте единый формат с кодом страны.
- Не работает вход по email после внедрения: Убедитесь, что фильтр
authenticateкорректно обрабатывает email и не блокирует стандартный процесс.
Практические советы по безопасности и производительности
- Используйте единый формат телефона, например E.164, чтобы избежать дублирования записей и ошибок при поиске.
- Не храните пароли в открытом виде, используйте стандартные функции WordPress (
wp_hash_password,wp_check_password). - Ограничьте число попыток входа, чтобы предотвратить подбор паролей по телефону.
- Кэшируйте запросы пользователей, если трафик большой, но избегайте кэширования авторизационных запросов.
Сравнение способов реализации авторизации по телефону
| Способ | Плюсы | Минусы |
|---|---|---|
| Код в functions.php | Контроль, отсутствие сторонних плагинов, можно кастомизировать под проект | Требует знаний PHP, возможность ошибок, сложнее поддерживать |
| Плагины авторизации по телефону | Быстрая установка, готовый функционал, поддержка | Зависимость от плагина, возможные конфликты, лишний код |
| Сторонний сервис SMS + кастомный код | Повышенная безопасность, подтверждение номера по SMS | Стоимость SMS, сложнее в настройке |