Сценарий типичный: магазин хочет принимать заказы только от зарегистрированных клиентов. На витрине это выглядит просто, но на практике всплывают три проблемы сразу: WooCommerce продолжает показывать гостевой checkout, форма регистрации не появляется там, где нужна, а часть заказов всё равно создаётся без аккаунта из-за старых настроек темы или плагинов.
Ниже — рабочий путь без выдуманных хуков и без правки ядра. Подойдёт, если нужно именно запретить оформление заказа без регистрации, а не просто спрятать поле логина.
Когда это действительно нужно
Такую схему обычно включают в магазинах с B2B-продажами, персональными ценами, закрытым каталогом или когда заказ должен сразу попадать в историю клиента. Ещё один частый случай — доставка и оплата завязаны на договор, а менеджеру важно видеть не анонимный заказ, а конкретный аккаунт.
Если у вас обычный розничный магазин, принудительная регистрация часто ухудшает конверсию. Тогда лучше оставить гостевой заказ и отдельно включить создание аккаунта после покупки. Но если бизнес-процесс требует авторизации, настройку лучше сделать один раз и проверить на всех этапах checkout.
Диагностика: что мешает запретить гостевой заказ
Перед изменениями проверьте не только настройки WooCommerce, но и то, что может их переопределять:
- в WooCommerce → Настройки → Аккаунты и приватность включён ли гостевой заказ;
- не добавляет ли тема собственную форму checkout;
- нет ли плагина, который меняет поля оформления заказа или скрывает блок регистрации;
- не используется ли кастомный checkout через блоки или сторонний конструктор;
- не отключена ли регистрация на странице Мой аккаунт.
Если на странице оформления заказа вообще нет блока входа/регистрации, сначала проверьте, что в настройках WooCommerce разрешена регистрация на странице аккаунта. Иначе пользователь просто не увидит способ создать учётную запись.
Что должно быть включено в настройках
Для базового сценария обычно достаточно двух опций:
- разрешить клиентам создавать аккаунт на странице Мой аккаунт;
- разрешить создание аккаунта во время оформления заказа, если вы хотите оставить мягкий сценарий входа.
Но если задача жёсткая — оформление только после входа — вторую опцию лучше отключить и принудительно требовать авторизацию.
Пошаговое решение через настройки и код
Сначала уберите гостевой checkout в админке. Затем добавьте проверку, которая не даст оформить заказ незалогиненному пользователю. Это надёжнее, чем полагаться только на интерфейс.
Добавьте код в мини-плагин или в functions.php дочерней темы. Для продакшена мини-плагин безопаснее: при смене темы правило не потеряется.
<?php
add_filter( 'woocommerce_enable_guest_checkout', '__return_false' );
add_filter( 'woocommerce_checkout_registration_required', '__return_true' );
add_filter( 'woocommerce_checkout_registration_enabled', '__return_true' );
add_action( 'woocommerce_checkout_process', function () {
if ( ! is_user_logged_in() ) {
wc_add_notice(
__( 'Для оформления заказа войдите в аккаунт или зарегистрируйтесь.', 'wpdo' ),
'error'
);
}
} );
Что делает этот код:
woocommerce_enable_guest_checkoutотключает гостевой заказ;woocommerce_checkout_registration_requiredделает регистрацию обязательной;woocommerce_checkout_registration_enabledоставляет регистрацию доступной на checkout, если тема её скрывает;woocommerce_checkout_processдобавляет серверную проверку, чтобы заказ не прошёл даже при обходе интерфейса.
Если вам нужно не просто требовать логин, а ещё и скрыть кнопку оформления для гостей, можно добавить короткую проверку в шаблонную часть темы. Но обычно серверной валидации достаточно: она защищает от прямого POST-запроса к checkout.
Если нужен редирект на страницу входа
Иногда удобнее не показывать ошибку на checkout, а сразу отправлять гостя на страницу авторизации. Это особенно полезно в закрытых магазинах.
<?php
add_action( 'template_redirect', function () {
if ( function_exists( 'is_checkout' ) && is_checkout() && ! is_user_logged_in() && ! is_wc_endpoint_url() ) {
wp_safe_redirect( wc_get_page_permalink( 'myaccount' ) );
exit;
}
} );
Такой вариант лучше применять аккуратно: если у вас есть корзина с сохранёнными товарами, редирект не должен ломать возврат обратно на checkout после входа. Для этого обычно на странице входа нужен понятный путь назад.
Сравнение подходов: настройки, код или плагин
| Подход | Плюсы | Минусы | Когда выбирать |
|---|---|---|---|
| Только настройки WooCommerce | Быстро, без кода | Не всегда блокирует обход формы | Если нужен мягкий сценарий и нет кастомного checkout |
| Код через хуки | Контроль на сервере, надёжно | Нужен доступ к теме или мини-плагину | Если гостевой заказ нужно запретить жёстко |
| Плагин для checkout | Удобно для менеджера | Лишняя зависимость, возможны конфликты | Если уже используете плагин для кастомизации checkout |
Если у вас уже стоит плагин для чистки WooCommerce-настроек или отключения лишнего функционала, например Clearfy Pro, проверьте, не отключает ли он блоки регистрации или не меняет ли поведение checkout. В таких случаях сначала тестируйте на staging.
Как проверить, что решение сработало
Проверка должна быть не только визуальной. Пройдите её в двух режимах: как гость и как авторизованный пользователь.
- Откройте корзину в приватном окне браузера.
- Перейдите к оформлению заказа без входа в аккаунт.
- Убедитесь, что checkout не отправляется и появляется сообщение об ошибке или редирект на Мой аккаунт.
- Войдите под тестовой учётной записью и повторите оформление.
- Проверьте, что заказ создаётся с привязкой к пользователю, а не как guest order.
- Посмотрите письмо о заказе и карточку заказа в админке: у клиента должен быть указан аккаунт.
Дополнительно откройте страницу заказа в админке и проверьте поле клиента. Если заказ всё ещё создаётся без пользователя, значит где-то остался обходной путь: кастомная форма, старый плагин оформления или отдельный endpoint.
Частые ошибки и как их исправить
Гостевой заказ всё ещё доступен
Чаще всего причина в том, что тема или плагин переопределяет стандартный checkout. Проверьте, не используется ли кастомный шаблон form-checkout.php. Если да, сравните его с актуальной версией WooCommerce и временно переключитесь на стандартную тему.
Регистрация отключена полностью
Иногда после жёсткой настройки пользователь не видит вообще никакой формы входа. Это происходит, если отключили регистрацию и на checkout, и на странице Мой аккаунт. В таком случае оставьте регистрацию доступной хотя бы на странице аккаунта.
Ошибка появляется, но заказ всё равно создаётся
Значит, проверка работает только на фронтенде или в шаблоне. Нужна серверная валидация через woocommerce_checkout_process. Без неё пользователь может отправить запрос напрямую.
Редирект ломает возврат в корзину
Если после логина клиент не возвращается к покупке, проверьте, как настроена страница входа и есть ли у вас плагин, который меняет redirect после авторизации. Иногда проблема не в WooCommerce, а в отдельном плагине безопасности или членства.
Практические советы по безопасности и производительности
Если вы делаете закрытый магазин, не ограничивайтесь только checkout. Проверьте ещё и доступ к каталогу, ценам и API, если они не должны быть публичными. Иначе пользователь сможет увидеть товар через прямую ссылку или выгрузку из REST API.
Для производительности лучше не вешать логику на каждый запрос без необходимости. Если правило простое, достаточно фильтров WooCommerce и одной серверной проверки на checkout. Не добавляйте тяжёлые запросы к базе в template_redirect, если можно обойтись штатными хуками.
Если нужно централизованно управлять такими настройками, удобнее вынести код в небольшой mu-plugin или отдельный мини-плагин магазина. Тогда правило не потеряется после обновления темы и его проще отключить на staging.
В итоге рабочая схема выглядит так: отключаем гостевой checkout в настройках, добавляем серверную проверку, тестируем в приватном окне и убеждаемся, что заказ создаётся только для авторизованных клиентов. Это тот случай, когда лучше один раз проверить весь путь, чем потом разбирать анонимные заказы вручную.