На учебных сайтах часто нужно не просто продавать курс, а разделять доступ по ролям: студент видит только свои материалы, преподаватель — админскую часть, а гостю вообще не показываются закрытые курсы. В LearnPress это можно собрать без тяжелых костылей, если правильно разделить задачу: где-то достаточно настроек видимости, а где-то нужен небольшой код для проверки роли перед выдачей доступа.
Когда проблема проявляется на практике
Типичный сценарий выглядит так: курс опубликован, но его видят все посетители; либо пользователь после регистрации попадает в личный кабинет, но не может открыть курс, хотя роль у него правильная; либо администратор хочет закрыть часть курсов только для subscriber, customer или отдельной кастомной роли. Если ограничение сделано только на уровне меню или страницы, прямой URL курса все равно может открываться.
Что проверить до правок
- Курс действительно опубликован и не скрыт настройками темы.
- У пользователя назначена нужная роль, а не только статус в LearnPress.
- Нет конфликта с WooCommerce, если доступ выдается после покупки.
- Страница курса не кэшируется для гостей без учета авторизации.
Если у вас уже есть интеграция LearnPress с WooCommerce, сначала проверьте, не выдает ли магазин доступ через заказ. В противном случае можно случайно закрыть курс даже для оплативших пользователей.
Какие есть варианты ограничения доступа
| Подход | Когда подходит | Минус |
|---|---|---|
| Настройки LearnPress и видимость контента | Нужно скрыть курс от гостей без сложной логики | Не всегда хватает для проверки роли на уровне URL |
Код через template_redirect или фильтр | Нужна жесткая проверка перед открытием курса | Требует аккуратной реализации и тестирования |
| Плагин для ограничения контента | Нужно быстро закрыть часть материалов без разработки | Может конфликтовать с шаблонами и кэшированием |
Для точечного сценария обычно лучше код: он предсказуемее, чем набор разрозненных настроек, и проще отлаживается. Но если у вас нет разработчика, сначала проверьте, можно ли решить задачу штатными средствами LearnPress и ролями WordPress.
Пошаговое решение через проверку роли
Ниже пример для дочерней темы или небольшого плагина. Логика простая: если пользователь не авторизован или не имеет нужной роли, доступ к одиночной странице курса блокируется и идет редирект на страницу входа или на общую страницу курсов.
<?php
add_action( 'template_redirect', 'lp_restrict_course_access_by_role' );
function lp_restrict_course_access_by_role() {
if ( ! function_exists( 'learn_press_get_course' ) ) {
return;
}
if ( ! is_singular( 'lp_course' ) ) {
return;
}
$allowed_roles = array( 'customer', 'student' );
if ( ! is_user_logged_in() ) {
wp_safe_redirect( wp_login_url( get_permalink() ) );
exit;
}
$user = wp_get_current_user();
$roles = (array) $user->roles;
if ( empty( array_intersect( $allowed_roles, $roles ) ) ) {
wp_safe_redirect( home_url( '/courses/' ) );
exit;
}
}
Этот вариант не трогает внутреннюю логику LearnPress, а только закрывает доступ к странице курса. Для большинства сайтов этого достаточно: пользователь не увидит контент, даже если знает прямую ссылку.
Если нужно закрыть не только курс, но и уроки
Тогда проверку надо расширить на связанные типы записей, если они используются в вашей установке. У LearnPress структура может отличаться в зависимости от версии и набора аддонов, поэтому сначала посмотрите, какие post type реально используются на сайте. Не стоит без проверки вешать ограничение на все подряд.
<?php
add_action( 'template_redirect', 'lp_restrict_lp_content_by_role' );
function lp_restrict_lp_content_by_role() {
$restricted_post_types = array( 'lp_course', 'lp_lesson', 'lp_quiz' );
if ( ! is_singular( $restricted_post_types ) ) {
return;
}
if ( ! is_user_logged_in() ) {
wp_safe_redirect( wp_login_url( get_permalink() ) );
exit;
}
$allowed_roles = array( 'customer', 'student' );
$user_roles = (array) wp_get_current_user()->roles;
if ( ! array_intersect( $allowed_roles, $user_roles ) ) {
wp_safe_redirect( home_url( '/courses/' ) );
exit;
}
}
Как не сломать доступ оплатившим пользователям
Самая частая ошибка — закрыть курс по роли, но забыть, что после покупки доступ может выдаваться не ролью, а самим фактом записи на курс. В таком случае пользователь формально не подходит под вашу проверку и получает редирект, хотя оплатил обучение.
Если доступ у вас завязан на зачисление в курс, лучше проверять не только роль, но и факт enrollment. Для этого можно использовать функции LearnPress, если они доступны в вашей версии, либо сначала вывести диагностику и посмотреть, как именно сайт хранит доступ.
<?php
add_action( 'wp_footer', 'lp_debug_current_user_role' );
function lp_debug_current_user_role() {
if ( ! current_user_can( 'manage_options' ) ) {
return;
}
$user = wp_get_current_user();
echo '<pre style="background:#fff;padding:12px;border:1px solid #ddd;">';
echo 'User ID: ' . esc_html( $user->ID ) . "\n";
echo 'Roles: ' . esc_html( implode( ', ', (array) $user->roles ) ) . "\n";
echo '</pre>';
}
Такой вывод помогает быстро понять, почему ограничение срабатывает не так, как ожидалось: роль не та, пользователь не залогинен или редирект уводит на неправильную страницу.
Проверка результата после внедрения
После добавления кода проверьте сценарий не только от имени администратора. Админ почти всегда проходит любые проверки, поэтому тестировать нужно отдельным пользователем с ролью, которая должна быть ограничена.
- Откройте курс в режиме инкогнито без авторизации.
- Проверьте редирект на страницу входа или каталог курсов.
- Войдите под пользователем с разрешенной ролью и убедитесь, что курс открывается.
- Войдите под пользователем с запрещенной ролью и проверьте, что доступ закрыт.
- Если есть WooCommerce, проверьте покупку и переход в курс после оплаты.
Если после правки курс все равно открывается гостям, почти всегда виноват кэш: серверный, плагин кэширования или CDN. В таком случае исключите страницы курсов из кэширования для неавторизованных пользователей.
Частые ошибки и как их исправить
Редирект зацикливается
Это происходит, если вы отправляете пользователя на страницу, которая тоже попадает под проверку. Например, на страницу входа или на архив, где снова срабатывает тот же код. Решение простое: исключите из проверки страницу логина, регистрацию и каталог курсов.
Курс закрыт для всех, включая студентов
Обычно причина в том, что роль у пользователя не student или customer, а другая. В WordPress роль может называться иначе, особенно если используется кастомная логика регистрации. Проверьте массив $user->roles и подставьте реальные значения.
Оплатившие пользователи теряют доступ
Если доступ выдается через WooCommerce, не ограничивайте только по роли. Сначала проверьте, как у вас работает связка: роль, статус заказа или enrollment в LearnPress. Иногда правильнее ограничивать только гостей, а авторизованным студентам не мешать.
Курс виден в поиске и по прямой ссылке
Это нормальная ситуация, если вы закрыли только шаблон страницы. Если нужно полностью скрыть курс, дополнительно настройте видимость в архиве, меню и поиске. Для этого уже может понадобиться отдельная логика фильтрации запросов.
Практические советы по безопасности и производительности
Не храните список разрешенных ролей прямо в нескольких файлах темы. Лучше вынести его в одно место, чтобы не забыть обновить проверку после изменения структуры сайта. Если у вас много курсов и сложная логика доступа, держите код в небольшом плагине, а не в functions.php активной темы.
Для сайтов с высокой нагрузкой не делайте тяжелые запросы к базе на каждом открытии страницы курса. Проверка роли через wp_get_current_user() обычно дешевая, а вот дополнительные запросы к заказам и записям лучше кешировать или выполнять только там, где это действительно нужно.
Если вам нужно не только ограничить доступ, но и аккуратно оформить закрытые блоки внутри курса, можно использовать отдельные инструменты разметки и уведомлений. Например, для заметных предупреждений на странице курса удобно применять блоки WPRemark, но это уже вопрос интерфейса, а не самой авторизации.
В итоге рабочая схема такая: сначала определяете, чем именно у вас выдается доступ — ролью, покупкой или зачислением в курс; затем ставите проверку на нужный тип страниц; после этого тестируете гостя, разрешенную роль и оплатившего пользователя отдельно. Только так ограничение по ролям в LearnPress не станет случайной блокировкой для всех подряд.