Диагностика задачи: зачем скрывать товары WooCommerce от гостей
В интернет-магазинах бывают ситуации, когда нужно показывать список продуктов только зарегистрированным и авторизованным пользователям. Например, если магазин работает по подписке или предлагает товары только для оптовых клиентов. Стандартный WooCommerce не имеет встроенных настроек для ограничения доступа к товарам, поэтому необходимо реализовать это самостоятельно через код или плагины.
Как определить, что продукты доступны всем
- Откройте магазин в режиме инкогнито без авторизации.
- Если вы видите страницы товаров и каталога — доступ не ограничен.
- Проверьте исходный код страницы: если есть ссылки на продукты, значит они открыты.
Пошаговое решение: скрываем продукты WooCommerce от гостей через functions.php
Самый надежный способ — фильтровать запрос каталога и одиночных страниц товаров. Добавьте следующий код в файл functions.php активной темы или дочерней темы:
add_action('template_redirect', function() {
if (is_product() || is_shop() || is_product_category() || is_product_tag()) {
if (!is_user_logged_in()) {
wp_redirect(wp_login_url());
exit;
}
}
});Этот код перенаправляет неавторизованных пользователей на страницу входа при попытке открыть каталог или страницу товара.
Как скрыть товары из архивов WooCommerce
Чтобы полностью исключить товары из списка каталога для гостей, используйте фильтр pre_get_posts:
add_action('pre_get_posts', function($query) {
if (!is_admin() && $query->is_main_query() && (is_shop() || is_product_taxonomy())) {
if (!is_user_logged_in()) {
$query->set('post__in', array(0)); // пустой запрос, товары не показываются
}
}
});Как проверить, что решение сработало
- Откройте сайт в браузере без авторизации: каталог и страницы товаров должны перенаправлять на страницу входа.
- После входа под пользователем магазин открывается как обычно.
- В режиме инкогнито проверьте, что на страницах каталога нет товаров.
Частые ошибки и как их исправить
- Ошибка: Перенаправление вызывает бесконечный цикл.
Причина: Страница входа также проверяется и перенаправляется.
Решение: Добавьте условие!is_page('wp-login.php')или используйте!is_page('login')если у вас кастомный URL. - Ошибка: Товары отображаются в поиске и других виджетах.
Причина: Фильтрpre_get_postsне охватывает все запросы.
Решение: Добавьте дополнительные проверки и фильтры для поиска и других типов запросов WooCommerce. - Ошибка: Пользователи видят пустую страницу после логина.
Причина: Нет редиректа после входа.
Решение: Настройте редирект черезlogin_redirectили используйте плагин для управления логином.
Практические советы по безопасности и производительности
- Не используйте плагины с низким рейтингом для ограничения доступа — они могут вызвать конфликты.
- Добавляйте код в дочернюю тему, чтобы не потерять изменения при обновлении.
- Кэширование может мешать корректному перенаправлению — исключите страницы каталога и товаров из кэша для гостей.
- Для повышения безопасности можно дополнительно ограничить прямой доступ к REST API товарам для неавторизованных.
Сравнение методов: код vs плагины vs готовые решения
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
| Код в functions.php | Быстро, без лишних плагинов, гибко | Нужны базовые знания PHP, возможны ошибки | Код из статьи |
| Плагины (например, "Members" или "WooCommerce Members Only") | Удобный интерфейс, дополнительные функции | Дополнительная нагрузка, возможны конфликты | Members |
| Готовые темы с поддержкой приватных магазинов | Полная интеграция | Может быть дорого, сложно настроить | Тема Reboot от WPShop https://wpshop.ru/themes/reboot?utm_source=wphide.ru&utm_medium=article&utm_campaign=skrytie-produktov-woocommerce-ot-neavtorizovannyh-polzovatelej |