Проблема: необходимость скрыть каталог и функционал WooCommerce от гостей сайта
В интернет-магазинах на WooCommerce часто возникает задача ограничить доступ к товарам и страницам магазина только для зарегистрированных и авторизованных пользователей. Например, для B2B-сайтов, оптовых магазинов или закрытых клубов. Без правильной настройки посетители без входа могут видеть товары, цены и возможность оформления заказа, что не всегда приемлемо.
Диагностика: как проверить, что WooCommerce открыт для всех
- Откройте сайт в режиме инкогнито или выйдите из аккаунта.
- Попробуйте перейти на любую страницу товара, категорию или корзину.
- Если товары и кнопки «Добавить в корзину» видны и доступны — доступ не ограничен.
- Если есть возможность оформить заказ без входа — тоже значит, что ограничений нет.
Для более детальной проверки можно использовать средства разработчика браузера и посмотреть, какие REST API и AJAX-запросы доступны без авторизации.
Пошаговое решение: скрываем WooCommerce от гостей с помощью кода
Самый простой и надежный способ — запретить доступ к страницам WooCommerce неавторизованным, перенаправляя их на страницу входа.
Добавьте следующий код в functions.php активной темы или в отдельный site-specific плагин:
function wphide_restrict_woocommerce_access() {
if ( ! is_user_logged_in() ) {
if ( is_woocommerce() || is_cart() || is_checkout() || is_account_page() ) {
wp_redirect( wp_login_url( get_permalink() ) );
exit;
}
}
}
add_action( 'template_redirect', 'wphide_restrict_woocommerce_access' );Объяснение:
is_user_logged_in()— проверяем статус пользователя.is_woocommerce()— проверяет страницы магазина и товаров.is_cart(),is_checkout(),is_account_page()— дополнительные страницы WooCommerce.wp_redirect()— отправляет на страницу входа, сохраняя текущий URL для возврата после логина.
Скрытие товаров на страницах архивов и виджетах
Чтобы полностью скрыть товары из списка и виджетов для гостей, добавьте фильтр, который убирает товары из запросов:
function wphide_exclude_products_for_guests( $query ) {
if ( ! is_admin() && $query->is_main_query() && ! is_user_logged_in() ) {
if ( is_shop() || is_product_category() || is_product_tag() ) {
$query->set( 'post__in', array(0) );
}
}
}
add_action( 'pre_get_posts', 'wphide_exclude_products_for_guests' );Этот код заставляет WP возвращать пустой список товаров гостям.
Проверка результата после внедрения
- Откройте сайт в режиме инкогнито.
- Перейдите на любую страницу магазина, товара, корзины или оформления заказа.
- Вы должны быть автоматически перенаправлены на страницу входа.
- На страницах архивов товаров не должно отображаться ни одного продукта.
- После авторизации доступ к WooCommerce возвращается.
Частые ошибки и как их исправить
- Перенаправление в цикл: Если страница входа находится внутри WooCommerce или настроена неправильно, может возникнуть бесконечный редирект. Проверьте URL страницы входа и используйте
wp_login_url(). - Открытые REST API: Даже при закрытии страниц, REST API WooCommerce может быть доступен. Для ограничения добавьте фильтры по правам доступа к API.
- Кеширование: Кеширующие плагины или сервер могут показывать содержимое магазина гостям. Очистите кеш и настройте исключения для страниц входа и WooCommerce.
- Отсутствие перенаправления на страницу входа: Проверьте, что код добавлен в правильное место и хук
template_redirectкорректно срабатывает.
Практические советы по безопасности и производительности
- Добавляйте проверку авторизации на уровне REST API и AJAX-запросов, чтобы предотвратить обход через API.
- Используйте объектный кеш для улучшения производительности, но исключайте кеширование страниц с динамическими редиректами для гостей.
- Если магазин большой, рассмотрите ограничение видимости товаров на уровне SQL-запросов, чтобы избежать лишней нагрузки.
- Для удобства пользователей на странице входа выводите сообщение о необходимости авторизации для просмотра магазина.
Сравнение методов ограничения доступа к WooCommerce
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Кодовое перенаправление в template_redirect | Простое, быстрое, не требует плагинов | Можно пропустить API, требует тестирования | Добавить фильтры на REST API |
| Плагины для ограничения доступа | Готовые настройки, часто с UI | Дополнительная нагрузка, может конфликтовать | Использовать проверенные плагины |
| Полное отключение WooCommerce для гостей | Максимальная безопасность | Сложно реализовать, может влиять на SEO | Использовать с осторожностью |