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

Диагностика проблемы: зачем скрывать WooCommerce от гостей

Во многих проектах возникает задача ограничить просмотр каталога и страниц WooCommerce только для авторизованных пользователей. Например, сайт работает как закрытый клуб, или магазин доступен только по подписке. Без дополнительной настройки WooCommerce открывает каталоги и страницы товаров для всех, что не всегда приемлемо.

Проверить изначальное поведение легко: откройте сайт в режиме инкогнито и перейдите на страницу магазина или товар. Если видны цены, описание и кнопки «Добавить в корзину» — WooCommerce не ограничен.

Пошаговое решение: скрываем WooCommerce для гостей через functions.php

1. Добавляем проверку авторизации и редирект

Вставьте следующий код в functions.php вашей активной темы или в mu-плагин:

add_action('template_redirect', function() {
    if ( ! is_user_logged_in() && ( is_shop() || is_product_category() || is_product() ) ) {
        wp_redirect( wp_login_url( get_permalink() ) );
        exit;
    }
});

Что делает код:

  • Проверяет, что пользователь не авторизован.
  • Определяет, что сейчас отображается магазин, категория товаров или страница товара.
  • Перенаправляет на страницу входа с возвратом на исходную страницу после логина.

2. Ограничение доступа к AJAX-запросам WooCommerce

WooCommerce активно использует AJAX для мини-корзины и обновления данных. Чтобы не было утечек, блокируем AJAX-запросы для гостей:

add_action('wp_ajax_nopriv_woocommerce_get_refreshed_fragments', function() {
    wp_send_json_error('Доступ запрещен');
    wp_die();
});

3. Скрытие виджетов и шорткодов WooCommerce для гостей

Если на сайте используются виджеты WooCommerce, можно условно скрывать их вывод:

add_filter('widget_display_callback', function($instance, $widget, $args) {
    if ( ! is_user_logged_in() && in_array(get_class($widget), ['WC_Widget_Cart', 'WC_Widget_Product_Categories', 'WC_Widget_Recent_Reviews']) ) {
        return false;
    }
    return $instance;
}, 10, 3);

Проверка результата после внедрения

1. Выйдите из аккаунта или откройте сайт в режиме инкогнито.
2. Попробуйте перейти на страницу магазина, категорию или товар — должна сработать переадресация на страницу входа.
3. После авторизации вы должны попасть на исходную страницу.
4. Проверьте, что AJAX-запросы мини-корзины не работают для гостей (через инструменты разработчика в браузере).
5. Убедитесь, что виджеты WooCommerce не отображаются гостям.

Частые ошибки и как их исправить

  • Редирект в бесконечный цикл: проверьте, что условие редиректа не срабатывает на странице входа. Код выше использует wp_login_url() с параметром возврата, это предотвращает цикл.
  • Пользователь видит пустые страницы: если шаблоны WooCommerce кастомизированы, убедитесь, что условия is_shop() и is_product() работают корректно.
  • AJAX-запросы WooCommerce продолжают работать: добавьте другие AJAX-хуки, если у вас есть кастомные запросы, или используйте фильтр woocommerce_ajax_get_refreshed_fragments для полной фильтрации.
  • Виджеты продолжают показываться: проверьте классы виджетов через var_dump(get_class($widget)), возможно, используются кастомные виджеты.

Практические советы по безопасности и производительности

  • Реализуйте кеширование страниц с учётом авторизации, чтобы не показывать кешированные версии гостям.
  • Отключите индексацию страниц WooCommerce для гостей через robots.txt и мета-теги noindex, если каталог не предназначен для поисковиков.
  • При большом трафике используйте серверные правила (например, через nginx) для быстрого ограничения доступа к URL магазина, что разгрузит PHP.

Сравнение способов скрытия WooCommerce

МетодПлюсыМинусы
Редирект через functions.phpЛегко внедряется, не требует плагиновМожет конфликтовать с кастомными шаблонами
Использование плагинов (например, Members, User Access Manager)Гибкие настройки ролей и правДополнительная нагрузка, необходимость обновления
Серверные правила (htaccess/nginx)Высокая производительность, блокировка на уровне сервераСложнее в настройке, менее гибко
⭐⭐⭐⭐⭐