Global-2026-07-12

This commit is contained in:
Dekart Deploy Bot 2026-07-12 11:52:30 +00:00
parent b1d601ac78
commit d5dceedef6
24 changed files with 1857 additions and 1357 deletions

View File

@ -1,5 +1,9 @@
<?php
require_once get_template_directory() . '/inc/template-tags.php';
// Pksh_Data — централизованная загрузка данных для page-podgotovka-k-shkole.php
require_once get_template_directory() . '/inc/class-pksh-data.php';
/* --- Удаляем мета из YOASTSEO START--- */
add_filter( 'wpseo_json_ld_output', '__return_false' );
/* --- Удаляем мета из YOASTSEO END --- */

View File

@ -0,0 +1,400 @@
<?php
/**
* Pksh_Data централизованная загрузка данных для page-podgotovka-k-shkole.php
*
* Синглтон. Кэширует все carbon_get_post_meta() и get_option() вызовы.
* Каждый template-part вызывает Pksh_Data::instance() -> get_*().
* Повторные вызовы instance() возвращают тот же объект без дублирования запросов.
*
* @package Dekart
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
class Pksh_Data {
private static ?Pksh_Data $instance = null;
private int $post_id;
/** @var array Кэш branch-данных (get_option с fallback) */
private array $branch = [];
/** @var array Кэш page-specific meta */
private array $page = [];
/** @var array|null Кэш complex полей */
private ?array $social = null;
private array $programs = [];
private ?array $compare = null;
private ?array $teachers = null;
private ?array $reviews = null;
private ?array $faq = null;
private function __construct() {
$this->post_id = get_the_ID();
}
/**
* Получить экземпляр (синглтон)
*/
public static function instance(): self {
if ( null === self::$instance ) {
self::$instance = new self();
}
return self::$instance;
}
// ============================================================
// BRANCH / OPTION DATA (get_option → theme_option → post_meta)
// ============================================================
/**
* Адрес филиала
*/
public function get_address(): string {
if ( ! array_key_exists( 'address', $this->branch ) ) {
$this->branch['address'] = get_option( 'branch_address' ) ?:
carbon_get_theme_option( 'site_address' ) ?:
carbon_get_post_meta( $this->post_id, 'contact_address' ) ?:
'';
}
return $this->branch['address'];
}
/**
* Координаты филиала (для карты)
*/
public function get_coords(): string {
if ( ! array_key_exists( 'coords', $this->branch ) ) {
$this->branch['coords'] = get_option( 'branch_coords' ) ?:
carbon_get_post_meta( $this->post_id, 'contact_location' ) ?:
'';
}
return $this->branch['coords'];
}
/**
* Телефон филиала
*/
public function get_phone(): string {
if ( ! array_key_exists( 'phone', $this->branch ) ) {
$this->branch['phone'] = get_option( 'branch_phone' ) ?:
carbon_get_theme_option( 'site_phone' ) ?:
carbon_get_post_meta( $this->post_id, 'contact_tel' ) ?:
'';
}
return $this->branch['phone'];
}
/**
* Телефон, очищенный от не-цифровых символов
*/
public function get_phone_clean(): string {
if ( ! array_key_exists( 'phone_clean', $this->branch ) ) {
$this->branch['phone_clean'] = preg_replace( '/[^0-9+]/', '', $this->get_phone() );
}
return $this->branch['phone_clean'];
}
/**
* Email филиала
*/
public function get_email(): string {
if ( ! array_key_exists( 'email', $this->branch ) ) {
$this->branch['email'] = get_option( 'branch_email' ) ?:
carbon_get_theme_option( 'site_mail' ) ?:
carbon_get_post_meta( $this->post_id, 'contact_mail' ) ?:
'';
}
return $this->branch['email'];
}
/**
* Название филиала / организации
*/
public function get_name(): string {
if ( ! array_key_exists( 'name', $this->branch ) ) {
$this->branch['name'] = get_option( 'branch_name' ) ?:
carbon_get_theme_option( 'site_name' ) ?:
'Декарт';
}
return $this->branch['name'];
}
/**
* Город с предлогом (например "в Щёлково")
*/
public function get_city_prep(): string {
if ( ! array_key_exists( 'city_prep', $this->branch ) ) {
$this->branch['city_prep'] = get_option( 'branch_city_prep', 'в Щёлково' );
}
return $this->branch['city_prep'];
}
/**
* Город без предлога (например "Щёлково")
*/
public function get_city_clean(): string {
if ( ! array_key_exists( 'city_clean', $this->branch ) ) {
$this->branch['city_clean'] = str_replace( array( 'в ', 'В ' ), '', $this->get_city_prep() );
}
return $this->branch['city_clean'];
}
/**
* Количество отзывов на внешних площадках
*/
public function get_ext_review_count(): string {
if ( ! array_key_exists( 'ext_review_count', $this->branch ) ) {
$this->branch['ext_review_count'] = get_option( 'branch_ext_review_count', '247' );
}
return $this->branch['ext_review_count'];
}
/**
* Социальные сети (из branch_social option или CF)
*/
public function get_social_links(): array {
if ( ! array_key_exists( 'social', $this->branch ) ) {
$raw = get_option( 'branch_social' ) ?:
carbon_get_post_meta( $this->post_id, 'social_media' ) ?:
[];
$this->branch['social'] = is_array( $raw ) ? $raw : [];
}
return $this->branch['social'];
}
// ============================================================
// HERO / BANNER
// ============================================================
/**
* ID изображения баннера (hero)
*/
public function get_banner_image_id(): int {
if ( ! array_key_exists( 'banner_image_id', $this->page ) ) {
$this->page['banner_image_id'] = (int) carbon_get_post_meta( $this->post_id, 'banner_image' );
}
return $this->page['banner_image_id'];
}
/**
* H1 заголовок hero-секции
*/
public function get_h1(): string {
if ( ! array_key_exists( 'h1', $this->page ) ) {
$this->page['h1'] = carbon_get_post_meta( $this->post_id, 'banner_h1' ) ?:
'Подготовка к школе в Щёлково';
}
return $this->page['h1'];
}
/**
* Подзаголовок hero
*/
public function get_subtitle(): string {
if ( ! array_key_exists( 'subtitle', $this->page ) ) {
$this->page['subtitle'] = carbon_get_post_meta( $this->post_id, 'banner_subtitle' ) ?:
'Первое занятие — бесплатно. Ребёнок научится читать, считать и писать в игровой форме. Группы до 10 человек.';
}
return $this->page['subtitle'];
}
// ============================================================
// SOCIAL COUNTERS (complex)
// ============================================================
/**
* Массив social counters (complex field pksh_social_counters)
* @return array[]
*/
public function get_social_counters(): array {
if ( null === $this->social ) {
$raw = carbon_get_post_meta( $this->post_id, 'pksh_social_counters' );
$this->social = is_array( $raw ) ? $raw : [];
}
return $this->social;
}
/**
* Иконки для social counters (порядок соответствует полю)
*/
public static function social_icons(): array {
return array( '🎓', '📅', '⭐', '👩‍🏫' );
}
// ============================================================
// PROGRAMS
// ============================================================
/**
* Данные базовой программы
* @return array{name: string, subname: string, schedule: string, price_sub: string, price_single: string, urgency: string}
*/
public function get_base_program(): array {
if ( ! array_key_exists( 'base', $this->programs ) ) {
$this->programs['base'] = array(
'name' => carbon_get_post_meta( $this->post_id, 'pksh_prog_base_name' ) ?: 'Уверенный старт',
'subname' => carbon_get_post_meta( $this->post_id, 'pksh_prog_base_subname' ) ?: '2 раза в неделю — комфортный темп без перегрузки',
'schedule' => carbon_get_post_meta( $this->post_id, 'pksh_prog_base_schedule' ) ?: 'вт, чт — 18:0019:30',
'price_sub' => carbon_get_post_meta( $this->post_id, 'pksh_prog_base_price_sub' ) ?: '7 500 ₽',
'price_single' => carbon_get_post_meta( $this->post_id, 'pksh_prog_base_price_single' ) ?: '1 000 ₽',
'urgency' => carbon_get_post_meta( $this->post_id, 'pksh_prog_base_urgency' ) ?: 'Осталось 2 места в группе',
);
}
return $this->programs['base'];
}
/**
* Данные премиум-программы
* @return array{name: string, subname: string, schedule: string, price_sub: string, price_single: string, urgency: string}
*/
public function get_premium_program(): array {
if ( ! array_key_exists( 'prem', $this->programs ) ) {
$this->programs['prem'] = array(
'name' => carbon_get_post_meta( $this->post_id, 'pksh_prog_prem_name' ) ?: 'Результат за 3 месяца',
'subname' => carbon_get_post_meta( $this->post_id, 'pksh_prog_prem_subname' ) ?: '3 раза в неделю — быстрый прогресс',
'schedule' => carbon_get_post_meta( $this->post_id, 'pksh_prog_prem_schedule' ) ?: 'пн, ср, пт — 16:3018:00',
'price_sub' => carbon_get_post_meta( $this->post_id, 'pksh_prog_prem_price_sub' ) ?: '10 500 ₽',
'price_single' => carbon_get_post_meta( $this->post_id, 'pksh_prog_prem_price_single' ) ?: '1 500 ₽',
'urgency' => carbon_get_post_meta( $this->post_id, 'pksh_prog_prem_urgency' ) ?: 'Осталось 3 места в группе',
);
}
return $this->programs['prem'];
}
// ============================================================
// COMPARE TABLE (complex)
// ============================================================
/**
* Строки таблицы сравнения
* @return array[]
*/
public function get_compare_rows(): array {
if ( null === $this->compare ) {
$raw = carbon_get_post_meta( $this->post_id, 'pksh_compare_rows' );
$this->compare = is_array( $raw ) ? $raw : [];
}
return $this->compare;
}
/**
* Сноска под таблицей сравнения
*/
public function get_compare_footnote(): string {
if ( ! array_key_exists( 'footnote', $this->page ) ) {
$this->page['footnote'] = carbon_get_post_meta( $this->post_id, 'pksh_compare_footnote' ) ?: '';
}
return $this->page['footnote'];
}
// ============================================================
// TEACHERS (complex)
// ============================================================
/**
* Массив преподавателей (complex field pksh_teachers)
* @return array[]
*/
public function get_teachers(): array {
if ( null === $this->teachers ) {
$raw = carbon_get_post_meta( $this->post_id, 'pksh_teachers' );
$this->teachers = is_array( $raw ) ? $raw : [];
}
return $this->teachers;
}
// ============================================================
// REVIEWS (complex)
// ============================================================
/**
* Массив отзывов (complex field pksh_reviews_list)
* @return array[]
*/
public function get_reviews(): array {
if ( null === $this->reviews ) {
$raw = carbon_get_post_meta( $this->post_id, 'pksh_reviews_list' );
$this->reviews = is_array( $raw ) ? $raw : [];
}
return $this->reviews;
}
// ============================================================
// FAQ (complex)
// ============================================================
/**
* Массив FAQ (complex field pksh_faq_items)
* @return array[]
*/
public function get_faq_items(): array {
if ( null === $this->faq ) {
$raw = carbon_get_post_meta( $this->post_id, 'pksh_faq_items' );
$this->faq = is_array( $raw ) ? $raw : [];
}
return $this->faq;
}
// ============================================================
// HONEST TIMER (shared helper)
// ============================================================
/**
* Timestamp честного дедлайна
*/
public function get_honest_deadline(): int {
if ( ! array_key_exists( 'deadline', $this->page ) ) {
$this->page['deadline'] = function_exists( 'dekart_get_honest_deadline' )
? (int) dekart_get_honest_deadline()
: 0;
}
return $this->page['deadline'];
}
/**
* Вывести HTML честного таймера + inline JS.
* Используется в #cta-test и #final-cta.
*
* @param string $label Текст над таймером.
*/
public static function render_honest_timer( string $label = 'Цены действуют до конца месяца:' ): void {
$ts = self::instance()->get_honest_deadline();
if ( $ts <= 0 ) {
return;
}
?>
<div class="honest-timer">
<span class="honest-timer__label"><?php echo esc_html( $label ); ?></span>
<div class="honest-timer__digits">
<span class="honest-timer__unit">
<span class="honest-timer__num" data-timer="d">00</span>
<span class="honest-timer__unit-label">дн</span>
</span>
<span class="honest-timer__sep">:</span>
<span class="honest-timer__unit">
<span class="honest-timer__num" data-timer="h">00</span>
<span class="honest-timer__unit-label">ч</span>
</span>
<span class="honest-timer__sep">:</span>
<span class="honest-timer__unit">
<span class="honest-timer__num" data-timer="m">00</span>
<span class="honest-timer__unit-label">мин</span>
</span>
<span class="honest-timer__sep">:</span>
<span class="honest-timer__unit">
<span class="honest-timer__num" data-timer="s">00</span>
<span class="honest-timer__unit-label">сек</span>
</span>
</div>
</div>
<script>window.__HONEST_DEADLINE=<?php echo (int) $ts; ?>;</script>
<script>
!function(){var e=window.__HONEST_DEADLINE;if(!e)return;e*=1e3;var t=document.querySelectorAll('[data-timer]');if(!t.length)return;var n={};t.forEach(function(r){n[r.getAttribute('data-timer')]=r});var o=function(r){return r<10?'0'+r:''+r};!function r(){var t=e-Date.now();if(t<=0){for(var u in n)n[u].textContent='00';return}n.d.textContent=o(Math.floor(t/864e5)),n.h.textContent=o(Math.floor(t%864e5/36e5)),n.m.textContent=o(Math.floor(t%36e5/6e4)),n.s.textContent=o(Math.floor(t%6e4/1e3)),requestAnimationFrame(r)}()}();
</script>
<?php
}
}

View File

@ -217,8 +217,8 @@ function dekart_schema_webpage(): ?array {
'speakable' => array(
'@type' => 'SpeakableSpecification',
'cssSelector' => array(
'h1.hero-pksh__title',
'.hero-pksh__subtitle',
'h1.ds-hero__h1',
'.ds-hero__subtitle',
),
),
// about — тематика страницы (образовательная услуга)
@ -698,8 +698,8 @@ function dekart_schema_local_business(): ?array {
if ( ! empty( $teachers ) && is_array( $teachers ) ) {
$employee_ids = array();
foreach ( $teachers as $i => $t ) {
$name = isset( $t['teacher_name'] ) ? trim( $t['teacher_name'] ) : '';
if ( $name ) {
$t_id = isset( $t['teacher_id'] ) ? intval( $t['teacher_id'] ) : 0;
if ( $t_id > 0 ) {
$employee_ids[] = array(
'@id' => $page_url . '#teacher-' . $i,
);
@ -771,6 +771,11 @@ function dekart_schema_course(): ?array {
$course['educationalLevel'] = wp_strip_all_tags( trim( $level ) );
}
// typicalAgeRange — возраст детей (условно, из pksh_age)
if ( ! empty( $age ) && is_string( $age ) ) {
$course['typicalAgeRange'] = wp_strip_all_tags( trim( $age ) );
}
// audience — EducationalAudience (условно)
if ( ! empty( $audience ) && is_string( $audience ) ) {
$course['audience'] = array(
@ -1233,6 +1238,8 @@ function dekart_schema_reviews(): array {
function dekart_schema_teachers(): array {
$page_url = home_url( '/podgotovka-k-shkole/' );
// pksh_teachers — complex-поле преподавателей
// Subfields: teacher_id (select → post ID), teacher_subject, teacher_about
// teacher_name и teacher_photo загружаются из карточки преподавателя
$teachers = carbon_get_post_meta( 2, 'pksh_teachers' );
if ( empty( $teachers ) || ! is_array( $teachers ) ) {
@ -1241,19 +1248,42 @@ function dekart_schema_teachers(): array {
$result = array();
foreach ( $teachers as $i => $teacher ) {
// teacher_name — ФИО преподавателя
$name = isset( $teacher['teacher_name'] ) ? trim( $teacher['teacher_name'] ) : '';
// teacher_subject — предмет / должность
// teacher_id — ID записи преподавателя из кастомного типа
$t_id = isset( $teacher['teacher_id'] ) ? intval( $teacher['teacher_id'] ) : 0;
// teacher_subject — предмет / должность (с этой страницы)
$subject = isset( $teacher['teacher_subject'] ) ? trim( $teacher['teacher_subject'] ) : '';
// teacher_about — описание / биография
// teacher_about — описание / биография (с этой страницы)
$about = isset( $teacher['teacher_about'] ) ? trim( $teacher['teacher_about'] ) : '';
// teacher_photo — фото (attachment ID или массив)
$photo = $teacher['teacher_photo'] ?? 0;
if ( $t_id < 1 ) {
continue;
}
// Загружаем имя и фото из карточки преподавателя
$t_post = get_post( $t_id );
if ( ! $t_post ) {
continue;
}
$name = $t_post->post_title;
if ( empty( $name ) ) {
continue;
}
// Фото: _teacher_avatar → _thumbnail_id → 0
$photo = get_post_meta( $t_id, '_teacher_avatar', true );
if ( ! $photo ) {
$photo = get_post_meta( $t_id, '_thumbnail_id', true );
}
// Если subject/about не заданы на странице — fallback из карточки
if ( empty( $subject ) ) {
$subject = get_post_meta( $t_id, '_teacher_direction', true );
}
if ( empty( $about ) ) {
$about = get_post_meta( $t_id, '_teacher_about', true );
}
$person = array(
'@type' => 'Person',
'@id' => $page_url . '#teacher-' . $i,
@ -1261,24 +1291,20 @@ function dekart_schema_teachers(): array {
);
// jobTitle — должность (условно)
if ( ! empty( $subject ) ) {
$person['jobTitle'] = wp_strip_all_tags( $subject );
if ( ! empty( $subject ) && is_string( $subject ) ) {
$person['jobTitle'] = wp_strip_all_tags( trim( $subject ) );
}
// description — о преподавателе (условно)
if ( ! empty( $about ) ) {
$person['description'] = wp_strip_all_tags( $about );
if ( ! empty( $about ) && is_string( $about ) ) {
$person['description'] = wp_strip_all_tags( trim( $about ) );
}
// image — фото преподавателя (условно)
if ( ! empty( $photo ) ) {
if ( is_array( $photo ) && isset( $photo['url'] ) ) {
$person['image'] = esc_url( $photo['url'] );
} else {
$url = wp_get_attachment_url( $photo );
if ( $url ) {
$person['image'] = esc_url( $url );
}
$url = wp_get_attachment_url( (int) $photo );
if ( $url ) {
$person['image'] = esc_url( $url );
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,53 +1,24 @@
<?php
/**
* Hero section cinematic split-screen redesign 2026
*
* Fields loaded from Carbon Fields tab "🖼️ Герой (баннер)".
* Город и адрес из Настроек филиала (branch_city_prep, branch_address).
*
* @package Dekart
*/
$post_id = get_the_ID();
$post_id = get_the_ID();
$page_breadcrumbs = carbon_get_post_meta( $post_id, 'page_breadcrumbs' );
// Поля из Carbon Fields (вкладка "🖼️ Герой")
$banner_img_id = carbon_get_post_meta( $post_id, 'banner_image' );
$h1 = carbon_get_post_meta( $post_id, 'banner_h1' );
$subtitle = carbon_get_post_meta( $post_id, 'banner_subtitle' );
$scarcity = carbon_get_post_meta( $post_id, 'banner_scarcity' );
// Город и адрес из Настроек филиала
$branch_city = get_option( 'branch_city_prep', 'в Щёлково' );
$branch_address = get_option( 'branch_address', 'ул. Комсомольская, 11' );
?>
<section class="hero-pksh" aria-label="Hero">
<!-- ── Background layers ── -->
<div class="hero-pksh__bg" aria-hidden="true">
<div class="hero-pksh__blob hero-pksh__blob--1"></div>
<div class="hero-pksh__blob hero-pksh__blob--2"></div>
<div class="hero-pksh__blob hero-pksh__blob--3"></div>
<div class="hero-pksh__pattern"></div>
</div>
<!-- ── Breadcrumbs ── -->
<?php if ( ! empty( $page_breadcrumbs ) ) : ?>
<nav class="hero-pksh__breadcrumbs container" aria-label="Хлебные крошки">
<section class="banner">
<?php if ( ! empty( $page_breadcrumbs ) ) { ?>
<nav class="container" aria-label="Хлебные крошки">
<ul class="breadcrumbs">
<li>
<a href="<?php echo esc_url( home_url() ); ?>/" class="home fa-home" title="Главная страница">
<span style="display:none;">Главная</span>
<svg width="21" height="16" viewBox="0 0 21 16" fill="none">
<path d="M11.6473 10.6896H12.1473V11.1896V15.4691H16.4353C16.5143 15.4691 16.5756 15.4462 16.6432 15.3788C16.7108 15.3113 16.7333 15.2505 16.7333 15.1725V9.36976L10.0513 3.8712L3.36922 9.36976V15.1725C3.36922 15.2505 3.39178 15.3113 3.45937 15.3788C3.52698 15.4462 3.5883 15.4691 3.66723 15.4691H7.95527V11.1896V10.6896H8.45527H11.6473ZM10.3711 1.74407L18.9226 8.86174L19.5643 8.09722L16.9141 5.8987L16.7333 5.74874V5.51388V0.537319H14.5413V2.86272V3.93127L13.7209 3.2466L10.6815 0.709949C10.5114 0.572829 10.3095 0.499981 10.0513 0.499981C9.79293 0.499981 9.59094 0.572914 9.42075 0.710194L0.538196 8.09712L1.17996 8.86174L9.73142 1.74407L10.0513 1.47783L10.3711 1.74407Z" fill="currentColor" stroke="currentColor"/>
<path d="M11.6473 10.6896H12.1473V11.1896V15.4691H16.4353C16.5143 15.4691 16.5756 15.4462 16.6432 15.3788C16.7108 15.3113 16.7333 15.2505 16.7333 15.1725V9.36976L10.0513 3.8712L3.36922 9.36976V15.1725C3.36922 15.2505 3.39178 15.3113 3.45937 15.3788C3.52698 15.4462 3.5883 15.4691 3.66723 15.4691H7.95527V11.1896V10.6896H8.45527H11.6473ZM10.3711 1.74407L18.9226 8.86174L19.5643 8.09722L16.9141 5.8987L16.7333 5.74874V5.51388V0.537319H14.5413V2.86272V3.93127L13.7209 3.2466L10.6815 0.709949C10.5114 0.572829 10.3095 0.499981 10.0513 0.499981C9.79293 0.499981 9.59094 0.572914 9.42075 0.710194L0.538196 8.09712L1.17996 8.86174L9.73142 1.74407L10.0513 1.47783L10.3711 1.74407Z" fill="white" stroke="white"/>
</svg>
</a>
</li>
<?php foreach ( $page_breadcrumbs as $index => $item ) :
$breadcrumbs_name = $item['breadcrumbs_name'];
$breadcrumbs_link = $item['breadcrumbs_link'];
$is_last = ( $index === count( $page_breadcrumbs ) - 1 );
?>
$is_last = ( $index === count( $page_breadcrumbs ) - 1 );
?>
<li>
<?php if ( $is_last ) : ?>
<span class="last_item"><?php echo esc_html( $breadcrumbs_name ); ?></span>
@ -60,124 +31,37 @@ $branch_address = get_option( 'branch_address', 'ул. Комсомольска
<?php endforeach; ?>
</ul>
</nav>
<?php endif; ?>
<?php } ?>
<!-- ── Main hero layout: split screen ── -->
<div class="hero-pksh__layout">
<!-- ====== LEFT COLUMN: Content ====== -->
<div class="hero-pksh__content">
<!-- Address pill -->
<div class="hero-pksh__address">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"/><circle cx="12" cy="10" r="3"/></svg>
<span><?php echo esc_html( $branch_address ); ?> — центр <?php echo esc_html( str_replace( array( 'в ', 'В ' ), '', $branch_city ) ); ?></span>
</div>
<!-- Main headline -->
<h1 class="hero-pksh__title">
<?php echo esc_html( $h1 ?: 'Подготовка к школе в Щёлково' ); ?>
</h1>
<!-- Subtitle -->
<?php if ( '' !== $subtitle ) : ?>
<p class="hero-pksh__subtitle"><?php echo esc_html( $subtitle ); ?></p>
<div class="banner-wrapper">
<?php
$foto = carbon_get_post_meta( $post_id, 'banner_img_desktop' );
$foto_mobile = carbon_get_post_meta( $post_id, 'banner_img_mobile' );
if ( empty( $foto_mobile ) ) {
$foto_mobile = $foto;
}
if ( $foto ) :
?>
<picture class="banner-fon">
<source srcset="<?php echo esc_url( wp_get_attachment_url( $foto ) ); ?>" media="(min-width: 860px)">
<img src="<?php echo esc_url( wp_get_attachment_url( $foto_mobile ) ); ?>" alt="<?php echo esc_attr( get_post_meta( $foto, '_wp_attachment_image_alt', true ) ); ?>">
</picture>
<?php endif; ?>
<div class="banner__content desktop">
<h1 class="page_title"><?php echo esc_html( carbon_get_post_meta( $post_id, 'banner_h1' ) ); ?></h1>
<?php if ( carbon_get_post_meta( $post_id, 'banner_text' ) !== '' ) : ?>
<p class="banner_text"><?php echo esc_html( carbon_get_post_meta( $post_id, 'banner_text' ) ); ?></p>
<?php endif; ?>
<!-- CTA + Scarcity -->
<div class="hero-pksh__actions">
<button class="hero-pksh__cta btn-write">Записаться на бесплатное пробное</button>
<div class="hero-pksh__scarcity">
<?php echo wp_kses_post( $scarcity ?: '🔥 Осталось <strong>2 места из 8</strong> в группе 56 лет. Стартуем <strong>1 июня</strong>' ); ?>
</div>
</div>
<!-- Trust bar -->
<div class="hero-pksh__trust">
<div class="hero-pksh__trust-item">
<span class="hero-pksh__trust-icon"></span>
<span class="hero-pksh__trust-label">Рейтинг <strong>4.8</strong></span>
</div>
<div class="hero-pksh__trust-item">
<span class="hero-pksh__trust-icon">🎓</span>
<span class="hero-pksh__trust-label"><strong>500+</strong> выпускников</span>
</div>
<div class="hero-pksh__trust-item">
<span class="hero-pksh__trust-icon">📜</span>
<span class="hero-pksh__trust-label">Гослицензия</span>
</div>
<div class="hero-pksh__trust-item">
<span class="hero-pksh__trust-icon">🛡️</span>
<span class="hero-pksh__trust-label">Гарантия результата</span>
</div>
</div>
<button class="btn-free-lesson-header btn-lilac btn-banner btn-write">Оставить заявку</button>
</div>
<!-- ====== RIGHT COLUMN: Photo of children + floating badges ====== -->
<div class="hero-pksh__visual">
<!-- Purple glow backdrop -->
<div class="hero-pksh__visual-glow" aria-hidden="true"></div>
<!-- Hero photo the emotional anchor -->
<div class="hero-pksh__photo-wrap">
<div class="hero-pksh__photo-frame">
<?php if ( $banner_img_id ) : ?>
<?php echo wp_get_attachment_image( $banner_img_id, 'full', false, array(
'class' => 'hero-pksh__photo',
'loading' => 'eager',
'decoding' => 'async',
'alt' => 'Подготовка к школе в Щёлково — занятия для детей 57 лет',
) ); ?>
<?php else : ?>
<img
src="<?php echo esc_url( get_template_directory_uri() . '/assets/images/girl_and_a_boy.webp' ); ?>"
alt="Подготовка к школе в Щёлково — занятия для детей 57 лет"
class="hero-pksh__photo"
loading="eager"
decoding="async"
width="689"
height="689"
/>
<?php endif; ?>
</div>
<!-- Photo accent glow ring -->
<div class="hero-pksh__photo-ring" aria-hidden="true"></div>
</div>
<!-- Floating badges sticky-note style around photo -->
<div class="hero-pksh__float hero-pksh__float--1">
<span class="hero-pksh__float-icon">👩‍🏫</span>
<span>Педагоги с опытом 15+ лет</span>
</div>
<div class="hero-pksh__float hero-pksh__float--2">
<span class="hero-pksh__float-icon">🎮</span>
<span>Игровая методика</span>
</div>
<div class="hero-pksh__float hero-pksh__float--3">
<span class="hero-pksh__float-icon">📚</span>
<span>Авторская программа</span>
</div>
<div class="hero-pksh__float hero-pksh__float--4">
<span>🌟 Рейтинг <strong>4.8</strong></span>
</div>
<!-- Decorative shapes -->
<div class="hero-pksh__deco hero-pksh__deco--1" aria-hidden="true"></div>
<div class="hero-pksh__deco hero-pksh__deco--2" aria-hidden="true"></div>
<div class="hero-pksh__deco hero-pksh__deco--3" aria-hidden="true"></div>
<div class="hero-pksh__deco hero-pksh__deco--4" aria-hidden="true"></div>
<!-- Sparkle particles -->
<div class="hero-pksh__sparkle" aria-hidden="true"></div>
<div class="hero-pksh__sparkle" aria-hidden="true"></div>
<div class="hero-pksh__sparkle" aria-hidden="true"></div>
<div class="hero-pksh__sparkle" aria-hidden="true"></div>
<div class="hero-pksh__sparkle" aria-hidden="true"></div>
</div>
</div>
</section>
<div class="banner__content mobile">
<p class="page_title"><?php echo esc_html( carbon_get_post_meta( $post_id, 'banner_h1' ) ); ?></p>
<?php if ( carbon_get_post_meta( $post_id, 'banner_text' ) !== '' ) : ?>
<p class="banner_text"><?php echo esc_html( carbon_get_post_meta( $post_id, 'banner_text' ) ); ?></p>
<?php endif; ?>
</div>
<button class="mobile btn-write btn-lilac btn-page">Записаться</button>

View File

@ -0,0 +1,26 @@
<?php
/**
* Хлебные крошки для страницы Подготовки к школе
* Schema.org BreadcrumbList
*
* @package Dekart
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
?>
<div class="container breadcrumbs-wrapper">
<ul class="breadcrumbs" itemscope itemtype="https://schema.org/BreadcrumbList" role="navigation" aria-label="Breadcrumb">
<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
<a href="<?php echo esc_url( home_url( '/' ) ); ?>" itemprop="item" title="Главная">
<span itemprop="name">Главная</span>
</a>
<meta itemprop="position" content="1">
</li>
<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
<span class="last_item" itemprop="name">Подготовка к школе</span>
<meta itemprop="position" content="2">
</li>
</ul>
</div>

View File

@ -0,0 +1,46 @@
<?php
/**
* Чек-лист готовности к школе (микро-коммитмент)
* .bento .pksh-section .bento-card--checklist
*
* @package Dekart
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
?>
<section class="bento pksh-section" aria-label="Скачать чек-лист">
<div class="bento__full bento-card bento-card--checklist">
<div class="micro-commit">
<div class="micro-commit__content">
<span class="bento-label">Бесплатно</span>
<h2 class="bento-h2">Скачайте чек-лист готовности к школе</h2>
<p class="bento-p">10 признаков, что ваш ребёнок готов к 1-му классу. Проверьте за 5 минут и узнайте, на какие навыки обратить внимание.</p>
<div class="micro-commit__action">
<button class="btn-primary btn-write micro-commit__btn">Получить чек-лист бесплатно</button>
</div>
</div>
<div class="micro-commit__visual">
<svg class="micro-commit__svg" viewBox="0 0 130 170" fill="none" aria-hidden="true">
<rect x="8" y="4" width="114" height="162" rx="8" fill="white" stroke="#DED3C0" stroke-width="1.2"/>
<rect x="24" y="20" width="82" height="4" rx="2" fill="#7C3AED" opacity="0.15"/>
<rect x="24" y="38" width="12" height="12" rx="3" fill="#7C3AED" opacity="0.15"/>
<path d="M26 44l3 3 5-5" stroke="#7C3AED" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" opacity="0.4"/>
<rect x="44" y="40" width="50" height="3" rx="1.5" fill="#DED3C0" opacity="0.6"/>
<rect x="24" y="62" width="12" height="12" rx="3" fill="#7C3AED" opacity="0.15"/>
<path d="M26 68l3 3 5-5" stroke="#7C3AED" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" opacity="0.4"/>
<rect x="44" y="64" width="62" height="3" rx="1.5" fill="#DED3C0" opacity="0.6"/>
<rect x="24" y="86" width="12" height="12" rx="3" fill="#7C3AED" opacity="0.15"/>
<rect x="44" y="88" width="42" height="3" rx="1.5" fill="#DED3C0" opacity="0.6"/>
<rect x="24" y="110" width="12" height="12" rx="3" fill="#7C3AED" opacity="0.15"/>
<rect x="44" y="112" width="56" height="3" rx="1.5" fill="#DED3C0" opacity="0.6"/>
<g transform="translate(92, 130) rotate(-30)">
<rect x="0" y="0" width="6" height="28" rx="1" fill="#7C3AED" opacity="0.12"/>
<polygon points="0,0 6,0 3,-6" fill="#7C3AED" opacity="0.15"/>
</g>
</svg>
</div>
</div>
</div>
</section>

View File

@ -0,0 +1,127 @@
<?php
/**
* Таблица сравнения: Декарт vs Репетитор vs Кружок
* .bento .pksh-section
*
* @package Dekart
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
$data = Pksh_Data::instance();
$compare_rows = $data->get_compare_rows();
$compare_footnote = $data->get_compare_footnote();
?>
<section class="bento pksh-section" aria-label="Сравнение">
<div class="bento__full section-header--centered">
<span class="bento-label">Почему мы</span>
<h2 class="bento-h2">Как мы отличаемся от репетитора и обычного кружка</h2>
<p class="bento-p">Мы частная школа с гослицензией, а не кружок. Занятия ведут действующие учителя начальных классов. Результат гарантируем договором.</p>
</div>
<div class="pksh-swipe-hint" aria-hidden="true">
<span class="pksh-swipe-hint__arrow">👇</span>
<span class="pksh-swipe-hint__text">Листайте, чтобы сравнить</span>
</div>
<div class="lw-scroll-x pksh-compare">
<table class="pksh-compare__table">
<thead>
<tr>
<th class="pksh-compare__label-cell" scope="col">Критерий</th>
<th class="pksh-compare__highlight" scope="col">
<span class="pksh-compare__col-title">Декарт</span>
<span class="pksh-compare__col-badge">Частная школа</span>
</th>
<th scope="col">Репетитор</th>
<th scope="col">Обычный кружок</th>
</tr>
</thead>
<tbody>
<?php if ( is_array( $compare_rows ) && ! empty( $compare_rows ) ) : ?>
<?php foreach ( $compare_rows as $row ) :
$criteria = $row['criteria'] ?? '';
$dekart_icon = $row['dekart_icon'] ?? '';
$dekart_text = $row['dekart_text'] ?? '';
$repetitor_icon = $row['repetitor_icon'] ?? '';
$repetitor_text = $row['repetitor_text'] ?? '';
$kruzhok_icon = $row['kruzhok_icon'] ?? '';
$kruzhok_text = $row['kruzhok_text'] ?? '';
?>
<tr>
<td class="pksh-compare__label-cell"><?php echo esc_html( $criteria ); ?></td>
<td class="pksh-compare__highlight">
<?php if ( 'yes' === $dekart_icon ) : ?>
<span class="pksh-compare__yes"></span>
<?php elseif ( 'no' === $dekart_icon ) : ?>
<span class="pksh-compare__no"></span>
<?php endif; ?>
<?php echo esc_html( $dekart_text ); ?>
</td>
<td>
<?php if ( 'yes' === $repetitor_icon ) : ?>
<span class="pksh-compare__yes"></span>
<?php elseif ( 'no' === $repetitor_icon ) : ?>
<span class="pksh-compare__no"></span>
<?php endif; ?>
<?php echo esc_html( $repetitor_text ); ?>
</td>
<td>
<?php if ( 'yes' === $kruzhok_icon ) : ?>
<span class="pksh-compare__yes"></span>
<?php elseif ( 'no' === $kruzhok_icon ) : ?>
<span class="pksh-compare__no"></span>
<?php endif; ?>
<?php echo esc_html( $kruzhok_text ); ?>
</td>
</tr>
<?php endforeach; ?>
<?php else : ?>
<!-- Fallback: пока CF не заполнены -->
<tr>
<td class="pksh-compare__label-cell">Гослицензия</td>
<td class="pksh-compare__highlight"><span class="pksh-compare__yes"></span> Есть</td>
<td><span class="pksh-compare__no"></span> Нет</td>
<td><span class="pksh-compare__no"></span> Чаще нет</td>
</tr>
<tr>
<td class="pksh-compare__label-cell">Формат занятий</td>
<td class="pksh-compare__highlight">Группы до 10 человек, индивидуальный подход</td>
<td>Индивидуально, но без сверстников</td>
<td>Группы 1520+ человек</td>
</tr>
<tr>
<td class="pksh-compare__label-cell">Гарантия результата</td>
<td class="pksh-compare__highlight"><span class="pksh-compare__yes"></span> Не начнёт читать вернём деньги</td>
<td><span class="pksh-compare__no"></span> Нет гарантии</td>
<td><span class="pksh-compare__no"></span> Нет гарантии</td>
</tr>
<tr>
<td class="pksh-compare__label-cell">Цена за 1 занятие</td>
<td class="pksh-compare__highlight">от 1 000 </td>
<td><span class="pksh-compare__draft">[черновик]</span> 1 5002 500 </td>
<td><span class="pksh-compare__draft">[черновик]</span> 8001 200 </td>
</tr>
<tr>
<td class="pksh-compare__label-cell">Педагоги</td>
<td class="pksh-compare__highlight">Действующие учителя начальных классов</td>
<td>Часто студенты или пенсионеры</td>
<td>Педагоги доп. образования</td>
</tr>
<tr>
<td class="pksh-compare__label-cell">Итоговый документ</td>
<td class="pksh-compare__highlight"><span class="pksh-compare__yes"></span> Характеристика готовности к школе</td>
<td><span class="pksh-compare__no"></span> Нет</td>
<td><span class="pksh-compare__no"></span> Нет</td>
</tr>
<?php endif; ?>
</tbody>
</table>
<?php if ( ! empty( $compare_footnote ) ) : ?>
<p class="pksh-compare__footnote"><?php echo wp_kses_post( $compare_footnote ); ?></p>
<?php endif; ?>
</div>
</section>

View File

@ -0,0 +1,115 @@
<?php
/**
* Контакты + Яндекс.Карта
* .bento .pksh-section #pksh-contact
*
* @package Dekart
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
$data = Pksh_Data::instance();
$opt_phone = $data->get_phone();
$opt_email = $data->get_email();
$opt_address = $data->get_address();
$opt_social = $data->get_social_links();
$opt_coords = $data->get_coords();
$opt_name = $data->get_name();
?>
<section class="bento pksh-section" id="pksh-contact" aria-label="Контакты">
<div class="bento__full section-header--centered">
<span class="bento-label">Контакты</span>
<h2 class="bento-h2">Наш адрес</h2>
<p class="bento-p">Ждём вас в гости удобно добираться из любого района города</p>
</div>
<div class="bento__full pksh-contact">
<div class="pksh-contact__wrapper">
<div class="pksh-contact__info">
<?php if ( ! empty( $opt_phone ) ) : ?>
<div class="pksh-contact__subtitle">Телефон:</div>
<a class="pksh-contact__value" href="tel:+<?php echo preg_replace( '/[^0-9]/', '', $opt_phone ); ?>"><?php echo esc_html( $opt_phone ); ?></a>
<?php endif; ?>
<?php if ( ! empty( $opt_email ) ) : ?>
<div class="pksh-contact__subtitle">Почта:</div>
<a class="pksh-contact__value" href="mailto:<?php echo esc_attr( $opt_email ); ?>"><?php echo esc_html( $opt_email ); ?></a>
<?php endif; ?>
<?php if ( ! empty( $opt_address ) ) : ?>
<div class="pksh-contact__subtitle">Адрес:</div>
<div class="pksh-contact__value"><?php echo esc_html( $opt_address ); ?></div>
<?php endif; ?>
<?php if ( ! empty( $opt_social ) && is_array( $opt_social ) ) : ?>
<div class="pksh-contact__subtitle">Наши соцсети:</div>
<div class="pksh-contact__social">
<?php foreach ( $opt_social as $item ) :
$link = $item['url'] ?? '';
$name = $item['name'] ?? '';
if ( $link ) : ?>
<a class="pksh-contact__social-link" href="<?php echo esc_url( $link ); ?>" target="_blank" rel="noopener noreferrer" title="<?php echo esc_attr( $name ); ?>">
<?php echo esc_html( $name ?: $link ); ?>
</a>
<?php endif; ?>
<?php endforeach; ?>
</div>
<?php endif; ?>
</div>
<div class="pksh-contact__map">
<div id="ya-map" style="width: 100%; height: 100%; min-height: 400px;"></div>
</div>
</div>
</div>
</section>
<script>
(function() {
var mapCoords = [<?php echo esc_js( $opt_coords ?: '55.7558,37.6173' ); ?>];
var mapLabel = '<?php echo esc_js( $opt_name ); ?>';
var mapLoaded = false;
var apiLoading = false;
function initMap() {
ymaps.ready(function() {
var map = new ymaps.Map('ya-map', {
center: mapCoords,
zoom: 16
}, {
searchControlProvider: 'yandex#search'
});
var placemark = new ymaps.Placemark(
mapCoords,
{ iconContent: mapLabel },
{ preset: 'islands#redStretchyIcon' }
);
map.geoObjects.add(placemark);
mapLoaded = true;
});
}
function loadYandexMaps() {
if (mapLoaded || apiLoading) return;
apiLoading = true;
var script = document.createElement('script');
script.src = 'https://api-maps.yandex.ru/2.1/?lang=ru_RU';
script.onerror = function() { <?php if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) : ?>console.warn("Yandex Maps API failed to load");<?php endif; ?> apiLoading = false; };
script.onload = initMap;
document.head.appendChild(script);
}
function onScroll() {
if ((window.pageYOffset || document.documentElement.scrollTop) > 100) {
loadYandexMaps();
window.removeEventListener('scroll', onScroll);
}
}
window.addEventListener('load', function() {
setTimeout(function() {
if (!mapLoaded && !apiLoading) loadYandexMaps();
}, 3000);
});
window.addEventListener('scroll', onScroll, { passive: true });
})();
</script>

View File

@ -0,0 +1,30 @@
<?php
/**
* CTA запись на бесплатное тестирование + честный таймер
* .bento .pksh-section
*
* @package Dekart
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
$data = Pksh_Data::instance();
$timer_ts = $data->get_honest_deadline();
?>
<section class="bento pksh-section" aria-label="Запись на тестирование">
<div class="bento__full">
<div class="cta-test">
<div class="cta-test__badge">Бесплатно</div>
<h2 class="bento-h2 cta-test__title">Приходите на пробное увидите результат своими глазами</h2>
<p class="cta-test__text">Запишитесь на <strong>бесплатное расширенное тестирование</strong> и полноценное занятие. Педагог проверит готовность ребёнка к школе, покажет сильные стороны и даст план подготовки. <strong>Всего за 1 визит</strong> без очередей и ожидания.</p>
<?php if ( $timer_ts > 0 ) : ?>
<?php Pksh_Data::render_honest_timer( 'Цены действуют до конца месяца:' ); ?>
<?php endif; ?>
<button class="btn-primary btn-primary--large open-bitrix-form cta-test__btn">Записаться на бесплатное тестирование</button>
</div>
</div>
</section>

View File

@ -0,0 +1,41 @@
<?php
/**
* Отзывы на внешних площадках (Яндекс, 2ГИС, ВК, Otzovik)
* .bento .pksh-section
*
* @package Dekart
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
?>
<section class="bento pksh-section" aria-label="Отзывы на внешних площадках">
<div class="bento__full">
<div class="external-reviews">
<h2 class="bento-h2">Нас рекомендуют на площадках</h2>
<div class="external-reviews__grid">
<a href="https://yandex.ru/maps/org/detskiy_tsentr_dekart/155905693075/" target="_blank" rel="noopener noreferrer" class="external-reviews__card">
<span class="external-reviews__icon">Я</span>
<span class="external-reviews__name">Яндекс.Карты</span>
<span class="external-reviews__rating"> 4.8</span>
</a>
<a href="https://2gis.ru/schelkovo/firm/155905693075" target="_blank" rel="noopener noreferrer" class="external-reviews__card">
<span class="external-reviews__icon">2ГИС</span>
<span class="external-reviews__name">2ГИС</span>
<span class="external-reviews__rating"> 4.7</span>
</a>
<a href="https://vk.com/dekart_school" target="_blank" rel="noopener noreferrer" class="external-reviews__card">
<span class="external-reviews__icon">ВК</span>
<span class="external-reviews__name">ВКонтакте</span>
<span class="external-reviews__rating"> 4.9</span>
</a>
<a href="https://otzovik.com/reviews/detskiy_centr_dekart/" target="_blank" rel="noopener noreferrer" class="external-reviews__card">
<span class="external-reviews__icon">O</span>
<span class="external-reviews__name">Otzovik</span>
<span class="external-reviews__rating"> 4.6</span>
</a>
</div>
</div>
</div>
</section>

View File

@ -0,0 +1,54 @@
<?php
/**
* FAQ Часто задаваемые вопросы (две колонки, аккордеон)
* .section-bg .faq-section #faq
*
* @package Dekart
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
$data = Pksh_Data::instance();
$faq_items = $data->get_faq_items();
?>
<section class="section-bg faq-section" id="faq" aria-label="Вопросы и ответы">
<div class="bento">
<h2 class="faq-section__title">Часто задаваемые вопросы</h2>
<?php if ( ! empty( $faq_items ) && is_array( $faq_items ) ) :
$col1 = '';
$col2 = '';
$count = 0;
foreach ( $faq_items as $item ) :
$q = $item['faq_question'] ?? '';
$a = $item['faq_answer'] ?? '';
if ( empty( $q ) && empty( $a ) ) { continue; }
$accordion = '<div class="box__accordion">'
. '<div class="box__accordion_label" role="button" tabindex="0">'
. '<span>' . esc_html( $q ) . '</span>'
. '<svg role="presentation" focusable="false" width="24px" height="24px" viewBox="0 0 24 24">'
. '<g stroke="none" stroke-width="2px" fill="none" fill-rule="evenodd" stroke-linecap="square">'
. '<g transform="translate(1.000000, 1.000000)" stroke="currentColor">'
. '<path d="M0,11 L22,11"></path>'
. '<path d="M11,0 L11,22"></path>'
. '</g></g></svg></div>'
. '<div class="box__accordion_content">'
. '<div class="box__accordion_content-text">' . wp_kses_post( $a ) . '</div>'
. '</div></div>';
if ( $count % 2 === 0 ) {
$col1 .= $accordion;
} else {
$col2 .= $accordion;
}
$count++;
endforeach;
if ( ! empty( $col1 ) || ! empty( $col2 ) ) :
?>
<div class="faq-section__wrapper">
<div class="faq-section__col"><?php echo $col1; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?></div>
<div class="faq-section__col"><?php echo $col2; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?></div>
</div>
<?php endif; endif; ?>
</div>
</section>

View File

@ -0,0 +1,30 @@
<?php
/**
* Финальный CTA запись на бесплатное пробное
* .bento .pksh-section #final-cta
*
* @package Dekart
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
$data = Pksh_Data::instance();
$timer_ts = $data->get_honest_deadline();
?>
<section class="bento pksh-section" id="final-cta" aria-label="Запись">
<div class="bento__full">
<div class="final-cta">
<h2 class="bento-h2">Первое занятие бесплатно</h2>
<p class="final-cta__text">Ребёнок познакомится с педагогом, попробует задания. Вы увидите методику своими глазами. Никакой оплаты и договоров.</p>
<?php if ( $timer_ts > 0 ) : ?>
<?php Pksh_Data::render_honest_timer( 'Акция действует еще:' ); ?>
<?php endif; ?>
<button class="btn-primary btn-primary--large open-bitrix-form btn-write">Записаться на бесплатное пробное</button>
<p class="final-cta__footnote">🔥 Осталось 2 места в группе 56 лет. Успейте!</p>
</div>
</div>
</section>

View File

@ -0,0 +1,32 @@
<?php
/**
* Гарантия + навигация по странице (первый блок после social proof)
* .bento .pksh-section
*
* @package Dekart
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
?>
<section class="bento pksh-section" aria-label="Гарантия">
<div class="bento__full">
<div class="guarantee-hero">
<div class="guarantee-hero__badges">
<div class="guarantee-hero__shield">🛡️</div>
</div>
<div class="guarantee-hero__content">
<h2 class="bento-h2">Ваш ребёнок начнёт читать через 3 недели</h2>
<p class="guarantee-hero__text">Или <strong>мы вернём деньги</strong> и продолжим обучение бесплатно, пока не дойдём до результата. Мы частная школа <strong>с гослицензией</strong>, а не кружок. Отвечаем за результат.</p>
</div>
<nav class="pksh-anchor-nav" aria-label="Навигация по странице">
<a href="#how-it-works" class="pksh-anchor-link">Как проходят занятия</a>
<a href="#results" class="pksh-anchor-link">Результаты</a>
<a href="#programs" class="pksh-anchor-link">Программы</a>
<a href="#teachers" class="pksh-anchor-link">Преподаватели</a>
<a href="#faq" class="pksh-anchor-link">Вопросы</a>
</nav>
</div>
</div>
</section>

View File

@ -0,0 +1,25 @@
<?php
/**
* Гарантия результата (второй блок, отдельный)
* .bento .pksh-section .pksh-section--alt #guarantee
*
* @package Dekart
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
?>
<section class="bento pksh-section pksh-section--alt" id="guarantee" aria-label="Гарантия">
<div class="bento__full">
<div class="guarantee-block guarantee-block--centered">
<h2 class="bento-h2">🛡️ Гарантия результата</h2>
<p class="guarantee-block__text">
Если через 3 месяца ваш ребёнок не начнёт читать &mdash;
мы вернём деньги <strong>и продолжим обучение бесплатно</strong>,
пока не дойдём до результата.
</p>
<span class="guarantee-block__badge">Так работают только те, кто уверен в своём методе</span>
</div>
</div>
</section>

View File

@ -0,0 +1,129 @@
<?php
/**
* Hero-секция страницы Подготовки к школе
* .section-bg .ds-hero
*
* @package Dekart
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
$data = Pksh_Data::instance();
$opt_address = $data->get_address();
$branch_city_clean = $data->get_city_clean();
$h1_hero = $data->get_h1();
$subtitle_hero = $data->get_subtitle();
$ext_review_count = $data->get_ext_review_count();
$opt_phone = $data->get_phone();
$hero_phone_clean = $data->get_phone_clean();
$banner_img_id = $data->get_banner_image_id();
$hero_metrics = $data->get_social_counters();
?>
<section class="section-bg ds-hero" data-bg="hero" id="ds-hero" aria-label="Подготовка к школе">
<div class="ds-container">
<div class="ds-hero__inner">
<div class="ds-hero__content">
<div class="ds-hero__address">
<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="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"/>
<circle cx="12" cy="10" r="3"/>
</svg>
<span><?php echo esc_html( $opt_address ?: 'ул. Талсинская, 24' ); ?> — центр <?php echo esc_html( $branch_city_clean ?: 'Щёлково' ); ?></span>
</div>
<h1 class="ds-hero__h1"><?php echo esc_html( $h1_hero ?: 'Подготовка к школе в Щёлково' ); ?></h1>
<?php if ( '' !== $subtitle_hero ) : ?>
<p class="ds-hero__subtitle"><?php echo esc_html( $subtitle_hero ); ?></p>
<?php endif; ?>
<?php if ( ! empty( $hero_metrics ) && is_array( $hero_metrics ) ) : ?>
<div class="ds-hero__metrics">
<?php foreach ( $hero_metrics as $metric ) :
$num = $metric['counter_number'] ?? '';
$lbl = $metric['counter_label'] ?? '';
if ( empty( $num ) ) { continue; }
?>
<div class="ds-hero__metric reveal">
<span class="ds-hero__metric-number"><?php echo esc_html( $num ); ?></span>
<span class="ds-hero__metric-label"><?php echo esc_html( $lbl ); ?></span>
</div>
<?php endforeach; ?>
</div>
<?php endif; ?>
<div class="ds-hero__rating-badge">
<span class="ds-hero__rating-stars" aria-hidden="true">★★★★★</span>
<span class="ds-hero__rating-text">4.9 из 5 на основе <?php echo esc_html( $ext_review_count ); ?> отзывов на внешних площадках</span>
</div>
<button class="ds-hero__cta-btn open-bitrix-form">Записаться на бесплатное пробное</button>
<?php if ( $opt_phone ) : ?>
<p class="ds-hero__phone">Или позвоните: <a href="tel:<?php echo esc_attr( $hero_phone_clean ); ?>" aria-label="Позвонить в школу Декарт: <?php echo esc_attr( $opt_phone ); ?>"><?php echo esc_html( $opt_phone ); ?></a></p>
<?php endif; ?>
</div>
<div class="ds-hero__visual">
<div class="ds-hero__visual-glow" aria-hidden="true"></div>
<div class="ds-hero__photo-wrap">
<div class="ds-hero__photo-frame">
<?php if ( $banner_img_id ) : ?>
<?php echo wp_get_attachment_image( $banner_img_id, 'full', false, array(
'class' => 'ds-hero__photo',
'loading' => 'eager',
'decoding' => 'async',
'alt' => 'Подготовка к школе в Щёлково — занятия для детей 57 лет',
) ); ?>
<?php else : ?>
<img class="ds-hero__photo" loading="eager" decoding="async"
src="<?php echo esc_url( get_template_directory_uri() . '/assets/images/girl_and_a_boy.webp' ); ?>"
alt="Подготовка к школе в Щёлково — занятия для детей 57 лет"
width="689" height="689">
<?php endif; ?>
</div>
<div class="ds-hero__photo-ring" aria-hidden="true"></div>
</div>
<div class="ds-hero__float ds-hero__float--1">
<span class="ds-hero__float-icon">👩‍🏫</span>
<span>Педагоги с опытом 15+ лет</span>
</div>
<div class="ds-hero__float ds-hero__float--2">
<span class="ds-hero__float-icon">🎮</span>
<span>Игровая методика</span>
</div>
<div class="ds-hero__float ds-hero__float--3">
<span class="ds-hero__float-icon">📚</span>
<span>Авторская программа</span>
</div>
<div class="ds-hero__float ds-hero__float--4">
<span class="ds-hero__float-icon">🌟</span>
<span>Рейтинг 4.8</span>
</div>
<div class="ds-hero__deco ds-hero__deco--1" aria-hidden="true"></div>
<div class="ds-hero__deco ds-hero__deco--2" aria-hidden="true"></div>
<div class="ds-hero__deco ds-hero__deco--3" aria-hidden="true"></div>
<div class="ds-hero__deco ds-hero__deco--4" aria-hidden="true"></div>
<div class="ds-hero__sparkles" aria-hidden="true">
<div class="ds-hero__sparkle"></div>
<div class="ds-hero__sparkle"></div>
<div class="ds-hero__sparkle"></div>
<div class="ds-hero__sparkle"></div>
<div class="ds-hero__sparkle"></div>
</div>
</div>
</div>
</div>
</section>

View File

@ -0,0 +1,89 @@
<?php
/**
* Как проходят занятия + почему родители выбирают нас
* .bento .pksh-section #how-it-works
*
* @package Dekart
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
?>
<section class="bento pksh-section" id="how-it-works" aria-label="Как проходят занятия">
<div class="bento__full section-header--centered">
<span class="bento-label">Как проходят занятия</span>
<h2 class="bento-h2">30 минут игры 1 шаг к школе</h2>
<p class="bento-p">Каждое занятие построено так, что ребёнок <strong>сам хочет</strong> вернуться. Без скучных прописей только игровая методика и смена активностей каждые 7 минут.</p>
</div>
<div class="bento__half bento-card bento-card--soft">
<span class="bento-label">Структура занятия</span>
<h2 class="bento-h2">Каждый урок мини-путешествие</h2>
<p class="bento-p">Ребёнок не сидит за партой 30 минут. Мы меняем активность каждые 7 минут мозг не устаёт, интерес не гаснет.</p>
<div class="steps-3">
<div class="step">
<div class="step__icon">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none"><path d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg>
</div>
<div>
<strong>Вход в тему</strong>
<span>Короткая история или загадка включаем интерес</span>
</div>
</div>
<div class="step">
<div class="step__icon">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none"><path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6-1.6 1.6a1 1 0 0 0 1.4 1.4l2.3-2.3a1 1 0 0 0 0-1.4L16.1 6.3a1 1 0 0 0-1.4 0z" fill="currentColor"/><path d="M4 6h13M4 12h9M4 18h13" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg>
</div>
<div>
<strong>Игровое задание</strong>
<span>Чтение, счёт, логика через механику игры</span>
</div>
</div>
<div class="step">
<div class="step__icon">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none"><path d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg>
</div>
<div>
<strong>Рефлексия</strong>
<span>Ребёнок сам рассказывает, чему научился</span>
</div>
</div>
</div>
</div>
<div class="bento__half bento-card bento-card--objections">
<span class="bento-label">Почему родители выбирают нас</span>
<h2 class="bento-h2">Три главных вопроса честные ответы</h2>
<p class="bento-p">Мы не обещаем чуда мы даём системную подготовку к школе, которую <strong>видят учителя</strong> в первую же неделю.</p>
<div class="objection-list">
<div class="objection-item">
<div class="objection-item__icon">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none"><path d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z" stroke="#059669" stroke-width="2" stroke-linecap="round"/></svg>
</div>
<div>
<strong>Не перегрузят ли ребёнка?</strong>
<p>Занятия по 3040 минут. Каждые 7 минут смена активности. Ребёнок не устаёт.</p>
</div>
</div>
<div class="objection-item">
<div class="objection-item__icon">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none"><path d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z" stroke="#059669" stroke-width="2" stroke-linecap="round"/></svg>
</div>
<div>
<strong>Успеем ли до сентября?</strong>
<p>Да. Наша программа рассчитана на 46 месяцев. Первые результаты через 3 недели.</p>
</div>
</div>
<div class="objection-item">
<div class="objection-item__icon">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none"><path d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z" stroke="#059669" stroke-width="2" stroke-linecap="round"/></svg>
</div>
<div>
<strong>Дорого?</strong>
<p>От 600 за занятие. Первое бесплатно. А если не понравится вернём деньги.</p>
</div>
</div>
</div>
</div>
</section>

View File

@ -0,0 +1,183 @@
<?php
/**
* Программы подготовки (базовая + премиум)
* .bento .pksh-section #programs
*
* @package Dekart
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
$data = Pksh_Data::instance();
$base = $data->get_base_program();
$prem = $data->get_premium_program();
?>
<section class="bento pksh-section" id="programs" aria-label="Программы подготовки">
<div class="bento__full section-header--centered">
<span class="bento-label">Программы</span>
<h2 class="bento-h2">Выберите формат подготовки</h2>
<p class="bento-p">Все программы ведут действующие педагоги начальных классов. Группы до 10 человек каждому ребёнку уделяем внимание.</p>
<div class="pksh-swipe-hint" aria-hidden="true">
<span class="pksh-swipe-hint__arrow">👇</span>
<span class="pksh-swipe-hint__text">Листайте, чтобы сравнить программы</span>
</div>
<div class="programs-grid">
<!-- Премиум программа -->
<div class="prog-card prog-card--premium">
<div class="prog-card__header">
<div class="prog-card__header-badge">Первое занятие бесплатно</div>
<div class="prog-card__header-row">
<div class="prog-card__icon prog-card__icon--double">⭐⭐</div>
<div>
<div class="prog-card__name"><?php echo esc_html( $prem['name'] ); ?></div>
<div class="prog-card__subname"><?php echo esc_html( $prem['subname'] ); ?></div>
</div>
</div>
<div class="prog-card__popular">Популярный&nbsp;выбор · 70% родителей выбирают эту программу</div>
</div>
<div class="prog-card__body">
<div class="prog-card__pricing">
<div class="prog-card__price prog-card__price--premium"><?php echo esc_html( $prem['price_sub'] ); ?> <span class="prog-card__price-period">стоимость абонемента за 4 недели</span></div>
<div class="prog-card__price-sub"><?php echo esc_html( $prem['price_single'] ); ?> за занятие — дешевле репетитора</div>
<div class="prog-card__price-single">Разовое занятие вне абонемента: <?php echo esc_html( $prem['price_single'] ); ?></div>
<div class="prog-card__urgency"><?php echo esc_html( $prem['urgency'] ); ?></div>
</div>
<div class="prog-card__result">
<span class="prog-card__result-icon">🎯</span>
<span><strong>Через 2 месяца</strong> чтение целыми словами и счёт до 20</span>
</div>
<div class="prog-card__block">
<div class="prog-card__block-title">Что получит ребёнок</div>
<ul class="prog-card__checklist">
<li>Чтение целыми словами, письмо, математика готовность к 1-му классу</li>
<li>Поднимает руку, отвечает у доски без страха</li>
<li>Ребёнок идёт на занятия с удовольствием игровая методика</li>
<li>Все материалы и пособия включены в стоимость</li>
<li class="prog-card__checklist--plus"> На 30% больше практики результат в 1,5 раза быстрее</li>
<li class="prog-card__checklist--plus"> Углублённая подготовка: ребёнок опережает сверстников на полгода</li>
<li class="prog-card__checklist--plus"> Творческие задания и проекты развиваем мышление, а не память</li>
</ul>
</div>
<div class="prog-card__compare">
<span class="prog-card__compare-icon">📈</span>
<span><strong>На 50% больше занятий</strong> результат наступает на 3 недели раньше, чем при стандартной нагрузке</span>
</div>
<div class="prog-card__schedule-wrap">
<div class="prog-card__block-title">Расписание</div>
<div class="prog-card__schedule"><?php echo esc_html( $prem['schedule'] ); ?></div>
</div>
<div class="prog-card__struct-wrap">
<div class="prog-card__block-title">Структура занятия</div>
<div class="prog-card__tags">
<span class="prog-card__tag">Нейрогимнастика</span>
<span class="prog-card__tag">Математика и логика</span>
<span class="prog-card__tag">Активная перемена</span>
<span class="prog-card__tag">Чтение и письмо</span>
<span class="prog-card__tag">Творчество</span>
</div>
</div>
<div class="prog-card__trust">
<span>👥 до 10 детей</span>
<span>🎂 57 лет</span>
<span>📍 очно, Щёлково</span>
<span>👩‍🏫 педагог: стаж 12 лет</span>
</div>
<div class="prog-card__social-proof">
<span class="prog-card__rating">4.8 рейтинг программы</span>
<span class="prog-card__graduates">🎓 500+ детей уже прошли</span>
</div>
<div class="prog-card__btn-wrap">
<button class="prog-card__btn open-bitrix-form">Попробовать бесплатно</button>
</div>
<div class="prog-card__footnote">Тестирование и первое занятие бесплатно. Результат увидите до оплаты.</div>
</div>
</div>
<!-- Базовая программа -->
<div class="prog-card prog-card--base">
<div class="prog-card__header">
<div class="prog-card__header-badge">Первое занятие бесплатно</div>
<div class="prog-card__header-row">
<div class="prog-card__icon"></div>
<div>
<div class="prog-card__name"><?php echo esc_html( $base['name'] ); ?></div>
<div class="prog-card__subname"><?php echo esc_html( $base['subname'] ); ?></div>
</div>
</div>
</div>
<div class="prog-card__body">
<div class="prog-card__pricing">
<div class="prog-card__price"><?php echo esc_html( $base['price_sub'] ); ?> <span class="prog-card__price-period">стоимость абонемента за 4 недели</span></div>
<div class="prog-card__price-sub"><?php echo esc_html( $base['price_single'] ); ?> за занятие — дешевле репетитора</div>
<div class="prog-card__price-single">Разовое занятие вне абонемента: <?php echo esc_html( $base['price_single'] ); ?></div>
<div class="prog-card__urgency"><?php echo esc_html( $base['urgency'] ); ?></div>
</div>
<div class="prog-card__result">
<span class="prog-card__result-icon">🎯</span>
<span><strong>Через 2 месяца</strong> осознанное чтение по слогам</span>
</div>
<div class="prog-card__block">
<div class="prog-card__block-title">Что получит ребёнок</div>
<ul class="prog-card__checklist">
<li>Чтение по слогам, письмо, математика готовность к 1-му классу</li>
<li>Поднимает руку, отвечает у доски без страха</li>
<li>Ребёнок идёт на занятия с удовольствием игровая методика</li>
<li>Все материалы и пособия включены в стоимость</li>
</ul>
</div>
<div class="prog-card__schedule-wrap">
<div class="prog-card__block-title">Расписание</div>
<div class="prog-card__schedule"><?php echo esc_html( $base['schedule'] ); ?></div>
</div>
<div class="prog-card__struct-wrap">
<div class="prog-card__block-title">Структура занятия</div>
<div class="prog-card__tags">
<span class="prog-card__tag">Нейрогимнастика</span>
<span class="prog-card__tag">Математика и логика</span>
<span class="prog-card__tag">Активная перемена</span>
<span class="prog-card__tag">Чтение и письмо</span>
<span class="prog-card__tag">Творчество</span>
</div>
</div>
<div class="prog-card__trust">
<span>👥 до 10 детей</span>
<span>🎂 57 лет</span>
<span>📍 очно, Щёлково</span>
<span>👩‍🏫 педагог: стаж 12 лет</span>
</div>
<div class="prog-card__social-proof">
<span class="prog-card__rating">4.8 рейтинг программы</span>
<span class="prog-card__graduates">🎓 500+ детей уже прошли</span>
</div>
<div class="prog-card__btn-wrap">
<button class="prog-card__btn open-bitrix-form">Попробовать бесплатно</button>
</div>
<div class="prog-card__footnote">Тестирование и первое занятие бесплатно. Результат увидите до оплаты.</div>
</div>
</div>
</div>
</div>
</section>

View File

@ -0,0 +1,37 @@
<?php
/**
* Результаты учеников
* .bento .pksh-section #results .bento-card--highlight-results
*
* @package Dekart
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
?>
<section class="bento pksh-section" id="results" aria-label="Результаты учеников">
<div class="bento__full bento-card bento-card--highlight-results section-header--centered">
<span class="bento-label bento-label--light">Результаты наших учеников</span>
<h2 class="bento-h2 bento-h2--light">К чему мы приводим детей</h2>
<p class="bento-p bento-p--light">95% наших выпускников поступают в школы и лицеи Щёлкова без стресса. Первые результаты через 3 недели.</p>
<div class="results-grid">
<div class="result-item">
<span class="result-item__value">95%</span>
<span class="result-item__desc">поступают в школы и лицеи Щёлкова без стресса</span>
</div>
<div class="result-item">
<span class="result-item__value">3 нед.</span>
<span class="result-item__desc"> первый осмысленный слог у нечитавших детей</span>
</div>
<div class="result-item">
<span class="result-item__value">87%</span>
<span class="result-item__desc">родителей отмечают рост самостоятельности</span>
</div>
<div class="result-item">
<span class="result-item__value">2,5×</span>
<span class="result-item__desc">быстрее адаптируются в первом классе</span>
</div>
</div>
</div>
</section>

View File

@ -0,0 +1,102 @@
<?php
/**
* Отзывы родителей (с лоад-мором)
* .bento .pksh-section .pksh-reviews #pksh-reviews
*
* @package Dekart
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
$data = Pksh_Data::instance();
$review_items = $data->get_reviews();
$total_count = count( $review_items );
?>
<section class="bento pksh-section pksh-reviews" id="pksh-reviews" aria-label="Отзывы">
<div class="bento__full section-header--centered">
<span class="bento-label">Отзывы</span>
<h2 class="bento-h2">Что говорят родители</h2>
<p class="bento-p">Родители доверяют нам самое главное делятся впечатлениями о подготовке к школе</p>
<div class="pksh-swipe-hint" aria-hidden="true">
<span class="pksh-swipe-hint__arrow">👇</span>
<span class="pksh-swipe-hint__text">Листайте, чтобы читать ещё отзывы</span>
</div>
</div>
<div class="bento__full">
<?php if ( $total_count > 0 ) :
$items = array_values( $review_items );
$card_idx = 0;
?>
<div class="reviews-cards">
<div class="lw-scroll-x">
<div class="lw-grid lw-grid--3">
<?php foreach ( $items as $item ) :
$card_idx++;
$author = $item['review_author'] ?? '';
$text = $item['review_text'] ?? '';
$raw_rating = $item['review_rating'] ?? '';
$avatar_id = ! empty( $item['review_avatar'] ) ? (int) $item['review_avatar'] : 0;
$teacher = $item['review_teacher'] ?? array();
$date = $item['review_date'] ?? '';
$stars = max( 1, min( 5, (int) $raw_rating ) );
$name = $author ?: 'Анонимно';
$is_long = strlen( wp_strip_all_tags( $text ) ) > 350;
$batch = (int) ceil( $card_idx / 12 );
if ( empty( $text ) ) { continue; }
?>
<article class="lw-card reveal" data-batch="<?php echo (int) $batch; ?>">
<div class="lw-flex lw-flex--row lw-gap-12 lw-items-start">
<div class="lw-avatar lw-avatar--48">
<?php if ( $avatar_id && wp_attachment_is_image( $avatar_id ) ) : ?>
<?php echo wp_get_attachment_image( $avatar_id, array( 48, 48 ), false, array( 'class' => 'lw-avatar__img', 'loading' => 'lazy', 'alt' => esc_attr( $name ) ) ); ?>
<?php else : ?>
<div class="lw-avatar lw-avatar--48 lw-avatar--letter">
<span class="lw-avatar__letter"><?php echo esc_html( $name ? mb_strtoupper( mb_substr( $name, 0, 1 ) ) : '?' ); ?></span>
</div>
<?php endif; ?>
</div>
<div class="lw-flex lw-flex--col" style="flex:1; min-width:0;">
<div class="lw-text-dark lw-font-semibold"><?php echo esc_html( $name ); ?></div>
<?php if ( ! empty( $teacher[0]['id'] ) ) : ?>
<div class="lw-text-xs lw-text-gray">
Преподаватель: <a href="<?php echo esc_url( get_permalink( $teacher[0]['id'] ) ); ?>" class="review-card__teacher-link"><?php echo esc_html( get_the_title( $teacher[0]['id'] ) ); ?></a>
</div>
<?php endif; ?>
<div class="lw-badge lw-badge--verified"> Проверенный отзыв</div>
</div>
</div>
<div class="lw-stars lw-mt-8">
<?php for ( $i = 1; $i <= 5; $i++ ) : ?>
<svg class="lw-star <?php echo $i <= $stars ? 'lw-star--filled' : ''; ?>" width="16" height="16" viewBox="0 0 21 19" fill="none">
<path d="M9.58463 1.50884C9.89101 0.602477 11.1729 0.602476 11.4793 1.50884L13.1158 6.35007C13.2531 6.75637 13.6343 7.02985 14.0631 7.02985H19.2721C20.2504 7.02985 20.6467 8.28958 19.8447 8.84971L15.6995 11.7446C15.335 11.9991 15.1822 12.4636 15.3247 12.8847L16.9239 17.6158C17.233 18.5302 16.1954 19.3085 15.404 18.7559L11.1045 15.7533C10.7606 15.5131 10.3033 15.5131 9.95941 15.7533L5.65991 18.7559C4.86857 19.3085 3.83092 18.5302 4.14001 17.6158L5.73926 12.8847C5.8816 12.4636 5.72891 11.9991 5.36448 11.7446L1.21924 8.84971C0.417196 8.28958 0.813532 7.02985 1.79181 7.02985H7.00081C7.42969 7.02985 7.81081 6.75637 7.94815 6.35007L9.58463 1.50884Z" fill="currentColor"/>
</svg>
<?php endfor; ?>
</div>
<div class="lw-card__text lw-mt-8<?php echo $is_long ? ' review-card__text--clamped' : ''; ?>">
<?php echo wp_kses_post( $text ); ?>
</div>
<div class="review-card__footer">
<?php if ( $is_long ) : ?>
<button class="review-card__btn-more" aria-label="Читать ещё">Читать ещё</button>
<?php endif; ?>
<?php if ( ! empty( $date ) ) : ?>
<span class="review-card__date"><?php echo esc_html( $date ); ?></span>
<?php endif; ?>
</div>
</article>
<?php endforeach; ?>
</div>
</div>
</div>
<?php if ( $total_count > 12 ) : ?>
<div class="reviews-loadmore" id="reviews-loadmore">
<button type="button" class="reviews-loadmore__btn">Показать ещё</button>
</div>
<?php endif; ?>
<?php endif; ?>
</div>
</section>

View File

@ -0,0 +1,74 @@
<?php
/**
* Social proof счётчики (ученики, лет, отзывов, педагогов)
* .bento .pksh-section
*
* @package Dekart
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
$data = Pksh_Data::instance();
$social_counters = $data->get_social_counters();
$social_icons = Pksh_Data::social_icons();
?>
<section class="bento pksh-section" aria-label="Социальное доказательство">
<div class="bento__full">
<div class="social-counters">
<?php if ( ! empty( $social_counters ) ) : ?>
<?php foreach ( $social_counters as $i => $counter ) :
$icon = isset( $social_icons[ $i ] ) ? $social_icons[ $i ] : '✅';
$number = $counter['counter_number'] ?? '';
$label = $counter['counter_label'] ?? '';
if ( empty( $number ) ) { continue; }
?>
<div class="social-counter">
<div class="social-counter__top"></div>
<div class="social-counter__body">
<span class="social-counter__icon"><?php echo esc_html( $icon ); ?></span>
<div class="social-counter__number"><?php echo esc_html( $number ); ?></div>
<div class="social-counter__label"><?php echo esc_html( $label ); ?></div>
</div>
</div>
<?php endforeach; ?>
<?php else : ?>
<!-- Fallback: пока CF не заполнены -->
<div class="social-counter">
<div class="social-counter__top"></div>
<div class="social-counter__body">
<span class="social-counter__icon">🎓</span>
<div class="social-counter__number">500+</div>
<div class="social-counter__label">выпускников в топ-школах</div>
</div>
</div>
<div class="social-counter">
<div class="social-counter__top"></div>
<div class="social-counter__body">
<span class="social-counter__icon">📅</span>
<div class="social-counter__number">12</div>
<div class="social-counter__label">лет готовим к школе</div>
</div>
</div>
<div class="social-counter">
<div class="social-counter__top"></div>
<div class="social-counter__body">
<span class="social-counter__icon"></span>
<div class="social-counter__number">4.8</div>
<div class="social-counter__label">средняя оценка родителей</div>
</div>
</div>
<div class="social-counter">
<div class="social-counter__top"></div>
<div class="social-counter__body">
<span class="social-counter__icon">👩‍🏫</span>
<div class="social-counter__number">15+</div>
<div class="social-counter__label">педагогов высшей категории</div>
</div>
</div>
<?php endif; ?>
</div>
</div>
</section>

View File

@ -0,0 +1,44 @@
<?php
/**
* Sticky CTA мобильный и десктопный
* Показывается после прокрутки hero-секции
*
* @package Dekart
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
?>
<div class="sticky-cta-mobile" aria-label="Запись">
<div class="sticky-cta-mobile__inner">
<span class="sticky-cta-mobile__text">Полное тестирование и первое занятие <strong>бесплатно!</strong> Потом принимаете решение</span>
<button class="sticky-cta-mobile__btn btn-write">Записаться</button>
</div>
</div>
<div class="sticky-cta-desktop" aria-label="Запись">
<div class="sticky-cta-desktop__inner">
<div class="sticky-cta-desktop__info">
<span class="sticky-cta-desktop__badge">🔥 Акция</span>
<span class="sticky-cta-desktop__text">Полное тестирование и первое занятие <strong>бесплатно!</strong> Потом принимаете решение</span>
</div>
<button class="sticky-cta-desktop__btn btn-write">Записаться</button>
</div>
</div>
<script>
(function() {
var sticky = document.querySelector('.sticky-cta-desktop');
var hero = document.querySelector('.ds-hero');
if (!sticky || !hero) return;
var observer = new IntersectionObserver(function(entries) {
entries.forEach(function(entry) {
sticky.classList.toggle('visible', !entry.isIntersecting);
});
}, { threshold: 0 });
observer.observe(hero);
})();
</script>

View File

@ -0,0 +1,105 @@
<?php
/**
* Преподаватели (горизонтальный скролл)
* .bento .pksh-section .pksh-section--teachers #teachers
*
* @package Dekart
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
$data = Pksh_Data::instance();
$teachers = $data->get_teachers();
?>
<section class="bento pksh-section pksh-section--teachers" id="teachers" aria-label="Преподаватели">
<div class="bento__full section-header--centered">
<span class="bento-label">Преподаватели</span>
<h2 class="bento-h2">Наши преподаватели практикующие педагоги</h2>
<p class="bento-p">Каждый педагог имеет опыт работы с дошкольниками от 5 лет. Все действующие учителя начальных классов с высшим образованием.</p>
<div class="pksh-swipe-hint" aria-hidden="true">
<span class="pksh-swipe-hint__arrow">👇</span>
<span class="pksh-swipe-hint__text">Листайте, чтобы познакомиться с преподавателями</span>
</div>
</div>
<div class="bento__full">
<div class="pksh-teachers__scroll-x">
<div class="pksh-teachers__wrapper">
<?php if ( is_array( $teachers ) && ! empty( $teachers ) ) : ?>
<?php foreach ( $teachers as $item ) :
$t_id = $item['teacher_id'] ?? 0;
$t_subj = $item['teacher_subject'] ?? '';
$t_about = $item['teacher_about'] ?? '';
$t_post = $t_id ? get_post( $t_id ) : null;
$t_name = $t_post ? $t_post->post_title : '—';
$t_photo = 0;
if ( $t_post ) {
$t_photo = get_post_meta( $t_id, '_teacher_avatar', true );
if ( ! $t_photo ) {
$t_photo = get_post_meta( $t_id, '_thumbnail_id', true );
}
}
if ( empty( $t_subj ) && $t_post ) {
$t_subj = get_post_meta( $t_id, '_teacher_direction', true );
}
if ( empty( $t_about ) && $t_post ) {
$t_about = get_post_meta( $t_id, '_teacher_about', true );
}
?>
<div class="pksh-teachers__item">
<div class="pksh-teachers__card">
<div class="pksh-teachers__card-top">
<?php if ( $t_photo ) : ?>
<?php $photo_url = wp_get_attachment_image_url( $t_photo, array( 280, 280 ) ); ?>
<img class="pksh-teachers__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="pksh-teachers__photo" loading="lazy" width="140" height="140"
src="<?php echo get_template_directory_uri(); ?>/assets/images/no-photo.png"
alt="<?php echo esc_attr( $t_name ); ?>">
<?php endif; ?>
</div>
<div class="pksh-teachers__card-body">
<h3 class="pksh-teachers__name"><?php echo esc_html( $t_name ); ?></h3>
<?php if ( $t_subj ) : ?>
<p class="pksh-teachers__subj"><?php echo esc_html( $t_subj ); ?></p>
<?php endif; ?>
<?php if ( $t_post ) :
$t_desc = get_post_meta( $t_id, '_teacher_description', true );
if ( ! empty( $t_desc ) ) : ?>
<p class="pksh-teachers__desc"><?php echo esc_html( wp_strip_all_tags( $t_desc ) ); ?></p>
<?php endif; ?>
<?php endif; ?>
<div class="pksh-teachers__meta">
<span class="pksh-teachers__meta-badge">👶 Работает с дошкольниками</span>
<?php if ( $t_post ) :
$exp_years = '';
$start_year = get_post_meta( $t_id, '_teacher_start_year', true );
if ( $start_year && is_numeric( $start_year ) ) {
$exp = (int) date( 'Y' ) - (int) $start_year;
if ( $exp > 0 ) {
$exp_years = $exp . ' лет';
}
}
if ( $exp_years ) : ?>
<span class="pksh-teachers__meta-exp">📅 Стаж: <?php echo esc_html( $exp_years ); ?></span>
<?php endif; ?>
<?php endif; ?>
</div>
<button class="pksh-teachers__btn open-bitrix-form">Записаться к этому педагогу</button>
</div>
</div>
</div>
<?php endforeach; ?>
<?php endif; ?>
</div>
</div>
</div>
</section>

View File

@ -0,0 +1,36 @@
<?php
/**
* Почему нам доверяют
* .bento .pksh-section
*
* @package Dekart
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
?>
<section class="bento pksh-section" aria-label="Почему нам доверяют">
<div class="bento__full">
<div class="trust-authority">
<h2 class="bento-h2">Почему родители доверяют нам</h2>
<div class="trust-authority__grid">
<div class="trust-authority__item">
<span class="trust-authority__icon">📜</span>
<strong class="trust-authority__title">Государственная лицензия</strong>
<p class="trust-authority__text">Имеем право на образовательную деятельность. Вы можете вернуть 13% через налоговый вычет.</p>
</div>
<div class="trust-authority__item">
<span class="trust-authority__icon">🏆</span>
<strong class="trust-authority__title">12 лет на рынке</strong>
<p class="trust-authority__text">С 2014 года готовим детей к школе. Более 500 выпускников успешно учатся в лицеях и гимназиях Щёлкова.</p>
</div>
<div class="trust-authority__item">
<span class="trust-authority__icon">🛡️</span>
<strong class="trust-authority__title">Гарантия результата</strong>
<p class="trust-authority__text">Если через 3 месяца ребёнок не начнёт читать вернём деньги и продолжим обучение бесплатно.</p>
</div>
</div>
</div>
</div>
</section>