LearnPress — мощный плагин для создания онлайн-курсов на WordPress. Часто возникает потребность добавить уникальные виджеты, которые будут выводить специфическую информацию, связанную с курсами, пользователями или прогрессом обучения. В этой статье мы подробно разберем, как создать собственный виджет для LearnPress, который можно будет легко интегрировать в любую тему WordPress.
Что такое виджет в WordPress и зачем он нужен для LearnPress
Виджет — это небольшой блок контента, который можно разместить в сайдбаре, футере или других областях темы WordPress. Для сайта на LearnPress виджеты позволяют удобно показывать информацию о курсах, статистику, прогресс пользователя и другие данные без необходимости править шаблоны напрямую.
Например, виджет может показывать список популярных курсов, текущие курсы пользователя, или прогресс по конкретному курсу. Это улучшает пользовательский опыт и помогает привлечь внимание к важным элементам обучения.
Создавая собственный виджет, вы получаете полный контроль над функционалом и дизайном, что часто невозможно с готовыми решениями.
Основы создания виджета в WordPress для LearnPress
Виджеты в WordPress создаются с помощью класса, наследующего WP_Widget. В нашем случае мы расширим этот класс, добавим методы для отображения и настройки, а также интегрируем вызовы LearnPress API для получения данных.
Чтобы виджет появился в админке, его нужно зарегистрировать с помощью хука widgets_init. Давайте рассмотрим базовый пример создания виджета, который выводит количество курсов на сайте.
class LearnPress_Widget_Course_Count extends WP_Widget {
public function __construct() {
parent::__construct(
'learnpress_course_count',
__('LearnPress: Количество курсов', 'learnpress'),
array('description' => __('Показывает общее количество курсов LearnPress', 'learnpress'))
);
}
public function widget($args, $instance) {
echo $args['before_widget'];
echo $args['before_title'] . apply_filters('widget_title', 'Курсы на сайте') . $args['after_title'];
$courses_count = learnpress_get_courses_count();
echo '<p>Всего курсов: <strong>' . esc_html($courses_count) . '</strong></p>';
echo $args['after_widget'];
}
public function form($instance) {
echo '<p>Этот виджет не имеет настроек.</p>';
}
public function update($new_instance, $old_instance) {
return $old_instance;
}
}
function learnpress_register_course_count_widget() {
register_widget('LearnPress_Widget_Course_Count');
}
add_action('widgets_init', 'learnpress_register_course_count_widget');
function learnpress_get_courses_count() {
$args = array(
'post_type' => 'lp_course',
'post_status' => 'publish',
'posts_per_page' => -1,
'fields' => 'ids'
);
$query = new WP_Query($args);
return $query->found_posts;
}
В этом примере мы создали простой виджет, который выводит количество опубликованных курсов LearnPress. Функция learnpress_get_courses_count() использует WP_Query для подсчёта курсов. Такой код можно расширять и модифицировать под любые задачи.
Расширение виджета: отображение прогресса пользователя по курсу
Давайте усложним виджет и сделаем так, чтобы он показывал прогресс текущего пользователя по выбранному курсу. Это полезно для личного кабинета студента или информера на главной странице.
Для этого нам понадобятся функции LearnPress для получения текущего пользователя, его курсов и прогресса. В LearnPress есть класс LP_Profile, через который можно получить данные о прогрессе.
class LearnPress_Widget_User_Progress extends WP_Widget {
public function __construct() {
parent::__construct(
'learnpress_user_progress',
__('LearnPress: Прогресс пользователя', 'learnpress'),
array('description' => __('Показывает прогресс пользователя по курсу LearnPress', 'learnpress'))
);
}
public function widget($args, $instance) {
if (!is_user_logged_in()) {
echo $args['before_widget'];
echo 'Пожалуйста, войдите, чтобы видеть прогресс.';
echo $args['after_widget'];
return;
}
$course_id = !empty($instance['course_id']) ? intval($instance['course_id']) : 0;
if (!$course_id) {
echo $args['before_widget'];
echo 'Курс не выбран.';
echo $args['after_widget'];
return;
}
$user_id = get_current_user_id();
$profile = LP_Profile::instance($user_id);
$progress = $profile->get_course_progress($course_id);
echo $args['before_widget'];
echo $args['before_title'] . apply_filters('widget_title', 'Ваш прогресс') . $args['after_title'];
echo '<p>Прогресс по курсу: <strong>' . intval($progress) . '%</strong></p>';
echo $args['after_widget'];
}
public function form($instance) {
$course_id = !empty($instance['course_id']) ? intval($instance['course_id']) : '';
$courses = learnpress_get_all_courses();
?>
<p>
<label for="<?php echo esc_attr($this->get_field_id('course_id')); ?>">Выберите курс:</label>
<select id="<?php echo esc_attr($this->get_field_id('course_id')); ?>" name="<?php echo esc_attr($this->get_field_name('course_id')); ?>">
<option value="">-- Не выбрано --</option>
<?php foreach ($courses as $course): ?>
<option value="<?php echo esc_attr($course->ID); ?>" <?php selected($course_id, $course->ID); ?>><?php echo esc_html($course->post_title); ?></option>
<?php endforeach; ?>
</select>
</p>
<?php
}
public function update($new_instance, $old_instance) {
$instance = array();
$instance['course_id'] = (!empty($new_instance['course_id'])) ? intval($new_instance['course_id']) : 0;
return $instance;
}
}
function learnpress_register_user_progress_widget() {
register_widget('LearnPress_Widget_User_Progress');
}
add_action('widgets_init', 'learnpress_register_user_progress_widget');
function learnpress_get_all_courses() {
$args = array(
'post_type' => 'lp_course',
'post_status' => 'publish',
'posts_per_page' => -1
);
return get_posts($args);
}
В админке виджет позволяет выбрать курс, а на фронте показывает прогресс текущего пользователя. Если пользователь не авторизован, выводится сообщение с просьбой войти.
Советы по улучшению и безопасности виджетов для LearnPress
При разработке виджетов, особенно тех, что связаны с пользовательскими данными, важно соблюдать несколько правил:
- Проверяйте права доступа. Не показывайте личные данные или прогресс, если пользователь не авторизован.
- Экранируйте вывод. Используйте функции
esc_html(),esc_attr()и другие для защиты от XSS-атак. - Оптимизируйте запросы. Минимизируйте количество запросов к базе, используйте кеширование, если возможно.
- Добавляйте настройки. Позвольте администратору настраивать поведение виджета через форму.
- Документируйте код. Это упростит поддержку и развитие виджета в будущем.
Полезные плагины и инструменты для работы с виджетами LearnPress
Кроме создания собственных виджетов, для LearnPress и WordPress можно использовать следующие плагины, чтобы расширять функционал:
- Widget Options — мощный плагин для управления отображением виджетов по условиям.
- Custom Sidebars — позволяет создавать индивидуальные сайдбары для разных страниц и курсов.
- Code Snippets — удобный инструмент для добавления пользовательского кода без правки файлов темы.
- LearnPress Add-ons — официальные расширения, которые иногда добавляют виджеты с полезной информацией.
Используйте эти инструменты вместе с собственными виджетами для создания удобной и функциональной LMS на базе LearnPress.
Выводы и рекомендации по разработке виджетов для LearnPress
Создание собственных виджетов — отличный способ адаптировать LearnPress под конкретные задачи вашего сайта. Благодаря гибкости WordPress и открытой архитектуре LearnPress, вы можете получить точечное решение для отображения нужной информации.
Начинайте с простых виджетов и постепенно добавляйте сложность, используя API LearnPress и WordPress. Не забывайте про безопасность и удобство настройки, чтобы ваши виджеты были полезными и надежными.