Как добавить собственные поля в курс LearnPress и вывести их на странице курса

Если стандартных данных LearnPress не хватает и нужно показать на странице курса длительность, формат, уровень, требования или любой другой параметр, это решается без написания отдельного плагина с нуля. Самый практичный путь — добавить свои метаполя к курсу, сохранить их в записи типа курса и вывести в шаблоне или через хук там, где это нужно.

Для такой задачи обычно достаточно дочерней темы или небольшого мини-плагина. Важно не править файлы самого LearnPress: после обновления изменения пропадут.

Что именно будем делать

У курса LearnPress есть собственный тип записи, и к нему можно привязать произвольные поля. Логика простая:

  • добавляем поля в админке курса;
  • сохраняем значения в post meta;
  • выводим их на странице курса в нужном месте;
  • при необходимости показываем эти же данные в карточке курса в каталоге.

Ниже я покажу вариант, который подходит для большинства проектов: поля добавляются в редактор курса, а вывод делается через хук. Это удобнее, чем полностью переопределять шаблоны LearnPress, и обычно меньше ломается при обновлениях.

Где хранить код

Если у вас уже есть дочерняя тема, можно добавить код в functions.php. Но для более аккуратной поддержки лучше сделать небольшой плагин. Тогда логика не зависит от темы, и вы не потеряете её при смене дизайна.

Ниже я покажу код как для мини-плагина. Это безопаснее для долгой поддержки. Если вам удобнее, тот же код можно перенести в functions.php дочерней темы.

Перед изменениями сделайте резервную копию сайта и базы данных. Если что-то пойдёт не так, вы сможете быстро откатиться.

Добавляем собственные поля в курс LearnPress

Для примера добавим четыре поля: длительность, формат, уровень и требования. Поля будут отображаться в метабоксе на экране редактирования курса.

Создайте файл, например learnpress-custom-course-fields.php, и поместите его в папку wp-content/plugins/. Затем активируйте плагин в админке WordPress.

Код ниже создаёт метабокс, выводит поля и сохраняет значения при сохранении курса:

<?php
/**
 * Plugin Name: LearnPress Custom Course Fields
 * Description: Adds custom fields to LearnPress courses.
 * Version: 1.0.0
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

add_action( 'add_meta_boxes', function () {
	add_meta_box(
		'lp_custom_course_fields',
		'Дополнительные поля курса',
		'lp_render_custom_course_fields_metabox',
		'lp_course',
		'normal',
		'default'
	);
} );

function lp_render_custom_course_fields_metabox( $post ) {
	wp_nonce_field( 'lp_save_custom_course_fields', 'lp_custom_course_fields_nonce' );

	$duration   = get_post_meta( $post->ID, '_lp_course_duration', true );
	$format     = get_post_meta( $post->ID, '_lp_course_format', true );
	$level      = get_post_meta( $post->ID, '_lp_course_level', true );
	$requirements = get_post_meta( $post->ID, '_lp_course_requirements', true );
	?>
	<p>
		<label for="lp_course_duration">Длительность</label><br>
		<input type="text" id="lp_course_duration" name="lp_course_duration" value="<?php echo esc_attr( $duration ); ?>" style="width:100%;" placeholder="Например: 6 недель">
	</p>
	<p>
		<label for="lp_course_format">Формат</label><br>
		<input type="text" id="lp_course_format" name="lp_course_format" value="<?php echo esc_attr( $format ); ?>" style="width:100%;" placeholder="Например: онлайн, записи, живые занятия">
	</p>
	<p>
		<label for="lp_course_level">Уровень</label><br>
		<input type="text" id="lp_course_level" name="lp_course_level" value="<?php echo esc_attr( $level ); ?>" style="width:100%;" placeholder="Например: начальный">
	</p>
	<p>
		<label for="lp_course_requirements">Требования</label><br>
		<textarea id="lp_course_requirements" name="lp_course_requirements" rows="4" style="width:100%;" placeholder="Например: базовые навыки работы с WordPress"><?php echo esc_textarea( $requirements ); ?></textarea>
	</p>
	<?php
}

add_action( 'save_post_lp_course', function ( $post_id ) {
	if ( ! isset( $_POST['lp_custom_course_fields_nonce'] ) || ! wp_verify_nonce( $_POST['lp_custom_course_fields_nonce'], 'lp_save_custom_course_fields' ) ) {
		return;
	}

	if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
		return;
	}

	if ( ! current_user_can( 'edit_post', $post_id ) ) {
		return;
	}

	$fields = array(
		'_lp_course_duration'    => isset( $_POST['lp_course_duration'] ) ? sanitize_text_field( wp_unslash( $_POST['lp_course_duration'] ) ) : '',
		'_lp_course_format'      => isset( $_POST['lp_course_format'] ) ? sanitize_text_field( wp_unslash( $_POST['lp_course_format'] ) ) : '',
		'_lp_course_level'       => isset( $_POST['lp_course_level'] ) ? sanitize_text_field( wp_unslash( $_POST['lp_course_level'] ) ) : '',
		'_lp_course_requirements' => isset( $_POST['lp_course_requirements'] ) ? sanitize_textarea_field( wp_unslash( $_POST['lp_course_requirements'] ) ) : '',
	);

	foreach ( $fields as $meta_key => $value ) {
		if ( '' === $value ) {
			delete_post_meta( $post_id, $meta_key );
		} else {
			update_post_meta( $post_id, $meta_key, $value );
		}
	}
} );

Здесь используются обычные механизмы WordPress: add_meta_box() для интерфейса, save_post_lp_course для сохранения и post meta для хранения значений. Хук save_post_lp_course срабатывает только для записей типа курса LearnPress.

Обратите внимание на проверку nonce и прав пользователя. Без этого любой запрос на сохранение мог бы подменить значения. Для публичного сайта это обязательная защита.

Как вывести эти поля на странице курса

Когда значения уже сохраняются, остаётся показать их на фронтенде. Самый удобный вариант — вывести блок под описанием курса или рядом с основной информацией. Точное место зависит от вашей темы и шаблонов LearnPress, но принцип один: берём значения из get_post_meta() и выводим их через хук.

Ниже пример, который добавляет блок с дополнительными параметрами после основного содержимого курса:

<?php
add_action( 'learn-press/after-single-course-summary', function () {
	global $post;

	if ( ! $post || 'lp_course' !== $post->post_type ) {
		return;
	}

	$duration     = get_post_meta( $post->ID, '_lp_course_duration', true );
	$format       = get_post_meta( $post->ID, '_lp_course_format', true );
	$level        = get_post_meta( $post->ID, '_lp_course_level', true );
	$requirements = get_post_meta( $post->ID, '_lp_course_requirements', true );

	if ( ! $duration && ! $format && ! $level && ! $requirements ) {
		return;
	}
	?>
	<div class="lp-course-extra-fields">
		<h3>О курсе</h3>
		<ul>
			<?php if ( $duration ) : ?>
				<li><strong>Длительность:</strong> <?php echo esc_html( $duration ); ?></li>
			<?php endif; ?>
			<?php if ( $format ) : ?>
				<li><strong>Формат:</strong> <?php echo esc_html( $format ); ?></li>
			<?php endif; ?>
			<?php if ( $level ) : ?>
				<li><strong>Уровень:</strong> <?php echo esc_html( $level ); ?></li>
			<?php endif; ?>
		</ul>
		<?php if ( $requirements ) : ?>
			<p><strong>Требования:</strong> <?php echo nl2br( esc_html( $requirements ) ); ?></p>
		<?php endif; ?>
	</div>
	<?php
} );

Этот хук подходит для вывода после краткого описания курса. Если в вашей версии LearnPress или в теме он не срабатывает, значит шаблон страницы курса переопределён темой или используется другая точка вывода. Тогда нужно проверить, какие хуки доступны в текущем шаблоне LearnPress, либо вывести блок через переопределение шаблона.

Если нужен вывод в карточке курса в каталоге

Иногда поля нужны не только на странице курса, но и в списке курсов: например, чтобы посетитель сразу видел длительность или уровень. В этом случае можно добавить короткий блок в карточку курса через хук, который используется в шаблоне архива курсов. Название и место хука зависят от шаблона LearnPress и темы, поэтому сначала проверьте, какой именно шаблон карточки у вас активен.

Практически это означает следующее: если вам нужно изменить только страницу курса, не трогайте каталог. Если нужно расширить и каталог тоже, лучше вынести вывод в отдельную функцию и подключить её в нужные хуки, чтобы не дублировать код.

Как проверить, что всё работает

После установки кода откройте любой курс в админке и заполните новые поля. Затем сохраните запись и проверьте три вещи:

  1. значения остаются в полях после повторного открытия курса;
  2. в базе данных появились записи в wp_postmeta для этого курса;
  3. на странице курса блок с данными отображается только там, где вы его подключили.

Если значения сохраняются в админке, но не видны на фронтенде, проблема обычно в хуке или в шаблоне темы. Если блок выводится, но поля пустые, проверьте meta key: он должен совпадать в сохранении и в выводе без лишних символов.

Что лучше: хук, шаблон или отдельный плагин

ПодходКогда подходитПлюсыМинусы
ХукНужно добавить блок без полной переделки шаблонаМеньше кода, проще поддержкаЗависит от того, какой хук есть в теме и LearnPress
Переопределение шаблонаНужно точное место вывода и сложная версткаПолный контроль над разметкойБольше риска при обновлениях
Мини-плагинНужно сохранить логику независимо от темыУдобно переносить между проектамиНужно один раз аккуратно оформить код

Для большинства сайтов с LearnPress я бы начинал с мини-плагина и хуков. Это даёт нормальный баланс между гибкостью и поддерживаемостью. Шаблон имеет смысл трогать только тогда, когда блок нужно встроить в конкретное место разметки, а не просто добавить ниже контента.

На что чаще всего спотыкаются

Самая частая ошибка — пытаться записывать данные в произвольный массив или в опции сайта вместо метаполей курса. Для курса это неудобно: данные должны жить рядом с записью, иначе потом сложно редактировать и переносить их между курсами.

Вторая типичная проблема — отсутствие экранирования. На выводе используйте esc_html() или esc_textarea(), а в админке — esc_attr(). Это не формальность: так вы не дадите случайному HTML сломать страницу или внедрить нежелательный код.

Ещё один момент связан с версией LearnPress и темой. Если хук из примера не сработал, это не значит, что идея неверная. Скорее всего, в вашей сборке другой шаблон страницы курса. Тогда нужно либо найти подходящий хук в текущих шаблонах, либо вывести блок через переопределение шаблона темы.

Если вам нужно не только добавить поля, но и сделать их частью SEO-блоков, FAQ, рейтингов или других элементов страницы, иногда удобнее подключать дополнительные редакционные блоки через отдельные решения. Но для самой задачи расширения курса LearnPress собственными полями это не требуется: достаточно метаполей, сохранения и аккуратного вывода.

В итоге схема простая: добавляете поля в курс, сохраняете их как post meta и выводите в нужной точке через хук или шаблон. Для длительности, формата, уровня и требований этого обычно хватает без тяжёлой доработки LearnPress и без отдельного плагина с нуля.

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Как добавить собственные поля в курс LearnPress и вывести их на странице курса
26.10.2026
Как добавить поиск по курсам и урокам LearnPress на WordPress
19.10.2026
Как изменить шаблон страницы курса LearnPress через дочернюю тему
22.10.2026
Как создать страницу каталога курсов LearnPress с фильтрами по категориям и уровню сложности
19.10.2026
Как настроить кэширование для сайта с LearnPress без поломки курсов и уроков
09.10.2026
×
Твой WordPress — твои правила!

Топовые темы и плагины со скидкой 20%.

Забрать выгодно ⋙