В чем суть задачи: ограничение доступа к товарам для неавторизованных пользователей
В интернет-магазинах на WooCommerce иногда возникает необходимость показывать товары только авторизованным пользователям. Это может быть актуально для магазинов с эксклюзивными товарами, B2B-площадок или для ограниченного круга клиентов. В стандартной комплектации WooCommerce не предлагает такого функционала, поэтому требуется вмешательство в код или использование плагинов.
Диагностика проблемы: как понять, что товары доступны всем
Если вы заметили, что ваш магазин показывает цены или позволяет добавлять товары в корзину гостям, хотя этого не должно быть, первым делом убедитесь, что не используется сторонних плагинов, ограничивающих доступ. Проверьте следующие моменты:
- На страницах товаров и каталога доступен полный список товаров без ограничений.
- Гости могут видеть цены и кнопки «Добавить в корзину».
- Нет настроек в теме или плагинах, ограничивающих видимость.
Для проверки откройте магазин в режиме инкогнито и сравните с отображением авторизованного пользователя.
Решение: ограничение доступа к товарам через функции темы
Самый простой способ — добавить фильтр, который проверяет авторизацию пользователя и при отсутствии доступа перенаправляет на страницу входа или показывает сообщение.
Шаг 1. Скрыть товары в каталоге для гостей
Добавим фильтр к запросу WooCommerce, который исключит товары для гостей:
add_action('pre_get_posts', function($query) {
if (is_admin() || !$query->is_main_query()) {
return;
}
if (is_shop() || is_product_category() || is_product_tag()) {
if (!is_user_logged_in()) {
$query->set('post__in', array(0)); // Пустой массив для исключения товаров
}
}
});Шаг 2. Перенаправление при попытке открыть страницу товара гостем
Чтобы предотвратить просмотр отдельной страницы товара, добавим проверку в шаблон single-product:
add_action('template_redirect', function() {
if (is_product() && !is_user_logged_in()) {
wp_redirect(wp_login_url(get_permalink()));
exit;
}
});Шаг 3. Скрыть цены и кнопку «Добавить в корзину»
Даже если страница доступна, можно скрыть цены и отключить возможность покупки:
add_filter('woocommerce_get_price_html', function($price) {
if (!is_user_logged_in()) {
return '<span>Требуется авторизация для просмотра цены</span>';
}
return $price;
});
remove_action('woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30);Проверка результата
- Откройте магазин в режиме инкогнито: на странице каталога не должно отображаться товаров.
- Попытка открыть любой товар должна привести на страницу входа.
- После авторизации товары, цены и кнопки должны отображаться как обычно.
Частые ошибки и как их исправить
- Проблема: товары все равно видны гостям.
Причина: фильтрpre_get_postsне срабатывает из-за приоритетов или конфликтов с другими плагинами.
Решение: убедитесь, что добавляете код в файл functions.php дочерней темы или в плагин, и что нет конфликтов. - Проблема: после перенаправления возникает цикл.
Причина: некорректная проверка условий вtemplate_redirect.
Решение: добавить проверку, что текущий URL не является страницей логина или выхода. - Проблема: цена и кнопка остались видимыми.
Причина: удаление кнопки происходит только на странице товара, но не в других местах.
Решение: добавьте дополнительные фильтры для вывода цены и кнопок в виджетах и архивах.
Практические советы по безопасности и производительности
- Не используйте для ограничения доступа плагины с плохими отзывами или без обновлений, чтобы не подвергать сайт риску.
- Кэширование страниц может мешать динамическому ограничению доступа — настраивайте исключения для страниц магазина.
- Если требуется массовое ограничение доступа, рассмотрите использование специализированных плагинов, например, «Members» или «Restrict Content Pro», но с пониманием, что они добавляют нагрузку.
Сравнение способов ограничения доступа
| Способ | Преимущества | Недостатки |
|---|---|---|
| Собственный код в functions.php | Легко кастомизировать, бесплатно, быстро | Требует навыков, может конфликтовать с плагинами |
| Плагины (Members, Restrict Content Pro) | Готовые функции, удобный интерфейс, поддержка ролей | Дополнительная нагрузка, возможна плата за функционал |
| Комбинированный подход | Максимальная гибкость и масштабируемость | Сложнее в поддержке |