Global-2026-07-12

This commit is contained in:
Dekart Deploy Bot 2026-07-12 08:35:38 +00:00
parent 6ed9de7c2c
commit 2826a8591d
7 changed files with 975 additions and 520 deletions

View File

@ -11110,8 +11110,9 @@ main > .pksh-section:first-child {
background: var(--accent-light, #F5F3FF);
}
.faq-section .container {
/* центрирование через стандартный .container */
.faq-section .container,
.faq-section .bento {
width: 100%;
}
.faq-section__title {
@ -11121,11 +11122,13 @@ main > .pksh-section:first-child {
font-weight: 700;
line-height: 1.25;
color: var(--navy, #0F172A);
grid-column: 1 / -1;
}
.faq-section__wrapper {
display: flex;
gap: 30px;
grid-column: 1 / -1;
}
.faq-section__col {

File diff suppressed because it is too large Load Diff

View File

@ -1465,7 +1465,6 @@ function needs_swiper(): bool {
'page-school.php',
'page-contacts.php',
'page-teachers.php',
'page-podgotovka-k-shkole.php',
'page-camp.php',
];
foreach ( $swiper_templates as $tmpl ) {
@ -1605,15 +1604,40 @@ function dekart_security_headers(): void {
header( 'X-Frame-Options: SAMEORIGIN' );
header( 'Referrer-Policy: strict-origin-when-cross-origin' );
// Content-Security-Policy — базовый, без блокировки легаси-скриптов
header( "Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://cdn-ru.bitrix24.ru https://alee.bitrix24.ru https://api-maps.yandex.ru https://cdn.jsdelivr.net https://www.google.com https://www.gstatic.com https://www.googletagmanager.com https://mc.yandex.ru; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://cdn.jsdelivr.net https://alee.bitrix24.ru; img-src 'self' data: https: blob:; font-src 'self' data: https://fonts.gstatic.com; frame-src 'self' https://cdn-ru.bitrix24.ru https://alee.bitrix24.ru https://www.google.com; connect-src 'self' https://api-maps.yandex.ru https://cdn-ru.bitrix24.ru https://alee.bitrix24.ru https://mc.yandex.ru; object-src 'none'; base-uri 'self'; form-action 'self' https://alee.bitrix24.ru;" );
header( "Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://cdn-ru.bitrix24.ru https://alee.bitrix24.ru https://api-maps.yandex.ru https://yastatic.net https://cdn.jsdelivr.net https://www.google.com https://www.gstatic.com https://www.googletagmanager.com https://mc.yandex.ru; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://cdn.jsdelivr.net https://alee.bitrix24.ru; img-src 'self' data: https: blob:; font-src 'self' data: https://fonts.gstatic.com; frame-src 'self' https://cdn-ru.bitrix24.ru https://alee.bitrix24.ru https://www.google.com; connect-src 'self' https://api-maps.yandex.ru https://yastatic.net https://cdn-ru.bitrix24.ru https://alee.bitrix24.ru https://mc.yandex.ru wss://mc.yandex.ru; object-src 'none'; base-uri 'self'; form-action 'self' https://alee.bitrix24.ru;" );
}
}
function dekart_add_preload_hints() {
// резерв для preload hints
}
add_action('wp_head', 'dekart_add_preload_hints', 1);// Тестовая строка для проверки деплоя 2026-05-06
// Updated via WordPress admin 2026-05-07
add_action('wp_head', 'dekart_add_preload_hints', 1);
/* ── Honest timer: end-of-month deadline ── */
/**
* Return end-of-current-month as ISO 8601 string.
* Stored in wp_option 'dekart_honest_deadline' so same value
* is used by PHP (template) and exposed to JS.
*/
function dekart_get_honest_deadline(): string {
$cached = get_option( 'dekart_honest_deadline', '' );
if ( $cached && (int) $cached > time() ) {
return $cached;
}
return dekart_recalc_honest_deadline();
}
function dekart_recalc_honest_deadline(): string {
$end = new DateTime( 'last day of this month 23:59:59' );
$ts = (int) $end->format( 'U' ); // Unix timestamp — безопасен для JSON/JS
update_option( 'dekart_honest_deadline', $ts, false );
return (string) $ts;
}
add_action( 'dekart_daily_refresh_deadline', 'dekart_recalc_honest_deadline' );
if ( ! wp_next_scheduled( 'dekart_daily_refresh_deadline' ) ) {
wp_schedule_event( time(), 'daily', 'dekart_daily_refresh_deadline' );
}
// === ACF JSON Auto-save ===
// Автоматически сохраняет группы полей в JSON при редактировании

View File

@ -24,7 +24,20 @@
<?php
// ─────────────────────────────────────────────────────────────────────
// PRELOAD LCP
// PRELOAD LCP: podgotovka-k-shkole
// ─────────────────────────────────────────────────────────────────────
if ( is_page_template( 'page-podgotovka-k-shkole.php' ) ) {
$pksh_img_id = carbon_get_post_meta( get_the_ID(), 'banner_image' );
if ( $pksh_img_id ) {
$pksh_img_url = wp_get_attachment_url( $pksh_img_id );
if ( $pksh_img_url ) {
echo '<link rel="preload" as="image" href="' . esc_url( $pksh_img_url ) . '" fetchpriority="high">' . "\n";
}
}
}
// ─────────────────────────────────────────────────────────────────────
// PRELOAD LCP: front page
// ─────────────────────────────────────────────────────────────────────
if ( is_front_page() ) {
$post_id = get_the_ID();
@ -91,8 +104,7 @@ if ( is_front_page() ) {
<img width="136" height="40"
src="<?php echo esc_url( get_template_directory_uri() ); ?>/assets/images/logo-svg.svg"
alt="<?php esc_attr_e('Декарт — частная школа в Щелково', 'dekart'); ?>"
loading="eager"
fetchpriority="high">
loading="eager">
</a>
<div class="mobile icon-links">

View File

@ -818,7 +818,7 @@ $metrics = [
script.onerror = function() { console.warn("Yandex Maps API failed to load"); };
script.onload = function() {
ymaps.ready(function() {
var coords = <?php echo $contact_location ? '[' . esc_js($contact_location) . ']' : '[55.76, 37.64]'; ?>;
var coords = <?php echo $opt_coords ? '[' . esc_js($opt_coords) . ']' : '[55.76, 37.64]'; ?>;
var map = new ymaps.Map("ya-map", {
center: coords,
zoom: 16
@ -828,7 +828,7 @@ $metrics = [
var placemark = new ymaps.Placemark(
coords,
{ iconContent: "<?php echo esc_js($contact_location_text); ?>" },
{ iconContent: "<?php echo esc_js($opt_name); ?>" },
{ preset: "islands#redStretchyIcon" }
);
map.geoObjects.add(placemark);

View File

@ -1,17 +1,9 @@
<?php
/**
* Template Name: Подготовка к школе (Bento 2026)
*
* Асимметричная Bento-сетка. Нейрокопирайтинг.
* CSS: main.css (секции Bento/Social/Guarantee) + podgotovka-k-shkole.css (переопределения 2026)
*
* @package Dekart
*/
/* Template Name: Подготовка к школе (Bento 2026) */
get_header();
$post_id = get_the_ID();
// ─── ДАННЫЕ ОРГАНИЗАЦИИ ───
$opt_address = get_option( 'branch_address' ) ?: carbon_get_theme_option( 'site_address' ) ?: carbon_get_post_meta( $post_id, 'contact_address' ) ?: '';
$opt_coords = get_option( 'branch_coords' ) ?: carbon_get_post_meta( $post_id, 'contact_location' ) ?: '';
$opt_phone = get_option( 'branch_phone' ) ?: carbon_get_theme_option( 'site_phone' ) ?: carbon_get_post_meta( $post_id, 'contact_tel' ) ?: '';
@ -22,9 +14,6 @@ $opt_social_raw = get_option( 'branch_social' ) ?: carbon_get_post_meta( $post_
<main class="page page-pksh">
<!-- ════════════════════════════════════════════ -->
<!-- Breadcrumbs (outside hero) -->
<!-- ════════════════════════════════════════════ -->
<?php
$branch_city_prep = get_option( 'branch_city_prep', 'в Щёлково' );
$branch_city_clean = str_replace( array( 'в ', 'В ' ), '', $branch_city_prep );
@ -36,9 +25,6 @@ $opt_social_raw = get_option( 'branch_social' ) ?: carbon_get_post_meta( $post_
$hero_phone_clean = preg_replace( '/[^0-9+]/', '', $opt_phone );
?>
<!-- ════════════════════════════════════════════ -->
<!-- Breadcrumbs -->
<!-- ════════════════════════════════════════════ -->
<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">
@ -54,17 +40,12 @@ $opt_social_raw = get_option( 'branch_social' ) ?: carbon_get_post_meta( $post_
</ul>
</div>
<!-- ════════════════════════════════════════════ -->
<!-- Hero (ds-hero: dark bg, white grid) -->
<!-- ════════════════════════════════════════════ -->
<section class="section-bg ds-hero" data-bg="hero" id="ds-hero" aria-label="Подготовка к школе">
<div class="ds-container">
<div class="ds-hero__inner">
<!-- Left: Content -->
<div class="ds-hero__content">
<!-- Address pill -->
<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"/>
@ -73,15 +54,12 @@ $opt_social_raw = get_option( 'branch_social' ) ?: carbon_get_post_meta( $post_
<span><?php echo esc_html( $opt_address ?: 'ул. Талсинская, 24' ); ?> — центр <?php echo esc_html( $branch_city_clean ?: 'Щёлково' ); ?></span>
</div>
<!-- H1 -->
<h1 class="ds-hero__h1"><?php echo esc_html( $h1_hero ?: 'Подготовка к школе в Щёлково' ); ?></h1>
<!-- Subtitle -->
<?php if ( '' !== $subtitle_hero ) : ?>
<p class="ds-hero__subtitle"><?php echo esc_html( $subtitle_hero ); ?></p>
<?php endif; ?>
<!-- Metrics (из pksh_social_counters) -->
<?php if ( ! empty( $hero_metrics ) && is_array( $hero_metrics ) ) : ?>
<div class="ds-hero__metrics">
<?php foreach ( $hero_metrics as $metric ) :
@ -97,23 +75,19 @@ $opt_social_raw = get_option( 'branch_social' ) ?: carbon_get_post_meta( $post_
</div>
<?php endif; ?>
<!-- Rating badge -->
<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>
<!-- CTA -->
<button class="ds-hero__cta-btn open-bitrix-form">Записаться на бесплатное пробное</button>
<!-- Phone -->
<?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>
<!-- Right: Visual -->
<div class="ds-hero__visual">
<div class="ds-hero__visual-glow" aria-hidden="true"></div>
@ -136,7 +110,6 @@ $opt_social_raw = get_option( 'branch_social' ) ?: carbon_get_post_meta( $post_
<div class="ds-hero__photo-ring" aria-hidden="true"></div>
</div>
<!-- Floating badges -->
<div class="ds-hero__float ds-hero__float--1">
<span class="ds-hero__float-icon">👩‍🏫</span>
<span>Педагоги с опытом 15+ лет</span>
@ -154,13 +127,11 @@ $opt_social_raw = get_option( 'branch_social' ) ?: carbon_get_post_meta( $post_
<span>Рейтинг 4.8</span>
</div>
<!-- Decorative shapes -->
<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>
<!-- Sparkle particles (обёртка для nth-child) -->
<div class="ds-hero__sparkles" aria-hidden="true">
<div class="ds-hero__sparkle"></div>
<div class="ds-hero__sparkle"></div>
@ -174,9 +145,6 @@ $opt_social_raw = get_option( 'branch_social' ) ?: carbon_get_post_meta( $post_
</div>
</section>
<!-- ════════════════════════════════════════════ -->
<!-- Social Proof Confidence counters (4 cards) -->
<!-- ════════════════════════════════════════════ -->
<?php
$social_counters = carbon_get_post_meta( $post_id, 'pksh_social_counters' );
$social_icons = array( '🎓', '📅', '⭐', '👩‍🏫' );
@ -201,7 +169,7 @@ $opt_social_raw = get_option( 'branch_social' ) ?: carbon_get_post_meta( $post_
</div>
<?php endforeach; ?>
<?php else : ?>
<!-- Fallback, если поля не заполнены -->
<div class="social-counter">
<div class="social-counter__top"></div>
<div class="social-counter__body">
@ -239,9 +207,27 @@ $opt_social_raw = get_option( 'branch_social' ) ?: carbon_get_post_meta( $post_
</div>
</section>
<!-- ════════════════════════════════════════════ -->
<!-- Micro-Commitment: Checklist download -->
<!-- ════════════════════════════════════════════ -->
<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>
<section class="bento pksh-section" aria-label="Скачать чек-лист">
<div class="bento__full bento-card bento-card--checklist">
<div class="micro-commit">
@ -277,35 +263,8 @@ $opt_social_raw = get_option( 'branch_social' ) ?: carbon_get_post_meta( $post_
</div>
</section>
<!-- ════════════════════════════════════════════ -->
<!-- Guarantee Hero + Navigation -->
<!-- ════════════════════════════════════════════ -->
<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>
<!-- ════════════════════════════════════════════ -->
<!-- Bento Row 1: How it works + Why us -->
<!-- ════════════════════════════════════════════ -->
<section class="bento pksh-section" id="how-it-works" aria-label="Как проходят занятия">
<div class="bento__full" style="text-align: center;">
<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>
@ -381,25 +340,54 @@ $opt_social_raw = get_option( 'branch_social' ) ?: carbon_get_post_meta( $post_
</div>
</section>
<!-- ════════════════════════════════════════════ -->
<!-- CTA: Бесплатное тестирование + занятие -->
<!-- ════════════════════════════════════════════ -->
<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
$timer_ts = function_exists('dekart_get_honest_deadline') ? (int) dekart_get_honest_deadline() : 0;
if ($timer_ts > 0) :
?>
<div class="honest-timer">
<span class="honest-timer__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 $timer_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 endif; ?>
<button class="btn-primary btn-primary--large open-bitrix-form cta-test__btn">Записаться на бесплатное тестирование</button>
</div>
</div>
</section>
<!-- ════════════════════════════════════════════ -->
<!-- Bento Row 2: Results / Data -->
<!-- ════════════════════════════════════════════ -->
<section class="bento pksh-section" id="results" aria-label="Результаты учеников">
<div class="bento__full bento-card bento-card--highlight-results" style="text-align: center;">
<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>
@ -424,11 +412,8 @@ $opt_social_raw = get_option( 'branch_social' ) ?: carbon_get_post_meta( $post_
</div>
</section>
<!-- ════════════════════════════════════════════ -->
<!-- Bento Row 3: Programs / Курсы -->
<!-- ════════════════════════════════════════════ -->
<?php
// Данные из админки (CF)
$base_name = carbon_get_post_meta( $post_id, 'pksh_prog_base_name' ) ?: 'Уверенный старт';
$base_subname = carbon_get_post_meta( $post_id, 'pksh_prog_base_subname' ) ?: '2 раза в неделю — комфортный темп без перегрузки';
$base_schedule = carbon_get_post_meta( $post_id, 'pksh_prog_base_schedule' ) ?: 'вт, чт — 18:0019:30';
@ -443,93 +428,95 @@ $opt_social_raw = get_option( 'branch_social' ) ?: carbon_get_post_meta( $post_
$prem_price_single = carbon_get_post_meta( $post_id, 'pksh_prog_prem_price_single' ) ?: '1 500 ₽';
$prem_urgency = carbon_get_post_meta( $post_id, 'pksh_prog_prem_urgency' ) ?: 'Осталось 3 места в группе';
?>
<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="lw-scroll-x pksh-compare">
<div class="pksh-swipe-hint" aria-hidden="true">
<span class="pksh-swipe-hint__arrow">👇</span>
<span class="pksh-swipe-hint__text">Листайте, чтобы сравнить</span>
</div>
<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>
<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>
</tbody>
</table>
<p class="pksh-compare__footnote">
<strong>Важно:</strong> Данные по репетиторам и кружкам рыночная оценка, требуют уточнения.
Пожалуйста, подтвердите или скорректируйте цифры у руководителя.
</p>
</div>
</section>
<section class="bento pksh-section" id="programs" aria-label="Программы подготовки">
<div class="bento__full" style="text-align: center;">
<div class="bento__full section-header--centered">
<span class="bento-label">Программы</span>
<h2 class="bento-h2">Выберите формат подготовки</h2>
<p class="bento-p">Все программы ведут действующие педагоги начальных классов.
Группы до 8 человек каждому ребёнку уделяем внимание.</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--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__block">
<div class="prog-card__block-title">Расписание</div>
<div class="prog-card__schedule"><?php echo esc_html( $base_schedule ); ?></div>
</div>
<div class="prog-card__block">
<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>👥 до 8 детей</span>
<span>🎂 57 лет</span>
<span>📍 очно, Щёлково</span>
<span>👩‍🏫 педагог: стаж 12 лет</span>
</div>
<!-- Соцдок-во -->
<div class="prog-card__social-proof">
<span> 4.8 рейтинг программы</span>
<span>🎓 500+ детей уже прошли</span>
</div>
<!-- Кнопка -->
<button class="prog-card__btn open-bitrix-form">Попробовать бесплатно</button>
<div class="prog-card__footnote">Тестирование и первое занятие бесплатно. Результат увидите до оплаты.</div>
</div>
</div>
<!-- ═══ Расширенная: Результат за 3 месяца ═══ -->
<div class="prog-card prog-card--premium">
<div class="prog-card__badge">Популярный&nbsp;выбор · 70% родителей выбирают эту программу</div>
<div class="prog-card__header">
<div class="prog-card__header-badge">Первое занятие бесплатно</div>
<div class="prog-card__header-row">
@ -539,10 +526,11 @@ $opt_social_raw = get_option( 'branch_social' ) ?: carbon_get_post_meta( $post_
<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>
@ -550,13 +538,11 @@ $opt_social_raw = get_option( 'branch_social' ) ?: carbon_get_post_meta( $post_
<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">
@ -569,19 +555,18 @@ $opt_social_raw = get_option( 'branch_social' ) ?: carbon_get_post_meta( $post_
<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__block">
<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__block">
<div class="prog-card__struct-wrap">
<div class="prog-card__block-title">Структура занятия</div>
<div class="prog-card__tags">
<span class="prog-card__tag">Нейрогимнастика</span>
@ -592,22 +577,92 @@ $opt_social_raw = get_option( 'branch_social' ) ?: carbon_get_post_meta( $post_
</div>
</div>
<!-- Доверие -->
<div class="prog-card__trust">
<span>👥 до 8 детей</span>
<span>👥 до 10 детей</span>
<span>🎂 57 лет</span>
<span>📍 очно, Щёлково</span>
<span>👩‍🏫 педагог: стаж 12 лет</span>
</div>
<!-- Соцдок-во -->
<div class="prog-card__social-proof">
<span> 4.8 рейтинг программы</span>
<span>🎓 500+ детей уже прошли</span>
<span class="prog-card__rating">4.8 рейтинг программы</span>
<span class="prog-card__graduates">🎓 500+ детей уже прошли</span>
</div>
<!-- Кнопка -->
<button class="prog-card__btn open-bitrix-form">Попробовать бесплатно</button>
<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>
@ -615,19 +670,18 @@ $opt_social_raw = get_option( 'branch_social' ) ?: carbon_get_post_meta( $post_
</div>
</section>
<!-- ════════════════════════════════════════════ -->
<!-- Bento Row 4: Schedule & Price -->
<!-- ════════════════════════════════════════════ -->
<?php get_template_part('template-parts/block-price'); ?>
<!-- ════════════════════════════════════════════ -->
<!-- Bento Row 4: Teachers (camp-style cards) -->
<!-- ════════════════════════════════════════════ -->
<section class="bento pksh-section pksh-section--teachers" id="teachers" aria-label="Преподаватели">
<div class="bento__full" style="text-align: center;">
<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">
@ -640,11 +694,9 @@ $opt_social_raw = get_option( 'branch_social' ) ?: carbon_get_post_meta( $post_
$t_subj = $item['teacher_subject'] ?? '';
$t_about = $item['teacher_about'] ?? '';
// Получаем данные из CPT teacher
$t_post = $t_id ? get_post($t_id) : null;
$t_name = $t_post ? $t_post->post_title : '—';
// Фото: _teacher_avatar или _thumbnail_id
$t_photo = 0;
if ($t_post) {
$t_photo = get_post_meta($t_id, '_teacher_avatar', true);
@ -653,12 +705,10 @@ $opt_social_raw = get_option( 'branch_social' ) ?: carbon_get_post_meta( $post_
}
}
// Subject fallback: сначала из CF, потом из CPT _teacher_direction
if (empty($t_subj) && $t_post) {
$t_subj = get_post_meta($t_id, '_teacher_direction', true);
}
// About fallback
if (empty($t_about) && $t_post) {
$t_about = get_post_meta($t_id, '_teacher_about', true);
}
@ -717,9 +767,6 @@ $opt_social_raw = get_option( 'branch_social' ) ?: carbon_get_post_meta( $post_
</div>
</section>
<!-- ════════════════════════════════════════════ -->
<!-- Bento Row 5: Guarantee (standalone) -->
<!-- ════════════════════════════════════════════ -->
<section class="bento pksh-section pksh-section--alt" id="guarantee" aria-label="Гарантия">
<div class="bento__full">
<div class="guarantee-block guarantee-block--centered">
@ -734,11 +781,8 @@ $opt_social_raw = get_option( 'branch_social' ) ?: carbon_get_post_meta( $post_
</div>
</section>
<!-- ════════════════════════════════════════════ -->
<!-- Bento Row 6: FAQ (на всю ширину, section-bg) -->
<!-- ════════════════════════════════════════════ -->
<section class="section-bg faq-section" id="faq" aria-label="Вопросы и ответы">
<div class="container">
<div class="bento">
<h2 class="faq-section__title">Часто задаваемые вопросы</h2>
<?php
$faq_items = carbon_get_post_meta($post_id, 'pksh_faq_items');
@ -778,11 +822,20 @@ $opt_social_raw = get_option( 'branch_social' ) ?: carbon_get_post_meta( $post_
<?php endif; endif; ?>
</div>
</section>
<!-- ════════════════════════════════════════════ -->
<!-- Reviews (lw-card inline, camp-style) -->
<!-- ════════════════════════════════════════════ -->
<section class="pksh-reviews reviews-cards" id="pksh-reviews" aria-label="Отзывы">
<h2 class="bento-h2">Что говорят родители</h2>
<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
$review_items = carbon_get_post_meta($post_id, 'pksh_reviews_list');
@ -858,9 +911,9 @@ $opt_social_raw = get_option( 'branch_social' ) ?: carbon_get_post_meta( $post_
</div>
<?php endif; ?>
<?php endif; ?>
</div>
</section>
<!-- ════════════════════════════════════════════ -->
<section class="bento pksh-section" aria-label="Почему нам доверяют">
<div class="bento__full">
<div class="trust-authority">
@ -886,9 +939,6 @@ $opt_social_raw = get_option( 'branch_social' ) ?: carbon_get_post_meta( $post_
</div>
</section>
<!-- ════════════════════════════════════════════ -->
<!-- External Reviews Social Proof -->
<!-- ════════════════════════════════════════════ -->
<section class="bento pksh-section" aria-label="Отзывы на внешних площадках">
<div class="bento__full">
<div class="external-reviews">
@ -919,16 +969,12 @@ $opt_social_raw = get_option( 'branch_social' ) ?: carbon_get_post_meta( $post_
</div>
</section>
<!-- ════════════════════════════════════════════ -->
<!-- Final CTA Low Friction + Countdown Timer -->
<!-- ════════════════════════════════════════════ -->
<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>
<!-- Countdown timer -->
<div class="final-cta__timer" id="cta-timer">
<span class="final-cta__timer-label">Скидка 10% действует ещё:</span>
<div class="final-cta__timer-digits">
@ -977,12 +1023,13 @@ $opt_social_raw = get_option( 'branch_social' ) ?: carbon_get_post_meta( $post_
})();
</script>
<!-- ════════════════════════════════════════════ -->
<!-- Contacts как на странице лагеря -->
<!-- ════════════════════════════════════════════ -->
<section class="bento pksh-section" id="pksh-contact" aria-label="Контакты">
<div class="bento__full pksh-contact">
<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)) : ?>
@ -1052,6 +1099,7 @@ $opt_social_raw = get_option( 'branch_social' ) ?: carbon_get_post_meta( $post_
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);
}
@ -1071,16 +1119,39 @@ $opt_social_raw = get_option( 'branch_social' ) ?: carbon_get_post_meta( $post_
})();
</script>
<!-- ════════════════════════════════════════════ -->
<!-- Sticky CTA Mobile -->
<!-- ════════════════════════════════════════════ -->
<div class="sticky-cta-mobile" aria-label="Запись">
<div class="sticky-cta-mobile__inner">
<span class="sticky-cta-mobile__text">Первое занятие <strong>бесплатно</strong></span>
<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>
</main>
<?php

View File

@ -45,6 +45,7 @@
// а не при загрузке страницы. Экономит ~200kb в критическом пути.
var script = document.createElement('script');
script.src = 'https://api-maps.yandex.ru/2.1/?lang=ru_RU';
script.onerror = function() { console.warn("Yandex Maps API failed to load"); apiLoading = false; };
script.onload = initMap;
document.head.appendChild(script);
}