151 lines
8.5 KiB
PHP
151 lines
8.5 KiB
PHP
<?php
|
||
|
||
/**
|
||
* Преподаватели (горизонтальный скролл, CPT)
|
||
*
|
||
* Reads teacher data directly from the 'teacher' custom post type.
|
||
*
|
||
* Поддерживает $args:
|
||
* - teacher_ids (int[]) — выбрать конкретных преподавателей.
|
||
* Если пусто/не передан — показываются все.
|
||
* - description (string) — текст описания под заголовком.
|
||
* Если пусто/не передан — жёсткий текст по умолчанию.
|
||
* - hide_label (bool) — скрыть бейдж «Преподаватели» над заголовком.
|
||
* - title (string) — заголовок секции (по умолчанию «Наши преподаватели — практикующие педагоги»).
|
||
*
|
||
* Fields used:
|
||
* - Post title → teacher name
|
||
* - _teacher_direction → subject
|
||
* - _teacher_avatar → photo (attachment ID)
|
||
* - _teacher_badge → badge text
|
||
* - _teacher_start_year → experience calculation
|
||
* - _teacher_description → description (Дескрипшн преподавателя)
|
||
*
|
||
* @package Dekart
|
||
*/
|
||
|
||
if (! defined('ABSPATH')) {
|
||
exit;
|
||
}
|
||
|
||
// ── Parse args ─────────────────────────────────────────────
|
||
$teacher_ids = $args['teacher_ids'] ?? array();
|
||
$description = isset($args['description']) ? $args['description'] : 'Каждый педагог имеет опыт работы с дошкольниками от 5 лет. Все — действующие учителя начальных классов с высшим образованием.';
|
||
$hide_label = ! empty($args['hide_label']);
|
||
$title = isset($args['title']) ? $args['title'] : 'Наши преподаватели — практикующие педагоги';
|
||
|
||
// ── Query ──────────────────────────────────────────────────
|
||
$query_args = array(
|
||
'post_type' => 'teacher',
|
||
'posts_per_page' => -1,
|
||
'post_status' => 'publish',
|
||
);
|
||
|
||
if (! empty($teacher_ids)) {
|
||
$query_args['post__in'] = $teacher_ids;
|
||
$query_args['orderby'] = 'post__in';
|
||
} else {
|
||
$query_args['orderby'] = 'date';
|
||
$query_args['order'] = 'DESC';
|
||
}
|
||
|
||
$teachers_query = new WP_Query($query_args);
|
||
?>
|
||
<section class="bento teachers-cards" id="teachers" aria-label="Преподаватели">
|
||
<div class="bento__full section-header--centered">
|
||
<?php if (! $hide_label) : ?>
|
||
<span class="bento-label">Преподаватели</span>
|
||
<?php endif; ?>
|
||
<h2 class="bento-h2"><?php echo esc_html($title); ?></h2>
|
||
<p class="bento-p"><?php echo esc_html($description); ?></p>
|
||
|
||
</div>
|
||
<div class="bento__full">
|
||
<div class="teachers-cards__scroll-hint" aria-hidden="true">👆 Листайте карточки преподавателей →</div>
|
||
<div class="teachers-cards__scroll-x">
|
||
<div class="teachers-cards__wrapper">
|
||
<?php if ($teachers_query->have_posts()) : ?>
|
||
<?php while ($teachers_query->have_posts()) :
|
||
$teachers_query->the_post();
|
||
|
||
$t_id = get_the_ID();
|
||
$t_name = get_the_title();
|
||
$t_subj = get_post_meta($t_id, '_teacher_direction', true);
|
||
$t_about = get_post_meta($t_id, '_teacher_description', true);
|
||
$t_badge = get_post_meta($t_id, '_teacher_badge', true);
|
||
$t_photo = get_post_meta($t_id, '_teacher_avatar', true);
|
||
$start_year = carbon_get_post_meta($t_id, 'teacher_start_year');
|
||
|
||
// Experience calculation.
|
||
$t_exp = '';
|
||
if ($start_year && is_numeric($start_year)) {
|
||
$e = (int) date('Y') - (int) $start_year;
|
||
if ($e > 0) {
|
||
$t_exp = $e . ' лет';
|
||
}
|
||
}
|
||
|
||
// Name splitting: first part on first line, rest on second.
|
||
$name_parts = explode(' ', $t_name, 2);
|
||
$name_first = $name_parts[0] ?? $t_name;
|
||
$name_rest = $name_parts[1] ?? '';
|
||
|
||
// Description truncation (~3 строки карточки; поле: до 140 знаков).
|
||
$t_about_clean = $t_about ? wp_strip_all_tags($t_about) : '';
|
||
if (mb_strlen($t_about_clean) > 150) {
|
||
$t_about_clean = mb_substr($t_about_clean, 0, 150) . '…';
|
||
}
|
||
?>
|
||
<div class="teachers-cards__item">
|
||
<div class="teachers-cards__card">
|
||
<div class="teachers-cards__card-top">
|
||
<?php if ($t_photo) : ?>
|
||
<?php $photo_url = wp_get_attachment_image_url($t_photo, array( 280, 280 )); ?>
|
||
<img class="teachers-cards__photo" loading="lazy" width="140" height="140"
|
||
src="<?php echo esc_url($photo_url ?: get_template_directory_uri() . '/assets/images/no-photo.png'); ?>"
|
||
alt="<?php echo esc_attr($t_name); ?>">
|
||
<?php else : ?>
|
||
<img class="teachers-cards__photo" loading="lazy" width="140" height="140"
|
||
src="<?php echo esc_url(get_template_directory_uri() . '/assets/images/no-photo.png'); ?>"
|
||
alt="<?php echo esc_attr($t_name); ?>">
|
||
<?php endif; ?>
|
||
</div>
|
||
<div class="teachers-cards__card-body">
|
||
<h3 class="teachers-cards__name">
|
||
<?php echo esc_html($name_first); ?>
|
||
<?php if ($name_rest) : ?>
|
||
<br><?php echo esc_html($name_rest); ?>
|
||
<?php endif; ?>
|
||
</h3>
|
||
<?php if ($t_subj) : ?>
|
||
<p class="teachers-cards__subj"><?php echo esc_html($t_subj); ?></p>
|
||
<?php endif; ?>
|
||
<?php if ($t_about_clean) : ?>
|
||
<p class="teachers-cards__desc"><?php echo esc_html($t_about_clean); ?></p>
|
||
<?php endif; ?>
|
||
<div class="teachers-cards__meta">
|
||
<?php if ($t_badge) : ?>
|
||
<span class="teachers-cards__meta-badge"><?php echo esc_html($t_badge); ?></span>
|
||
<?php endif; ?>
|
||
<?php if ($t_exp) : ?>
|
||
<span class="teachers-cards__meta-exp"><svg aria-hidden="true" width="14" height="14" class="teachers-cards__meta-icon"><use href="#icon-calendar"/></svg> Стаж: <?php echo esc_html($t_exp); ?></span>
|
||
<?php endif; ?>
|
||
</div>
|
||
<button class="teachers-cards__btn open-bitrix-form">Записаться к этому педагогу</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<?php endwhile; ?>
|
||
<?php wp_reset_postdata(); ?>
|
||
<?php endif; ?>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="teachers-cards__footer">
|
||
<a class="teachers-cards__all-link" href="/our-teachers/">
|
||
Все преподаватели
|
||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14m-7-7 7 7-7 7"/></svg>
|
||
</a>
|
||
</div>
|
||
</section>
|