LearnPress — мощный плагин для создания онлайн-курсов на WordPress. Однако стандартный функционал ограничен типами учебных материалов: уроки и викторины. В этой статье мы подробно рассмотрим, как добавить в LearnPress новые независимые виды учебных материалов, например, дополнительные ресурсы, презентации, задания, чтобы расширить возможности вашей обучающей платформы.
Почему нужны независимые виды учебных материалов в LearnPress
Стандартные уроки и тесты подходят не для всех сценариев обучения. Иногда требуется добавить дополнительные типы контента: рабочие задания, видео-лекции с особой разметкой, презентации, дополнительные материалы для скачивания, интерактивные элементы. Если их реализовать в рамках уроков, страдает удобство и семантика.
Независимые типы учебных материалов позволяют:
- Четко структурировать контент курса;
- Добавлять уникальные поля и логику для каждого типа;
- Управлять отображением и доступом к материалам;
- Облегчить создание и поддержку курсов.
Как создать новый тип учебного материала в LearnPress (Custom Post Type)
В LearnPress учебные материалы — это CPT (Custom Post Type) с базовой логикой. Чтобы добавить новый тип, нужно зарегистрировать собственный CPT и интегрировать его в систему курсов.
Пример регистрации нового CPT lp_resource для дополнительных ресурсов:
function learnpress_ru_register_resource_cpt() {
$labels = array(
'name' => 'Ресурсы',
'singular_name' => 'Ресурс',
'menu_name' => 'Ресурсы',
'add_new' => 'Добавить ресурс',
'add_new_item' => 'Добавить новый ресурс',
'edit_item' => 'Редактировать ресурс',
'new_item' => 'Новый ресурс',
'view_item' => 'Просмотр ресурса',
'search_items' => 'Поиск ресурсов',
'not_found' => 'Ресурсы не найдены',
'not_found_in_trash' => 'В корзине ресурсов не найдено'
);
$args = array(
'labels' => $labels,
'public' => true,
'show_ui' => true,
'capability_type' => 'lp_resource',
'map_meta_cap' => true,
'hierarchical' => false,
'menu_position' => 20,
'supports' => array('title', 'editor', 'thumbnail'),
'has_archive' => false,
'show_in_menu' => 'learn_press'
);
register_post_type('lp_resource', $args);
}
add_action('init', 'learnpress_ru_register_resource_cpt');Этот код создаст в админке LearnPress новый тип материалов «Ресурсы».
Интеграция нового типа материала в структуру курса LearnPress
Чтобы новые материалы отображались в курсе и были связаны с уроками, нужно добавить связь через метаполя и расширить вывод курса.
LearnPress хранит структуру курса в метаполях заказа и уроков. Добавим связь ресурса с курсом через метаполе:
function learnpress_ru_save_resource_course_link($post_id) {
if (get_post_type($post_id) != 'lp_resource') return;
if (!empty($_POST['course_id'])) {
update_post_meta($post_id, '_lp_course_id', absint($_POST['course_id']));
}
}
add_action('save_post', 'learnpress_ru_save_resource_course_link');На странице редактирования ресурса добавим селектор курса через метабокс, чтобы связать ресурс с нужным курсом.
Вывод новых материалов на странице курса
Для вывода ресурсов на странице курса используем хук LearnPress. Например, добавим вывод списка ресурсов после уроков:
function learnpress_ru_show_resources_in_course($course_id) {
$args = array(
'post_type' => 'lp_resource',
'meta_key' => '_lp_course_id',
'meta_value' => $course_id,
'posts_per_page' => -1
);
$resources = get_posts($args);
if ($resources) {
echo '<h3>Дополнительные ресурсы</h3><ul>';
foreach ($resources as $resource) {
echo '<li><a href="'.get_permalink($resource->ID).'">'.esc_html($resource->post_title).'</a></li>';
}
echo '</ul>';
}
}
add_action('learn_press_after_sections', 'learnpress_ru_show_resources_in_course');Так мы расширим интерфейс курса, показывая дополнительные учебные материалы.
Использование плагина Quizle для создания интерактивных заданий как отдельного типа материала
Если нужно добавить интерактивные задания, не связанные с уроками напрямую, отлично подойдет плагин Quizle. Он позволяет создавать кастомные вопросы и тесты, которые можно интегрировать в новые типы материалов.
Пример добавления нового типа вопроса для Quizle:
function learnpress_ru_quizle_custom_question_types($types) {
$types['resource_assignment'] = __('Задание-ресурс', 'learnpress-ru');
return $types;
}
add_filter('quizle_question_types', 'learnpress_ru_quizle_custom_question_types');После этого можно создавать задания с уникальной логикой и отображением.
Советы по безопасности и производительности при добавлении новых типов материалов
При добавлении новых CPT и связей важно:
- Правильно настроить права доступа (capabilities) для новых типов, чтобы не допустить несанкционированных изменений.
- Оптимизировать запросы для вывода материалов, используя кэширование (например, Transients API) для снижения нагрузки.
- Обеспечить совместимость с темами и другими плагинами, особенно если используете кастомные шаблоны для вывода материалов.
Также, если на сайте много учебных материалов, стоит рассмотреть использование плагина Clearfy Pro для оптимизации производительности.
Пример комплексного решения: создание типа 'Задание' с загрузкой файлов и проверкой
Создадим CPT lp_assignment с метаполями для загрузки файлов и проверкой преподавателем.
function learnpress_ru_register_assignment_cpt() {
$labels = array(
'name' => 'Задания',
'singular_name' => 'Задание',
'menu_name' => 'Задания'
);
$args = array(
'labels' => $labels,
'public' => true,
'supports' => array('title', 'editor'),
'show_in_menu' => 'learn_press'
);
register_post_type('lp_assignment', $args);
}
add_action('init', 'learnpress_ru_register_assignment_cpt');
// Добавление метабокса для загрузки файлов
function learnpress_ru_assignment_meta_box() {
add_meta_box('lp_assignment_files', 'Файлы задания', 'learnpress_ru_assignment_files_cb', 'lp_assignment', 'normal', 'high');
}
add_action('add_meta_boxes', 'learnpress_ru_assignment_meta_box');
function learnpress_ru_assignment_files_cb($post) {
wp_nonce_field('learnpress_ru_save_assignment_files', 'learnpress_ru_assignment_files_nonce');
$files = get_post_meta($post->ID, '_lp_assignment_files', true);
echo '<input type="file" name="lp_assignment_files[]" multiple />';
if ($files) {
echo '<ul>';
foreach ($files as $file) {
echo '<li><a href="'.esc_url($file).'" target="_blank">'.basename($file).'</a></li>';
}
echo '</ul>';
}
}
// Сохранение файлов
function learnpress_ru_save_assignment_files($post_id) {
if (!isset($_POST['learnpress_ru_assignment_files_nonce']) || !wp_verify_nonce($_POST['learnpress_ru_assignment_files_nonce'], 'learnpress_ru_save_assignment_files')) {
return;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
if (!current_user_can('edit_post', $post_id)) return;
if (!empty($_FILES['lp_assignment_files']['name'][0])) {
$files = array();
$file_count = count($_FILES['lp_assignment_files']['name']);
for ($i = 0; $i < $file_count; $i++) {
if ($_FILES['lp_assignment_files']['error'][$i] == 0) {
$upload = wp_handle_upload(array(
'name' => $_FILES['lp_assignment_files']['name'][$i],
'type' => $_FILES['lp_assignment_files']['type'][$i],
'tmp_name' => $_FILES['lp_assignment_files']['tmp_name'][$i],
'error' => $_FILES['lp_assignment_files']['error'][$i],
'size' => $_FILES['lp_assignment_files']['size'][$i]
), array('test_form' => false));
if (!isset($upload['error'])) {
$files[] = $upload['url'];
}
}
}
update_post_meta($post_id, '_lp_assignment_files', $files);
}
}
add_action('save_post_lp_assignment', 'learnpress_ru_save_assignment_files');Таким образом, преподаватель может создавать задания с прикрепленными файлами, а студенты видеть и выполнять их.