Если в магазине WooCommerce пользователи регистрируются через email, а вам нужен вход по телефону, типовая проблема выглядит одинаково: форма регистрации продолжает принимать почту, часть клиентов заводит дубли, а менеджеры потом вручную чистят аккаунты. Встроенной настройки «выключить email и оставить телефон» в WooCommerce нет, поэтому решение обычно сводится к двум шагам: убрать поле email из формы регистрации и добавить собственную логику сохранения телефона как логина.
Ниже — рабочий сценарий без выдуманных хуков и без сторонних «магических» плагинов. Подходит, если вы готовы править код в дочерней теме или в небольшом кастомном плагине.
Когда это действительно нужно
Такой подход имеет смысл, если магазин работает в офлайн- или локальном формате: доставка по телефону, повторные заказы через менеджера, вход в личный кабинет по номеру, а email нужен только как дополнительный контакт в профиле. Если же у вас завязаны письма о заказах, восстановление пароля и маркетинговые цепочки, полностью убирать email из учётной записи не стоит — лучше оставить его необязательным.
Что обычно ломается без доработки
- WooCommerce всё ещё требует email при создании пользователя.
- Пользователь вводит телефон в поле email, и дальше письма не доходят.
- При повторной регистрации появляется дубль, потому что телефон не проверяется на уникальность.
- Восстановление доступа становится неудобным, если не продумать отдельный сценарий.
Диагностика проблемы перед изменениями
Сначала проверьте, где именно у вас создаётся аккаунт: стандартная страница /my-account/, кастомная форма темы или плагин авторизации. Если форма уже переопределена шаблоном, фильтры WooCommerce могут не сработать, и тогда придётся править сам шаблон.
Полезно быстро проверить три вещи:
- включена ли регистрация на странице «Мой аккаунт»;
- используется ли email как обязательное поле;
- есть ли уже плагин, который меняет поля формы регистрации.
Если в админке WooCommerce → Настройки → Аккаунты и конфиденциальность включена регистрация, но вы хотите убрать email только на фронтенде, это нормальный сценарий: сам пользовательский интерфейс меняем, а внутреннюю модель пользователя оставляем совместимой с WordPress.
Пошаговое решение: убрать email и зарегистрировать по телефону
Ниже пример, который:
- убирает поле email из формы регистрации WooCommerce;
- добавляет поле телефона;
- проверяет уникальность телефона;
- сохраняет телефон в user meta;
- использует телефон как логин пользователя.
Лучше вынести код в мини-плагин, а не в functions.php: так проще отключать и тестировать.
<?php
/**
* Plugin Name: WC Phone Registration
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
add_filter( 'woocommerce_registration_errors', function( $errors, $username, $email ) {
$phone = isset( $_POST['billing_phone'] ) ? wc_clean( wp_unslash( $_POST['billing_phone'] ) ) : '';
if ( empty( $phone ) ) {
$errors->add( 'phone_required', __( 'Укажите номер телефона.', 'woocommerce' ) );
return $errors;
}
$existing = get_users( array(
'meta_key' => 'billing_phone',
'meta_value' => $phone,
'number' => 1,
'fields' => 'ID',
) );
if ( ! empty( $existing ) ) {
$errors->add( 'phone_exists', __( 'Пользователь с таким номером уже зарегистрирован.', 'woocommerce' ) );
}
return $errors;
}, 10, 3 );
add_filter( 'woocommerce_registration_generate_username', '__return_false' );
add_filter( 'woocommerce_registration_generate_password', '__return_false' );
add_filter( 'woocommerce_new_customer_data', function( $data ) {
if ( empty( $_POST['billing_phone'] ) ) {
return $data;
}
$phone = wc_clean( wp_unslash( $_POST['billing_phone'] ) );
$data['user_login'] = sanitize_user( $phone, true );
return $data;
} );
add_action( 'woocommerce_created_customer', function( $customer_id ) {
if ( empty( $_POST['billing_phone'] ) ) {
return;
}
$phone = wc_clean( wp_unslash( $_POST['billing_phone'] ) );
update_user_meta( $customer_id, 'billing_phone', $phone );
} );
add_action( 'woocommerce_register_form', function() {
?>
<p class="form-row form-row-wide">
<label for="reg_billing_phone">Телефон <span class="required">*</span></label>
<input type="text" class="input-text" name="billing_phone" id="reg_billing_phone" autocomplete="tel" />
</p>
<?php
} );
add_filter( 'woocommerce_registration_form_fields', function( $fields ) {
unset( $fields['email'] );
return $fields;
} );Этот пример намеренно не пытается полностью переписать всю логику WooCommerce. Он решает конкретную задачу: регистрация без email на фронтенде. Но есть важный нюанс: WordPress-пользователь всё равно должен иметь уникальный user_login. Поэтому телефон нужно нормализовать в одном формате до сохранения. Если клиенты вводят номера как попало, лучше приводить их к единому виду ещё до отправки формы.
Если нужен более аккуратный формат номера
Минимум, который стоит сделать, — убрать пробелы, скобки и дефисы. Иначе один и тот же номер может сохраниться в двух вариантах и проверка уникальности не сработает.
function wcpn_normalize_phone( $phone ) {
$phone = preg_replace( '/[^0-9+]/', '', $phone );
return $phone;
}Тогда в обработчиках выше используйте уже нормализованное значение и для проверки, и для записи.
Сравнение подходов
| Подход | Что даёт | Минус |
|---|---|---|
| Плагин для входа по телефону | Быстро запускается, меньше кода | Часто добавляет лишнюю логику и зависимость |
| Кастомный код | Контроль над формой и данными | Нужно тестировать обновления темы и WooCommerce |
| Оставить email обязательным, телефон добавить как контакт | Самый безопасный вариант для писем и восстановления | Не решает задачу «вход только по телефону» |
Как проверить, что решение сработало
После внедрения не ограничивайтесь визуальной проверкой формы. Пройдите короткий чек-лист:
- откройте страницу
/my-account/в режиме инкогнито; - убедитесь, что поле email отсутствует;
- зарегистрируйте новый аккаунт с телефоном;
- проверьте, что пользователь появился в
Пользователив админке; - посмотрите, записался ли телефон в мета-поле
billing_phone; - попробуйте повторно зарегистрировать тот же номер и убедитесь, что ошибка уникальности срабатывает;
- проверьте вход, если вы используете телефон как
user_login.
Если регистрация проходит, но в админке пустой логин или дубли, значит проблема в нормализации номера или в том, что другой плагин перезаписывает данные пользователя.
Частые ошибки и как их исправить
WooCommerce всё равно требует email
Так бывает, если форма переопределена шаблоном темы или сторонним плагином. Тогда фильтр woocommerce_registration_form_fields уже не влияет на реальную разметку. Решение — найти шаблон myaccount/form-login.php в теме и убрать email прямо там.
Телефон не уникален
Причина обычно в том, что номера сохраняются в разных форматах: +7 (999) 111-22-33 и 79991112233 считаются разными строками. Нормализуйте номер до записи и используйте один формат в проверке.
Пользователь не может войти
Если вы сделали телефон логином, но не изменили форму входа, пользователь всё ещё может ожидать email. Здесь нужен отдельный сценарий: либо подсказка в интерфейсе, либо кастомизация формы входа. Не стоит молча менять логику без явной подсказки на странице.
Письма о заказах перестали доходить
Это уже не баг кода, а следствие архитектурного решения. Если email убран совсем, WooCommerce не сможет отправлять стандартные уведомления на адрес покупателя. В таком случае лучше хранить email как необязательное поле профиля или собирать его позже, на этапе оформления заказа.
Безопасность и производительность
Не храните телефон в открытом виде в логине, если это противоречит вашей политике приватности. Логин виден в админке и может попасть в логи. Если это критично, используйте отдельный внутренний идентификатор, а телефон оставляйте только как мета-поле и отдельный способ входа.
С точки зрения производительности проверка уникальности через get_users() с мета-запросом для небольшого магазина обычно допустима. Но если у вас большая база, стоит заранее продумать индексирование или отдельную таблицу для телефонов. Иначе регистрация начнёт тормозить на росте базы.
Если вы хотите не писать всё вручную, а только убрать лишние SEO-дубли и мусорные страницы в магазине, можно посмотреть на Clearfy Pro: https://wpshop.ru/plugins/clearfy?utm_source=wpauth.ru&utm_medium=article&utm_campaign=wordpress-otklyuchit-registraciyu-po-email-v-woocomerce-i-zastavit-vhod-po-telefonu. Но для самой логики регистрации всё равно нужен код или профильный плагин.
Что делать, если нужен гибридный сценарий
На практике часто лучше не удалять email полностью, а сделать его необязательным: телефон — основной логин, email — дополнительный контакт для чеков, восстановления и уведомлений. Это снижает риск потери доступа и не ломает стандартные письма WooCommerce. Если у вас есть сомнения, начните именно с гибридной схемы и только потом убирайте email из формы регистрации.