Проблема: невозможность повторного прохождения курса в LearnPress
По умолчанию LearnPress не позволяет учащимся пройти курс повторно после его успешного завершения. Это создает неудобства, если студент хочет освежить знания или пересмотреть материал с нуля. Как исправить это ограничение и разрешить повторное прохождение курса?
Диагностика проблемы
Убедитесь, что курс после завершения блокируется для повторного прохождения:
- Зайдите под аккаунтом ученика и пройдите курс до конца.
- Попробуйте заново стартовать тот же курс.
- Если кнопка «Начать курс» отсутствует, либо курс автоматически открывается с последнего пройденного урока, значит повторное прохождение запрещено.
Это поведение связано с внутренней логикой LearnPress, где завершённый курс фиксируется в мета данных пользователя и не позволяет заново стартовать.
Пошаговое решение: разрешаем повторный старт курса
1. Сброс статуса курса после завершения
Добавим код, который позволит сбросить статус завершения курса, тем самым открывая возможность пройти курс заново.
add_action('template_redirect', function() {
if (is_singular('lp_course') && is_user_logged_in()) {
$user_id = get_current_user_id();
$course_id = get_the_ID();
$user_course = LP_User_Course::get_user_course($course_id, $user_id);
if ($user_course && $user_course->has_finished()) {
// Сбрасываем статус завершения
$user_course->reset();
}
}
});Этот код сбрасывает информацию о завершении курса при каждом заходе на страницу курса. Это простой способ, но может создавать нагрузку при большом числе пользователей.
2. Добавление кнопки для повторного прохождения курса
Более гибкий способ — добавить кнопку сброса статуса курса для пользователя:
add_shortcode('lp_reset_course', function() {
if (!is_user_logged_in() || !is_singular('lp_course')) {
return '';
}
$user_id = get_current_user_id();
global $post;
$course_id = $post->ID;
if (isset($_POST['lp_reset_course'])) {
$user_course = LP_User_Course::get_user_course($course_id, $user_id);
if ($user_course) {
$user_course->reset();
echo '<div class="notice success">Курс успешно сброшен. Вы можете пройти его заново.</div>';
}
}
return '<form method="post"><button type="submit" name="lp_reset_course">Пройти курс заново</button></form>';
});Добавьте шорткод [lp_reset_course] в описание курса или на отдельную страницу.
Проверка результата после внедрения
- Пройдите курс от имени тестового пользователя.
- После завершения зайдите на страницу курса.
- Появится кнопка «Пройти курс заново».
- Нажмите кнопку, статус курса сбросится.
- Теперь можно начать курс с начала и пройти заново.
Частые ошибки и как их исправить
- Кнопка не отображается: Проверьте, что вы добавили шорткод в нужное место и что пользователь авторизован.
- Статус не сбрасывается: Убедитесь, что класс
LP_User_Courseдоступен (плагин LearnPress активен). - Курс автоматически начинается с последнего урока: Возможно, кэширует браузер или сервер, очистите кэш.
Практические советы по безопасности и производительности
- Не сбрасывайте статус курса на каждом заходе (как в первом примере), чтобы не создавать лишнюю нагрузку.
- Добавляйте сброс статуса только по запросу, например, через кнопку.
- Проверяйте права пользователя, чтобы избежать сброса чужих данных.
- Для улучшения UX можно добавить подтверждение перед сбросом.
Таблица сравнения вариантов решения
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
| Автоматический сброс при заходе | Простота, не требует действий пользователя | Нагрузка на сервер, неудобно для постоянных пользователей | Использовать только на небольших сайтах |
| Кнопка сброса (через шорткод) | Контроль пользователя, меньше нагрузки | Требует взаимодействия пользователя | Оптимальный вариант для большинства |