From 9cfa17493df9c648b852f88ed4cac84f3f0350a0 Mon Sep 17 00:00:00 2001 From: Dekart Deploy Bot Date: Tue, 12 May 2026 20:37:03 +0300 Subject: [PATCH] Final. Deploy ready --- .../dekart/acf-json/group_camp_city.json | 45 ---- wp-content/themes/dekart/assets/css/camp.css | 59 ++++- wp-content/themes/dekart/functions.php | 198 ++++++++++++-- wp-content/themes/dekart/page-camp.php | 246 +++++++++++------- 4 files changed, 377 insertions(+), 171 deletions(-) delete mode 100644 wp-content/themes/dekart/acf-json/group_camp_city.json diff --git a/wp-content/themes/dekart/acf-json/group_camp_city.json b/wp-content/themes/dekart/acf-json/group_camp_city.json deleted file mode 100644 index b3d527f..0000000 --- a/wp-content/themes/dekart/acf-json/group_camp_city.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "key": "group_camp_city", - "title": "Город (page-camp)", - "fields": [ - { - "key": "field_camp_city", - "label": "Город (в предложном падеже)", - "name": "camp_city", - "aria-label": "", - "type": "text", - "instructions": "Например: \"в Щёлково\", \"в Королёве\". Это значение подставится во все SEO-заголовки и микроразметку.", - "required": 0, - "conditional_logic": 0, - "wrapper": { - "width": "", - "class": "", - "id": "" - }, - "default_value": "в Щёлково", - "maxlength": "", - "allow_in_bindings": 0, - "placeholder": "", - "prepend": "", - "append": "" - } - ], - "location": [ - [ - { - "param": "page_template", - "operator": "==", - "value": "page-camp.php" - } - ] - ], - "menu_order": 0, - "position": "normal", - "style": "default", - "label_placement": "top", - "instruction_placement": "label", - "hide_on_screen": "", - "active": true, - "description": "", - "show_in_rest": 0 -} diff --git a/wp-content/themes/dekart/assets/css/camp.css b/wp-content/themes/dekart/assets/css/camp.css index 25a279f..04ad2f7 100644 --- a/wp-content/themes/dekart/assets/css/camp.css +++ b/wp-content/themes/dekart/assets/css/camp.css @@ -995,7 +995,7 @@ html { inset: 0; display: none; align-items: center; - justify-content: space-between; + justify-content: center; background: rgba(0,0,0,0.8); z-index: 100; padding: 16px; @@ -1032,7 +1032,7 @@ html { background: rgba(0,0,0,0.35); display: flex; align-items: center; - justify-content: space-between; + justify-content: center; cursor: pointer; transition: background .2s; } @@ -1608,7 +1608,7 @@ html { height: 100%; z-index: 99999; align-items: center; - justify-content: space-between; + justify-content: center; } .lw-modal--open { @@ -1651,7 +1651,7 @@ html { height: 40px; display: flex; align-items: center; - justify-content: space-between; + justify-content: center; cursor: pointer; z-index: 2; transition: background 0.2s; @@ -2005,26 +2005,61 @@ html { word-break: break-word; } +/* ─── Десктоп: как карточки наставников ─── */ +.camp-reviews .lw-scroll-x { + overflow: visible; + padding: 0; +} +.camp-reviews .lw-grid--3 { + display: flex; + flex-wrap: wrap; + gap: 30px; + justify-content: center; +} +.camp-reviews .lw-grid--3 .lw-card { + width: calc(25% - 23px); + min-width: 280px; + padding: 24px; + border-radius: 20px; + box-shadow: 0 2px 16px rgba(0,0,0,0.06); + transition: transform 0.3s ease, box-shadow 0.3s ease; +} +.camp-reviews .lw-grid--3 .lw-card:hover { + transform: translateY(-4px); + box-shadow: 0 8px 32px rgba(0,0,0,0.1); +} + +@media (max-width: 1200px) { + .camp-reviews .lw-grid--3 .lw-card { + width: calc(50% - 15px); + min-width: 280px; + } +} + @media (max-width: 768px) { - .lw-grid--3, - .lw-grid--2 { + .camp-reviews .lw-scroll-x { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + padding-bottom: 8px; + } + .camp-reviews .lw-grid--3 { display: flex; gap: 16px; overflow-x: auto; scroll-snap-type: x mandatory; - -webkit-overflow-scrolling: touch; + flex-wrap: nowrap; + justify-content: flex-start; padding-bottom: 4px; } - .lw-grid--3 .lw-card, - .lw-grid--2 .lw-card { + .camp-reviews .lw-grid--3 .lw-card { flex: 0 0 300px; + width: auto; scroll-snap-align: start; } } @media (max-width: 480px) { - .lw-grid--3 .lw-card, - .lw-grid--2 .lw-card { + .camp-reviews .lw-grid--3 .lw-card { flex: 0 0 260px; } } @@ -2040,7 +2075,7 @@ html { background-color: #000; display: flex; align-items: center; - justify-content: space-between; + justify-content: center; z-index: 99999; } diff --git a/wp-content/themes/dekart/functions.php b/wp-content/themes/dekart/functions.php index 205beda..0b08895 100644 --- a/wp-content/themes/dekart/functions.php +++ b/wp-content/themes/dekart/functions.php @@ -712,34 +712,28 @@ function add_carbon() { ->set_width( 70 ), )), )) + ->add_tab('⭐ Отзывы', array( + Field::make( 'html', 'reviews_tab_desc', '' ) + ->set_html( '

Секция: .camp-reviews. Отзывы выводятся на странице лагеря.

' ), + Field::make( 'complex', 'camp_reviews_list', 'Отзывы о лагере' ) + ->set_layout( 'tabbed-horizontal' ) + ->set_help_text( 'Добавьте отзывы родителей. Показываются на странице лагеря.' ) + ->add_fields( array( + Field::make( 'text', 'review_author', 'Имя автора' ) + ->set_width( 30 ), + Field::make( 'text', 'review_rating', 'Оценка (1–5)' ) + ->set_width( 15 ) + ->set_attribute( 'type', 'number' ), + Field::make( 'textarea', 'review_text', 'Текст отзыва' ) + ->set_width( 55 ), + )), + )) ->add_tab('📍 Контакты и карта', array( Field::make( 'html', 'contacts_tab_desc', '' ) - ->set_html( '

Секция: .camp-contact

' ), - Field::make( 'separator', 'contacts_main_sep', 'Контактная информация' ), - Field::make( 'text', 'contact_tel', 'Телефон' ) - ->set_width( 50 ) - ->set_help_text( 'Формат: +7 (999) 123-45-67' ), - Field::make( 'text', 'contact_mail', 'Электронная почта' ) - ->set_width( 50 ), - Field::make( 'text', 'contact_address', 'Адрес проведения' ) - ->set_help_text( 'Полный адрес: город, улица, дом.' ), - Field::make( 'separator', 'contacts_map_sep', 'Карта и соцсети' ), - Field::make( 'text', 'contact_location', 'Координаты для Яндекс.Карт' ) - ->set_width( 50 ) - ->set_help_text( 'Формат: 55.9217, 37.9914' ), + ->set_html( '

⚠️ Данные филиала (телефон, email, адрес, соцсети) — в Настройки филиала (меню слева). Здесь только подпись метки карты.

' ), Field::make( 'text', 'contact_location_text', 'Подпись метки на карте' ) ->set_width( 50 ) ->set_help_text( 'Что написано в баллуне на карте.' ), - Field::make( 'complex', 'social_media', 'Социальные сети и мессенджеры' ) - ->add_fields( array( - Field::make( 'text', 'social_media_name', 'Название' ) - ->set_width( 100 ), - Field::make( 'image', 'social_media_img', 'Иконка/логотип' ) - ->set_help_text( 'Оптимально: 1200x800px, WebP/JPG' ) - ->set_width( 20 ), - Field::make( 'text', 'social_media_link', 'Ссылка' ) - ->set_width( 80 ), - )), )) ->add_tab('🗂️ Битрикс24', array( Field::make( 'html', 'bitrix_tab_desc', '' ) @@ -1099,3 +1093,161 @@ function dekart_output_counters_footer() { $footer = stripslashes(get_option('dekart_counter_footer', '')); if ($footer) echo "\n" . $footer . "\n"; } + +// ───────────────────────────────────────────────────────────── +// Настройки филиала — WordPress Settings API (под Счетчиками) +// ───────────────────────────────────────────────────────────── +add_action( 'admin_menu', 'dekart_branch_add_menu' ); +function dekart_branch_add_menu() { + add_menu_page( + 'Настройки филиала', + 'Настройки филиала', + 'edit_posts', + 'branch-settings', + 'dekart_branch_settings_page', + 'dashicons-location-alt', + 3.1 + ); +} + +add_action( 'admin_init', 'dekart_branch_register_settings' ); +function dekart_branch_register_settings() { + $text_fields = array( + 'branch_city_prep' => 'text', + 'branch_city' => 'text', + 'branch_region' => 'text', + 'branch_address' => 'text', + 'branch_coords' => 'text', + 'branch_postal_code' => 'text', + 'branch_phone' => 'text', + 'branch_email' => 'email', + 'branch_whatsapp' => 'url', + 'branch_telegram' => 'url', + 'branch_name' => 'text', + 'branch_price_range' => 'text', + ); + foreach ( $text_fields as $slug => $type ) { + register_setting( 'dekart_branch_group', $slug, array( 'sanitize_callback' => $type === 'email' ? 'sanitize_email' : ( $type === 'url' ? 'esc_url_raw' : 'sanitize_text_field' ) ) ); + } + register_setting( 'dekart_branch_group', 'branch_logo', array( 'sanitize_callback' => 'absint' ) ); + register_setting( 'dekart_branch_group', 'branch_social' ); +} + +function dekart_branch_settings_page() { + ?> +
+

Настройки филиала

+
+ + + +
+

🌍 ГЕО

+
+ + +

Например: "в Щёлково", "в Королёве". Для alt-текстов и описаний.

+
+
+ + +

Для JSON-LD addressLocality.

+
+
+ + +
+
+ + +
+
+ + +

Формат: "55.9217, 37.9914"

+
+
+ + +
+
+ +
+

📞 КОНТАКТЫ

+
+ + +
+
+ + +
+
+ + +

https://wa.me/79991234567

+
+
+ + +
+
+ +
+

🏢 ОРГАНИЗАЦИЯ

+
+ + +
+
+ + +

Для микроразметки. Например: "$", "$$", "$$$".

+
+
+ + +

ID изображения из Медиафайлы. Для JSON-LD image.

+
+
+ +
+

🔗 СОЦСЕТИ

+

Добавьте ссылки (название и URL).

+
+ '', 'url' => '' ) ); + } + foreach ( $social as $i => $item ) { + $name = esc_attr( $item['name'] ?? '' ); + $url = esc_attr( $item['url'] ?? '' ); + echo '
'; + } + ?> +
+ + +
+ + +
+
+ .hidden{display:none}'; }, 100); get_header(); ?> .camp-city-missing{outline:3px solid red;padding:4px}'; + }, 1 ); +} + +// ─── Универсальные переменные города ─── +$city = $opt_city_prep; +$city_clean = $opt_city; +$city_with_prep = $opt_city_prep; + +// ─── JSON-LD: ГЕО ─── +$jsonld_city = $city_clean; +$jsonld_region = $opt_region; +$jsonld_addr = $opt_address ?: $jsonld_region . ', ' . $city_clean; +$jsonld_coords = $opt_coords; +$jsonld_coord_arr = $jsonld_coords ? array_map( 'trim', explode( ',', $jsonld_coords ) ) : array(); +$jsonld_postal_code = $opt_postal; + +// ─── JSON-LD: КОНТАКТЫ ─── +$jsonld_phone = $opt_phone; +$jsonld_mail = $opt_email; + +// ─── JSON-LD: ОРГАНИЗАЦИЯ ─── +$jsonld_name = $opt_name; +$jsonld_price_range = $opt_price_range; + +// ─── JSON-LD: ЛОГОТИП (ACF option → WP Customizer fallback) ─── +if ( $opt_logo && is_array( $opt_logo ) ) { + $jsonld_img_url = $opt_logo['url'] ?? ''; +} elseif ( $opt_logo ) { + $jsonld_img_url = wp_get_attachment_url( $opt_logo ); +} else { + $jsonld_img_url = ''; +} +if ( ! $jsonld_img_url ) { + $logo_id = get_theme_mod( 'custom_logo' ); + $jsonld_img_url = $logo_id ? wp_get_attachment_url( $logo_id ) : ''; +} + +// ─── JSON-LD: СОЦСЕТИ ─── $jsonld_social = array(); -$jsonld_social_raw = carbon_get_post_meta( $post_id, 'social_media' ); -if ( is_array( $jsonld_social_raw ) ) { - foreach ( $jsonld_social_raw as $s ) { - if ( ! empty( $s['social_media_link'] ) ) { - $jsonld_social[] = esc_url( $s['social_media_link'] ); +if ( is_array( $opt_social_raw ) ) { + foreach ( $opt_social_raw as $s ) { + if ( ! empty( $s['url'] ) ) { + $jsonld_social[] = $s['url']; } } } -$jsonld_phone = carbon_get_theme_option( 'site_phone' ) ?: carbon_get_post_meta( $post_id, 'contact_tel' ); -$jsonld_addr = carbon_get_theme_option( 'site_address' ) ?: carbon_get_post_meta( $post_id, 'contact_address' ); -$jsonld_city = $city_clean; -$jsonld_name = carbon_get_theme_option( 'site_name' ) ?: 'Декарт'; -$jsonld_mail = carbon_get_theme_option( 'site_mail' ) ?: carbon_get_post_meta( $post_id, 'contact_mail' ); -$jsonld_coords = carbon_get_post_meta( $post_id, 'contact_location' ); -$jsonld_coord_arr = $jsonld_coords ? array_map( 'trim', explode( ',', $jsonld_coords ) ) : array( '55.9217', '37.9914' ); -$jsonld_img_id = carbon_get_post_meta( $post_id, 'banner_img' ); -$jsonld_img_url = $jsonld_img_id ? wp_get_attachment_url( $jsonld_img_id ) : ''; +// ─── Поля контента страницы (остаются per-page) ─── +$priceMin = (int) carbon_get_post_meta( $post_id, 'price_half_day' ); ?>
@@ -107,8 +154,8 @@ $metrics = [ Детский лагерь Декарт - + alt="Детский лагерь Декарт " loading="eager"> + 'about-us__image', 'loading' => 'lazy', - 'alt' => 'Фото детского лагеря Декарт' + 'alt' => 'Фото детского лагеря Декарт ' . $city_with_prep ] ); else : echo '
@@ -215,7 +262,7 @@ $metrics = [
- Возраст детей — Образовательный центр Декарт <?php echo $city; ?> + Возраст детей — Образовательный центр Декарт <?php echo $city_with_prep; ?>

6,5−11 лет

@@ -225,7 +272,7 @@ $metrics = [
- Группы до 10 детей — Образовательный центр Декарт <?php echo $city; ?> + Группы до 10 детей — Образовательный центр Декарт <?php echo $city_with_prep; ?>

до 10 детей

@@ -235,7 +282,7 @@ $metrics = [
- Время посещения на выбор — Образовательный центр Декарт <?php echo $city; ?> + Время посещения на выбор — Образовательный центр Декарт <?php echo $city_with_prep; ?>

на выбор

@@ -245,7 +292,7 @@ $metrics = [
- Стоимость недели — Образовательный центр Декарт <?php echo $city; ?> + Стоимость недели — Образовательный центр Декарт <?php echo $city_with_prep; ?>

от

@@ -273,7 +320,7 @@ $metrics = [ $programs_content = $item['programs_content']; $programs_price_global = carbon_get_post_meta($post_id, 'price_half_day');?>
- <?php echo $programs_img && get_post_meta($programs_img, '_wp_attachment_image_alt', true) ? esc_attr(get_post_meta($programs_img, '_wp_attachment_image_alt', true)) : esc_attr($programs_title) . ' — Образовательный центр Декарт ' . $city; ?> + <?php echo $programs_img && get_post_meta($programs_img, '_wp_attachment_image_alt', true) ? esc_attr(get_post_meta($programs_img, '_wp_attachment_image_alt', true)) : esc_attr($programs_title) . ' — Образовательный центр Декарт в ' . $city_clean; ?>

@@ -296,6 +343,7 @@ $metrics = [
+ умные прогулки 1 раз в день
- Календарь — Образовательный центр Декарт <?php echo $city; ?> + Календарь — Образовательный центр Декарт <?php echo $city_with_prep; ?> Тематическая неделя на выбор
@@ -364,7 +412,7 @@ $metrics = [
  • тематические экскурсии каждую неделю
  • - Календарь — Образовательный центр Декарт <?php echo $city; ?> + Календарь — Образовательный центр Декарт <?php echo $city_with_prep; ?> Тематическая неделя на выбор
    @@ -389,9 +437,9 @@ $metrics = [
    - <?php echo esc_attr( $mentorName ); ?> — Образовательный центр Декарт <?php echo $city; ?> + <?php echo esc_attr( $mentorName ); ?> — Образовательный центр Декарт <?php echo $city_with_prep; ?> - <?php echo esc_attr( $mentorName ); ?> — Образовательный центр Декарт <?php echo $city; ?> + <?php echo esc_attr( $mentorName ); ?> — Образовательный центр Декарт <?php echo $city_with_prep; ?>
    @@ -447,7 +495,7 @@ $metrics = [ $img_url = wp_get_attachment_url($img_id); $full_url = wp_get_attachment_image_url($img_id, 'full'); $alt = esc_attr(get_post_meta($img_id, '_wp_attachment_image_alt', true)); - if ( ! $alt ) $alt = 'Фото лагеря — Образовательный центр Декарт ' . $city; + if ( ! $alt ) $alt = 'Фото лагеря — Образовательный центр Декарт ' . $city_with_prep; ?>
    -