Как скрыть WooCommerce от неавторизованных пользователей

Проблема: необходимость скрыть каталог и функционал 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Использовать с осторожностью
⭐⭐⭐⭐⭐