Как отключить регистрацию по email в WooCommerce и оставить вход по телефону

Если в магазине 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 из формы регистрации.

WordPress REST API: создание кастомной аутентификации по токену
25.01.2026
WooCommerce: ограничение доступа к страницам по ролям пользователей
26.04.2026
WooCommerce: автоматическое удаление пользователя при отмене подписки
07.07.2026
WooCommerce: автоматическое удаление пользователя при отмене подписки
05.06.2026
WordPress авторизация без cookie: решение проблем и примеры кода
06.02.2026