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

Диагностика задачи: зачем скрывать товары 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
⭐⭐⭐⭐⭐