Отсрочка просмотра уроков — востребованная функция для образовательных платформ на LearnPress, которая позволяет контролировать доступ студентов к материалам курса по времени. Такая задержка помогает стимулировать регулярное обучение и уменьшить возможность быстрого прохождения курса без усвоения материала.
Зачем нужна отсрочка просмотра уроков в LearnPress
В стандартном LearnPress все уроки становятся доступны сразу после покупки или подписки на курс. Но в ряде случаев важно ограничить доступ к урокам, например, открывать следующий урок только через определённое время после предыдущего. Это позволяет:
- Стимулировать систематическое обучение;
- Контролировать скорость прохождения курса;
- Улучшить усвоение знаний;
- Создать эффект живого курса с расписанием.
Реализация такой функции требует вмешательства в логику LearnPress, так как в базовом функционале её нет. Рассмотрим, как можно сделать отсрочку просмотра уроков с помощью кастомного плагина и примеров кода.
Как реализовать отсрочку просмотра уроков через плагин
Для начала создадим плагин, который будет контролировать доступ к урокам в зависимости от времени, прошедшего с момента начала курса или просмотра предыдущего урока.
Создаем структуру плагина
Создайте папку learnpress-lesson-delay в каталоге wp-content/plugins и файл learnpress-lesson-delay.php с таким содержанием:
<?php
/*
Plugin Name: LearnPress Lesson Delay
Description: Отсрочка просмотра уроков в LearnPress по времени
Version: 1.0
Author: learnpress.ru
*/
// Подключение функций
include_once dirname(__FILE__) . '/includes/lesson-delay-functions.php';
В папке includes создайте файл lesson-delay-functions.php, где напишем основную логику.
Основная логика контроля доступа к урокам
Основная идея — проверять время, прошедшее с момента начала курса или просмотра предыдущего урока, и блокировать доступ к следующему уроку, если задержка не выполнена.
<?php
// Хук для проверки доступа к уроку
add_filter('learn-press/user-can-view-item', 'learnpressru_user_can_view_item_delay', 10, 3);
function learnpressru_user_can_view_item_delay($can_view, $item, $user_id) {
// Проверяем, что это урок
if ($item->get_type() !== 'lp_lesson') {
return $can_view;
}
$course_id = $item->get_course()->get_id();
// Время задержки в днях между уроками
$delay_days = 2; // Можно вынести в настройки плагина
// Получаем список уроков курса и их порядок
$course_items = learn_press_get_course_items($course_id, 'lp_lesson');
$lesson_ids = wp_list_pluck($course_items, 'ID');
// Текущий урок индекс
$current_index = array_search($item->get_id(), $lesson_ids);
if ($current_index === false) {
return $can_view;
}
// Если это первый урок, доступ всегда разрешён
if ($current_index === 0) {
return $can_view;
}
// Получаем ID предыдущего урока
$prev_lesson_id = $lesson_ids[$current_index - 1];
// Получаем время завершения предыдущего урока
$meta_key = '_lp_lesson_completed_time_' . $user_id;
$completed_time = get_post_meta($prev_lesson_id, $meta_key, true);
if (!$completed_time) {
// Предыдущий урок не завершён, доступ запрещён
return false;
}
// Проверяем, прошла ли задержка
$delay_seconds = $delay_days * DAY_IN_SECONDS;
if ((time() - $completed_time) < $delay_seconds) {
return false;
}
return $can_view;
}
// Хук для сохранения времени завершения урока
add_action('learn_press_user_lesson_completed', 'learnpressru_save_lesson_completed_time', 10, 3);
function learnpressru_save_lesson_completed_time($user_id, $lesson_id, $course_id) {
$meta_key = '_lp_lesson_completed_time_' . $user_id;
update_post_meta($lesson_id, $meta_key, time());
}
В этом коде мы реализовали два основных момента:
- При попытке просмотра урока проверяем, завершён ли предыдущий урок, и прошла ли нужная задержка по времени.
- При завершении урока сохраняем мета-данные с временем завершения для каждого пользователя.
Настройка задержки и расширение функционала
Значение задержки $delay_days сейчас жёстко задано в коде. Для удобства можно добавить страницу настроек или использовать опции WordPress, чтобы администратор мог менять время задержки без правки кода.
Например, для добавления опции:
add_action('admin_menu', function() {
add_options_page('Настройки задержки уроков', 'Задержка уроков', 'manage_options', 'lp-lesson-delay', 'learnpressru_delay_settings_page');
});
function learnpressru_delay_settings_page() {
if (isset($_POST['delay_days'])) {
update_option('learnpressru_delay_days', intval($_POST['delay_days']));
echo '<div class="updated">Настройки сохранены.</div>';
}
$delay_days = get_option('learnpressru_delay_days', 2);
echo '<form method="post">';
echo '<label>Задержка между уроками (дней): </label>';
echo '<input type="number" name="delay_days" value="'.esc_attr($delay_days).'" min="0" />';
echo '<input type="submit" value="Сохранить" />';
echo '</form>';
}
Далее нужно изменить логику проверки задержки, чтобы брать значение из опции:
$delay_days = get_option('learnpressru_delay_days', 2);
Советы по тестированию и отладке
При внедрении такой функциональности важно тщательно протестировать поведение на разных ролях пользователей и сценариях:
- Проверить, что первый урок доступен сразу после регистрации или покупки курса.
- Убедиться, что при завершении урока сохраняется время.
- Проверить, что следующий урок блокируется до истечения задержки.
- Тестировать с разными значениями задержки.
- Просмотреть совместимость с другими плагинами, влияющими на уроки.
Если требуется более сложное управление — например, разные задержки для разных уроков или групп пользователей — логику можно расширить, добавив пользовательские поля курса или урока и правила доступа.
Альтернативные решения с помощью плагинов
Если хочется обойтись без кода, можно рассмотреть плагины для LearnPress с расширенными возможностями по управлению доступом:
- Clearfy Pro — оптимизация и расширение функций LearnPress, включая управление доступом.
- WPRemark — расширение полей и условий для курсов и уроков.
Однако специфической функции именно отсрочки уроков в стандартных плагинах мало — чаще приходится делать кастомные решения.