Диагностика проблемы: зачем скрывать 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) | Высокая производительность, блокировка на уровне сервера | Сложнее в настройке, менее гибко |