shkola/wp-content/themes/dekart/functions.php
2026-05-12 17:53:05 +03:00

1103 lines
55 KiB
PHP
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
require_once get_template_directory() . '/inc/template-tags.php';
/* --- Удаляем мета из YOASTSEO START--- */
add_filter( 'wpseo_json_ld_output', '__return_false' );
/* --- Удаляем мета из YOASTSEO END --- */
add_theme_support('title-tag');
/* --- #SEND Review Form --- */
add_action( 'template_redirect', 'author_archive_redirect' );
add_filter( 'author_link', 'remove_author_pages_link' );
// редиректим на главную со страниц авторов
function author_archive_redirect() {
if( is_author() ) {
wp_redirect( home_url(), 301 );
exit;
}
}
// удаляем ссылку
function remove_author_pages_link( $content ) {
return home_url();
}
/*
/* --- Courses --- */
add_action( 'init', 'create_courses_hierarchical_taxonomy', 0 );
function create_courses_hierarchical_taxonomy() {
$labels = array(
'name' => _x( 'Категории курсов', 'taxonomy general name' ),
'singular_name' => _x( 'Категория курсов', 'taxonomy singular name' ),
'search_items' => __( 'Поиск курсов по категории' ),
'all_items' => __( 'Все категории курсов' ),
'parent_item' => __( 'Родительская категория курсов' ),
'parent_item_colon' => __( 'Родителькая категория курсов:' ),
'edit_item' => __( 'Редактировать категорию' ),
'update_item' => __( 'Обновить категорию' ),
'add_new_item' => __( 'Добавить новую категорию' ),
'new_item_name' => __( 'Новая категория' ),
'menu_name' => __( 'Категории курсов' ),
);
register_taxonomy('courses', array('course'), array(
'hierarchical' => true,
'labels' => $labels,
'show_ui' => true,
'show_admin_column' => true,
'query_var' => true,
'rewrite' => array( 'slug' => 'courses' ),
));
}
add_action( 'init', 'create_course' );
function create_course() {
register_post_type( 'course',
array(
'labels' => array(
'name' => 'Курсы',
'singular_name' => 'Курс',
'add_new' => 'Добавить курс',
'add_new_item' => 'Добавить курс',
'edit' => 'Редактировать курс',
'edit_item' => 'Редактировать курс',
'new_item' => 'Новый курс',
'view' => 'Смотреть курс',
'view_item' => 'Смотреть курс',
'search_items' => 'Поиск курсов',
'not_found' => 'Курсы не найдены',
'not_found_in_trash' => 'В корзине нет курсов',
'parent' => 'Родительский курс'
),
'public' => true,
'exclude_from_search'=> false,
'menu_position' => 12,
'supports' => array( 'title' ),
'publicly_queryable' => true,
'menu_icon' => 'dashicons-welcome-learn-more',
'taxonomies' => array( 'courses' ),
'has_archive' => false
)
);
}
/* --- ##Cources## --- */
/* --- trainingCategory --- */
add_action( 'init', 'create_trainingCategory_hierarchical_taxonomy', 0 );
function create_trainingCategory_hierarchical_taxonomy() {
$labels = array(
'name' => _x( 'Категории', 'Категория обучения учителя' ),
'singular_name' => _x( 'Категория', 'Категория' ),
'search_items' => __( 'Поиск категории' ),
'all_items' => __( 'Все категории' ),
'parent_item' => __( 'Родительская категория' ),
'parent_item_colon' => __( 'Родительская категория:' ),
'edit_item' => __( 'Редактировать категорию' ),
'update_item' => __( 'Обновить категорию' ),
'add_new_item' => __( 'Добавить новую категорию' ),
'new_item_name' => __( 'Новая категория' ),
'menu_name' => __( 'Категории' ),
);
register_taxonomy('trainingCategory', array('teacher'), array(
'hierarchical' => true,
'labels' => $labels,
'show_ui' => true,
'show_admin_column' => true,
'query_var' => true,
'rewrite' => false, // Отключаем перезапись URL
));
}
// ✅ Приоритет 5 — регистрация CPT teacher ДО инициализации Carbon Fields
add_action( 'init', 'create_teacher', 5 );
function create_teacher() {
register_post_type( 'teacher',
array(
'labels' => array(
'name' => 'Преподаватели',
'singular_name' => 'Преподаватель',
'add_new' => 'Добавить преподавателя',
'add_new_item' => 'Добавить преподавателя',
'edit' => 'Редактировать преподавателя',
'edit_item' => 'Редактировать преподавателя',
'new_item' => 'Новый преподаватель',
'view' => 'Смотреть преподавателя',
'view_item' => 'Смотреть преподавателя',
'search_items' => 'Поиск преподавателей',
'not_found' => 'Преподаватели не найдены',
'not_found_in_trash' => 'В корзине нет преподавателей',
'parent' => 'Родительский преподаватель'
),
'public' => true,
'exclude_from_search'=> false,
'menu_position' => 12,
'show_in_rest' => true,
'supports' => array( 'title', 'thumbnail' ),
'publicly_queryable' => true,
'menu_icon' => 'dashicons-admin-users',
'taxonomies' => array( 'subject' ),
'has_archive' => false
)
);
}
/* --- ##Teacher## --- */
/* --- Reviews --- */
add_action( 'init', 'create_reviews' );
function create_reviews() {
register_post_type( 'reviews',
array(
'labels' => array(
'name' => 'Отзывы',
'singular_name' => 'Отзыв',
'add_new' => 'Добавить отзыв',
'add_new_item' => 'Добавить отзыв',
'edit' => 'Редактировать отзыв',
'edit_item' => 'Редактировать отзыв',
'new_item' => 'Новый отзыв',
'view' => 'Смотреть отзыв',
'view_item' => 'Смотреть отзыв',
'search_items' => 'Поиск отзывов',
'not_found' => 'Отзывы не найдены',
'not_found_in_trash' => 'В корзине нет отзывов',
'parent' => 'Родительский отзыв'
),
'public' => true,
'exclude_from_search'=> true,
'menu_position' => 13,
'supports' => array( 'title' ),
'publicly_queryable' => false,
'menu_icon' => 'dashicons-format-status',
'has_archive' => false
)
);
}
use Carbon_Fields\Container;
use Carbon_Fields\Field;
add_action( 'carbon_fields_register_fields', 'add_carbon' );
function add_carbon() {
// ====================================================
// Настройки темы
// ====================================================
Container::make( 'theme_options', 'Настройка темы ДЕКАРТ' )
->add_tab('Основные', array(
Field::make( 'text', 'site_name', 'Название учебного центра: (используйте в названии только одинарный кавычки)' ),
Field::make( 'text', 'site_phone', 'Телефон:' ),
Field::make( 'text', 'site_phone_multi', 'Телефон (многоканальный):' ),
Field::make( 'text', 'site_mail', 'Почта для связи:' ),
Field::make( 'text', 'site_index', 'Почтовый индекс:' ),
Field::make( 'text', 'site_region', 'Область:' ),
Field::make( 'text', 'site_city', 'Город:' ),
Field::make( 'text', 'site_address', 'Адрес:' ),
Field::make( 'text', 'site_map_link', 'Ссылка на карту:' ),
Field::make( 'text', 'site_location', 'Координаты адреса (для яндекc карт):' ),
Field::make( 'text', 'site_frame_reviews', 'Ссылка на страницу с отзывами:' ),
Field::make( 'textarea', 'site_bitrix_script', 'script (формы) БИТРИКС24:' ),
Field::make( 'textarea', 'site_bitrix_vacancies', 'script (для формы связаться с нами) БИТРИКС24:' ),
Field::make( 'checkbox', 'check_banner', 'Отображать плашку со скидкой на формах "Запись на бесплатное пробное занятие"' )
->set_option_value( 'yes' ),
Field::make( 'checkbox', 'check_btn_discont', 'Не показывать кнопку "Стоимость ак. часа со скидкой"' )
->set_option_value( 'yes' ),
Field::make( 'text', 'text_banner', 'Текст в плашке:' )
->set_default_value('Всем записавшимся до 10 сентября<br class="desktop"><span>скидка 10%</span> на весь учебный год!'),
))
->add_tab('Контент', array(
Field::make( 'textarea', 'teachers_block', 'Текст в блоке "Наша команда":' ),
))
->add_tab('Цены и скидки', array(
Field::make( 'checkbox', 'early_bird_discount', 'Выводить строку "Скидка за раннюю запись.' )
->set_option_value( 'yes' ),
Field::make( 'text', 'price_hour1', 'Стоимость ак. часа один предмет:' )
->set_attribute( 'type', 'number' ),
Field::make( 'text', 'price_hour2', 'Стоимость ак. часа два предмета:' )
->set_attribute( 'type', 'number' ),
Field::make( 'text', 'price_hour3', 'Стоимость ак. часа три предмета:' )
->set_attribute( 'type', 'number' ),
Field::make( 'text', 'price_hour4', 'Стоимость ак. часа четыре и более предметов:' )
->set_attribute( 'type', 'number' ),
Field::make( 'text', 'price_hour_discount1', 'Стоимость ак. часа один предмет со скидкой:' )
->set_attribute( 'type', 'number' ),
Field::make( 'text', 'price_hour_discount2', 'Стоимость ак. часа два предмета со скидкой:' )
->set_attribute( 'type', 'number' ),
Field::make( 'text', 'price_hour_discount3', 'Стоимость ак. часа три предмета со скидкой:' )
->set_attribute( 'type', 'number' ),
Field::make( 'text', 'price_hour_discount4', 'Стоимость ак. часа четыре и более предметов со скидкой:' )
->set_attribute( 'type', 'number' ),
))
->add_tab('Социальные сети:', array(
Field::make( 'text', 'social_header_wt', 'ссылка на WhatsApp в шапке сайта' ),
Field::make( 'text', 'social_wt', 'ссылка на WhatsApp на странице "Контакты"' ),
Field::make( 'complex', 'social_media', 'Социальная сеть' )
->add_fields( array(
Field::make( 'text', 'social_media_name', 'Название:' )
->set_width( 100 ),
Field::make( 'image', 'social_media_img', 'Логотип:' )
->set_width( 20 ),
Field::make( 'text', 'social_media_link', 'Cсылка:' )
->set_width( 80 ),
)),
))
->add_tab('Галерея', array(
Field::make( 'complex', 'slider_img', 'Галерея изображений учебного центра' )
->set_layout( 'tabbed-horizontal' )
->add_fields( array(
Field::make( 'image', 'img', 'Фотография:' ),
)),
));
// ====================================================
// Доп поля для всех страниц
// ====================================================
Container::make('post_meta', 'Дополнительные поля')
->where('post_type', '=', 'page')
->where('post_id', '!=', 64)
->add_fields(array(
Field::make( 'image', 'banner_img_desktop', 'Изображение для баннера (десктопная версия)' )
->help_text( 'Размер изображения (желательно) 1295px на 454px' )
->set_width( 15 ),
Field::make( 'image', 'banner_img_mobile', 'Изображение для баннера (мобильная версия)' )
->help_text( 'Размер изображения (желательно) 450px на 225px' )
->set_width( 15 ),
Field::make( 'text', 'banner_h1', 'текст для H1' )
->set_width( 100 ),
Field::make( 'text', 'banner_text', 'Дополнительный текст под H1' )
->set_width( 100 ),
Field::make( 'complex', 'page_breadcrumbs', 'Хлебные крошки' )
->set_layout( 'tabbed-horizontal' )
->add_fields( array(
Field::make( 'text', 'breadcrumbs_name', 'Название крошки:' )
->set_width( 50 ),
Field::make( 'text', 'breadcrumbs_link', 'Ссылка крошки:' )
->set_width( 50 )
->set_default_value('#'),
)),
));
// ====================================================
// Доп поля для категории Курсов
// ====================================================
Container::make( 'term_meta', 'Дополнительные поля к Курсам' )
->where( 'term_taxonomy', '=', 'courses' )
->show_on_level(1)
->where( 'term_level', '=', 1 )
->add_fields( array(
Field::make( 'image', 'snippet', 'Изображение для сниппета:' )
->set_width( 100 ),
Field::make( 'image', 'banner_img_desktop', 'Изображение для баннера (десктопная версия)' )
->help_text( 'Размер изображения (желательно) 1920px на 1030px' )
->set_width( 15 ),
Field::make( 'image', 'banner_img_mobile', 'Изображение для баннера (мобильная версия)' )
->help_text( 'Размер изображения (желательно) 390px на 550px' )
->set_width( 15 ),
Field::make( 'textarea', 'banner_content', 'Текстовый контент баннера' )
->set_width( 70 ),
Field::make( 'text', 'title_product', 'Заголовок блока курсов:' )
->set_width( 100 ),
));
// ====================================================
// Уникальное имя контейнера Главной Страницы
// ====================================================
Container::make('post_meta', 'Настройки Главной Страницы')
->where('post_template', '=', 'front-page.php')
->add_fields(array(
Field::make( 'textarea', 'block_text_1', 'Текст для блока Частная школа в Щелково "Декарт"' ),
Field::make( 'image', 'main_banner_img_desktop', 'Изображение рекламного баннера (десктопная версия)' )
->help_text( 'Размер изображения (желательно) 1185px на 190px' )
->set_width( 15 ),
Field::make( 'image', 'main_banner_img_mobile', 'Изображение рекламного баннера (мобильная версия)' )
->help_text( 'Размер изображения (желательно) 390px на 550px' )
->set_width( 15 ),
Field::make( 'text', 'main_banner_link', 'УРЛ баннера:' )
->set_default_value('#'),
));
// ====================================================
// Доп поля для страницы начальной школы
// ====================================================
Container::make('post_meta', 'Настройки Начальной Школы')
->where('post_template', '=', 'page-school.php')
->add_fields(array(
Field::make( 'textarea', 'teachers_block', 'Текст в блоке "Наша команда":' ),
Field::make( 'image', 'main_banner_img_desktop', 'Изображение рекламного баннера (десктопная версия)' )
->help_text( 'Размер изображения (желательно) 1185px на 190px' )
->set_width( 15 ),
Field::make( 'image', 'main_banner_img_mobile', 'Изображение рекламного баннера (мобильная версия)' )
->help_text( 'Размер изображения (желательно) 390px на 550px' )
->set_width( 15 ),
Field::make( 'text', 'main_banner_link', 'УРЛ баннера:' )
->set_default_value('#'),
Field::make( 'textarea', 'block_text_1', 'Текст для блока "Персональный план развития для каждого ученика"' ),
Field::make( 'textarea', 'block_text_2', 'Текст для блока - Почему начальная частная школа "Декарт", а не государственная?' ),
Field::make( 'textarea', 'block_text_3', 'Текст для блока "Семейные классы в Щелково"' ),
Field::make( 'complex', 'questions', 'Блок вопросы и ответы' )
->set_layout( 'tabbed-horizontal' )
->add_fields( array(
Field::make( 'textarea', 'questions_question', 'Текст вопроса' )
->set_width( 30 ),
Field::make( 'textarea', 'questions_answer', 'Текст ответа' )
->set_width( 70 ),
)),
));
// ====================================================
// Доп поля для страницы "ВСЕ КУРСЫ"
// ====================================================
Container::make('post_meta', 'Настройки Страницы Все Курсы')
->where('post_template', '=', 'page-course.php')
->add_fields(array(
Field::make( 'image', 'banner_img_desktop', 'Изображение для баннера (десктопная версия)' )
->help_text( 'Размер изображения (желательно) 1920px на 440px' )
->set_width( 15 ),
Field::make( 'image', 'banner_img_mobile', 'Изображение для баннера (мобильная версия)' )
->help_text( 'Размер изображения (желательно) 450px на 225px' )
->set_width( 15 ),
));
// ====================================================
// Доп поля для страницы "ВАКАНСИИ"
// ====================================================
Container::make('post_meta', 'Настройки Страницы ВАКАНСИИ')
->where('post_template', '=', 'page-vacancies.php')
->add_fields(array(
Field::make( 'complex', 'vacancies', 'Вакансии учебного центра:' )
->add_fields( array(
Field::make( 'text', 'vacancie_name', 'Название вакансии:' ),
Field::make( 'text', 'vacancie_link', 'Ссылка на страницу вакансии:' ),
))
));
// ====================================================
// Доп поля для страницы "КОНТАКТЫ"
// ====================================================
Container::make('post_meta', 'Настройки Страницы Контакты')
->where('post_template', '=', 'page-contacts.php')
->add_fields(array(
Field::make( 'image', 'img_school', 'Изображение школы:' )
));
// ====================================================
// Доп поля для категории (ПРЕДМЕТ)
// ====================================================
Container::make('term_meta', 'Category Properties')
->where('term_taxonomy', '=', 'subject')
->show_on_level(1)
->where('term_level', '=', 1)
->add_fields(array(
Field::make('text', 'subject_h1', 'Заголовок H1:')
->set_width( 100 )
));
// ====================================================
// Доп поля для сущностей reviews (ОТЗЫВ)
// ====================================================
Container::make('post_meta', 'Поля для отзыва')
->where('post_type', '=', 'reviews')
->add_fields(array(
Field::make( 'radio', 'review_type', 'Тип отзыва' )
->set_options( [
'camp' => 'О лагере',
'school' => 'О школе',
'primary' => 'О начальной школе',
] )
->set_default_value( 'school' )
->set_help_text( 'Выберите тип отзыва' ),
Field::make( 'image', 'review_avatar', 'Автар:' )
->set_width( 15 ),
Field::make( 'text', 'review_star', 'Оценка:' )
->set_attribute( 'type', 'number' ),
Field::make( 'textarea', 'review_text', 'Текст отзыва:' )
->set_width( 100 ),
Field::make('association', 'review_teacher', 'Выберите преподавателя:')
->set_width( 32 )
->set_types(array(
array(
'type' => 'post',
'post_type' => 'teacher',
)
))
->set_required(true)
->set_max(1)
->help_text( 'выбирается только один' ),
));
// ====================================================
// Доп поля для записей teacher
// ====================================================
Container::make( 'post_meta', 'Поля для преподавателя' )
->where( 'post_type', '=', 'teacher' )
->add_fields( array(
Field::make( 'text', 'teacher_direction', 'Направление преподавателя (текст в под фото):' ),
Field::make( 'image', 'teacher_avatar', 'Автар:' )
->set_width( 15 ),
Field::make( 'textarea', 'teacher_description', 'Дескрипшн преподавателя' )
->set_width( 75 ),
Field::make( 'textarea', 'teacher_about', 'О себе:' ),
Field::make( 'textarea', 'teacher_education', 'Образование:' ),
Field::make( 'textarea', 'teacher_add_education', 'Дополнительное образование:' ),
Field::make( 'text', 'teacher_rating', 'Оценка преподавателя' )
->set_width( 10 )
->set_default_value('5'),
Field::make( 'complex', 'teacher_subjects', 'Предметы обучения' )
->set_layout( 'tabbed-horizontal' )
->add_fields( array(
Field::make( 'text', 'teacher_subjects_title', 'Укажите заголовок предмета' )
->set_width( 50 )
->set_required(true)
->help_text( 'Например: Репетитор по математике' ),
Field::make( 'textarea', 'select_direction', 'Укажите все направления преподавателя:' )
->help_text( 'Пример: &lt;span&gt;Математика&lt;/span&gt;&lt;span&gt;Русский язык&lt;/span&gt;'),
Field::make('association', 'select_category', 'Укажите категрии')
->set_width( 100 )
->set_types(array(
array(
'type' => 'term',
'taxonomy' => 'trainingCategory',
)
))
->help_text( 'В списке указаны все возможные категрии в обучении, выберите необходимые' ),
)),
Field::make( 'complex', 'certificates', 'Дипломы и сертификаты' )
->set_layout( 'tabbed-horizontal' )
->add_fields( array(
Field::make( 'image', 'certificates_foto', 'Изображение' )
))
->help_text( 'Добавьте изображение дипломов и сертификатов преподавателя' ),
Field::make( 'text', 'teacher_video', 'Ссылка на видеопрезентацию' )
->set_width( 100 )
->help_text( 'Укажите ссылку на видео в youtube. Пример: &lt;iframe src="https://vk.com/video_ext.php?oid=-43228812&id=456240170hd=2" width="853" height="480" allow="autoplay; encrypted-media; fullscreen; picture-in-picture;" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;' ),
Field::make( 'complex', 'questions', 'Блок вопросы и ответы' )
->set_layout( 'tabbed-horizontal' )
->add_fields( array(
Field::make( 'textarea', 'questions_question', 'Текст вопроса' )
->set_width( 30 ),
Field::make( 'textarea', 'questions_answer', 'Текст ответа' )
->set_width( 70 ),
)),
));
// ====================================================
// Уникальное имя контейнера Продлёнки
// ====================================================
Container::make('post_meta', 'Настройки Продлёнки')
->where('post_template', '=', 'page-after-school.php')
->add_tab('Общие', array(
Field::make( 'text', 'as_address', 'Наш адрес:' ),
Field::make( 'text', 'as_price', 'Цена:' ),
))
->add_tab('Педагоги', array(
Field::make( 'complex', 'as_mentors', 'Педагоги' )
->set_layout( 'tabbed-horizontal' )
->add_fields( array(
Field::make( 'image', 'mentor_foto', 'Фотография:' )
->set_width( 15 ),
Field::make( 'text', 'mentor_name', 'ФИО:' )
->set_width( 30 ),
Field::make( 'text', 'mentor_directions', 'Описание:' )
->set_width( 55 ),
))
))
->add_tab('Распорядок дня', array(
Field::make( 'textarea', 'as_routine', 'Блок "Распорядок дня":' ),
))
->add_tab('Отзывы', array(
Field::make( 'complex', 'as_reviews', 'Отзывы клиентов:' )
->set_layout( 'tabbed-horizontal' )
->add_fields( array(
Field::make( 'image', 'review_avatar', 'Автар:' )
->set_width( 15 ),
Field::make( 'text', 'review_name', 'Имя:' )
->set_width( 30 ),
Field::make( 'text', 'review_star', 'Оценка:' )
->set_width( 15 )
->set_attribute( 'type', 'number' ),
Field::make( 'textarea', 'review_text', 'Текст отзыва:' )
->set_width( 100 ),
)),
))
->add_tab('Вопросы-Ответы', array(
Field::make( 'complex', 'as_questions', 'Блок вопросы и ответы' )
->set_layout( 'tabbed-horizontal' )
->add_fields( array(
Field::make( 'textarea', 'questions_question', 'Текст вопроса' )
->set_width( 30 ),
Field::make( 'textarea', 'questions_answer', 'Текст ответа' )
->set_width( 70 ),
)),
))
->add_tab('Фото', array(
Field::make( 'complex', 'as_fotos', 'Фотографии:' )
->set_layout( 'tabbed-horizontal' )
->add_fields( array(
Field::make( 'image', 'foto', 'Фото' )
)),
))
->add_tab('Битрикс', array(
Field::make( 'textarea', 'as_bitrix_script', 'script (формы) БИТРИКС24:' ),
));
// ====================================================
// Доп поля для страницы "ГОРОДСКОЙ ЛАГЕРЬ"
// ====================================================
Container::make('post_meta', '🏰 Настройки Городской Лагерь')
->where('post_template', '=', 'page-camp.php')
->add_tab('🖼️ Первый экран', array(
Field::make( 'html', 'hero_tab_desc', '' )
->set_html( '<p style="color: #64748b; font-size: 13px; margin: 0 0 12px;">Шаблон: <strong>page-camp.php</strong> · Секция: <strong>.hero-media-search</strong></p>' ),
Field::make( 'separator', 'hero_media_sep', 'Изображения' ),
Field::make( 'image', 'banner_img', 'Фото на весь экран (десктоп)' )
->set_help_text( 'Оптимально: 1920×1080 px, WebP/JPG. Дети в движении, эмоции.' )
->set_width( 50 ),
Field::make( 'separator', 'hero_titles_sep', 'Заголовки и текст' ),
Field::make( 'text', 'hero_title_h1', 'Заголовок H1' )
->set_default_value( 'Лето, которое он запомнит навсегда' )
->set_width( 50 )
->set_help_text( 'Основной заголовок страницы. Эмоциональный, зацепляющий.' ),
Field::make( 'text', 'hero_title_span', 'Заголовок (вторая часть, цветная)' )
->set_default_value( 'Big Summer Fun!' )
->set_width( 50 )
->set_help_text( 'Выделяется цветом на фоне основного.' ),
Field::make( 'separator', 'hero_cta_sep', 'Кнопка' ),
Field::make( 'text', 'hero_btn_primary', 'Текст главной кнопки (CTA)' )
->set_default_value( 'Записаться на пробный день' )
->set_width( 100 )
->set_help_text( 'Главное действие, к которому призываем. Лучше: конкретная выгода, а не действие.' ),
Field::make( 'separator', 'hero_metrics_sep', 'Метрики доверия (блок достижений)' ),
Field::make( 'image', 'hero_metric_1_img', 'Иконка метрики 1 (изображение)' )
->set_width( 30 )
->set_help_text( 'Оптимально: 1200x800px, WebP/JPG' ),
Field::make( 'text', 'hero_metric_1_number', 'Число метрики 1' )
->set_default_value( '90+' )
->set_width( 30 ),
Field::make( 'text', 'hero_metric_1_label', 'Подпись метрики 1' )
->set_default_value( 'Количество клубов' )
->set_width( 40 ),
Field::make( 'image', 'hero_metric_2_img', 'Иконка метрики 2 (изображение)' )
->set_width( 30 )
->set_help_text( 'Оптимально: 1200x800px, WebP/JPG' ),
Field::make( 'text', 'hero_metric_2_number', 'Число метрики 2' )
->set_default_value( '570K+' )
->set_width( 30 ),
Field::make( 'text', 'hero_metric_2_label', 'Подпись метрики 2' )
->set_default_value( 'Юных инноваторов' )
->set_width( 40 ),
Field::make( 'image', 'hero_metric_3_img', 'Иконка метрики 3 (изображение)' )
->set_width( 30 )
->set_help_text( 'Оптимально: 1200x800px, WebP/JPG' ),
Field::make( 'text', 'hero_metric_3_number', 'Число метрики 3' )
->set_default_value( '49K+' )
->set_width( 30 ),
Field::make( 'text', 'hero_metric_3_label', 'Подпись метрики 3' )
->set_default_value( 'Стипендий' )
->set_width( 40 ),
))
->add_tab(' О нас', array(
Field::make( 'html', 'about_tab_desc', '' )
->set_html( '<p style="color: #64748b; font-size: 13px; margin: 0 0 12px;">Секция: <strong>.about-us</strong></p>' ),
Field::make( 'separator', 'about_us_sep', 'Текст и фото' ),
Field::make( 'image', 'about_us_img', 'Фото' )
->set_help_text( 'Оптимально: 1200x800px, WebP/JPG. Реальные дети, эмоции.' )
->set_width( 30 ),
Field::make( 'textarea', 'about_us_text', 'Текст о нас' )
->set_help_text( 'Краткий текст о лагере. Выводится на странице лагеря после Hero-секции.' )
->set_default_value( 'Dekart — это сеть детских клубов, где наука, творчество и спорт объединяются в одну захватывающую программу. Мы помогаем детям раскрывать таланты, находить друзей и проводить лето с пользой. Наши вожатые — профессиональные педагоги и наставники, которые создают атмосферу доверия и вдохновения. Каждый день в лагере — это новое открытие.' ),
))
->add_tab('🏭 Преимущества', array(
Field::make( 'html', 'suggestions_tab_desc', '' )
->set_html( '<p style="color: #64748b; font-size: 13px; margin: 0 0 12px;">Секция: <strong>.suggestions</strong></p>' ),
Field::make( 'complex', 'suggestions', 'Блок «Почему выбирают нас»' )
->set_layout( 'tabbed-horizontal' )
->set_help_text( '36 преимуществ с заголовком и описанием.' )
->add_fields( array(
Field::make( 'text', 'suggestions_title', 'Заголовок' )
->set_width( 100 ),
Field::make( 'textarea', 'suggestions_text', 'Описание' )
->set_width( 100 ),
)),
))
->add_tab('📅 Программы', array(
Field::make( 'html', 'programs_tab_desc', '' )
->set_html( '<p style="color: #64748b; font-size: 13px; margin: 0 0 12px;">Секция: <strong>.programs</strong></p>' ),
Field::make( 'complex', 'programs', 'Список программ (смен)' )
->set_layout( 'tabbed-horizontal' )
->set_help_text( 'Добавьте каждую тематическую смену отдельной записью.' )
->add_fields( array(
Field::make( 'image', 'programs_img', 'Изображение смены' )
->set_help_text( 'Оптимально: 1200x800px, WebP/JPG' )
->set_width( 100 ),
Field::make( 'text', 'programs_title', 'Название смены' )
->set_width( 50 )
->set_help_text( 'Например: «Космический десант»' ),
Field::make( 'text', 'programs_date', 'Даты проведения' )
->set_width( 50 )
->set_help_text( 'Например: «26 июня»' ),
Field::make( 'textarea', 'programs_text', 'Краткое описание (в карточке)' )
->set_width( 100 )
->set_help_text( '23 предложения.' ),
Field::make( 'text', 'programs_price', 'Стоимость (в рублях)' )
->set_attribute( 'type', 'number' )
->set_width( 50 ),
Field::make( 'text', 'programs_days', 'Количество дней' )
->set_width( 50 )
->set_help_text( 'Например: «5 дней» или «7 дней»' ),
Field::make( 'rich_text', 'programs_content', 'Полное описание (в модальном окне)' )
->set_width( 100 )
->set_help_text( 'Полный текст программы для всплывающего окна.' ),
)),
))
->add_tab('💰 Цены', array(
Field::make( 'html', 'pricing_tab_desc', '' )
->set_html( '<p style="color: #64748b; font-size: 13px; margin: 0 0 12px;">Секция: <strong>.bring-child</strong></p>' ),
Field::make( 'text', 'price_half_day', 'Стоимость за половину дня (в рублях)' )
->set_attribute( 'type', 'number' )
->set_width( 50 )
->set_help_text( 'Цена за 5 дней, например: 12900' ),
Field::make( 'text', 'price_full_day', 'Стоимость за полный день (в рублях)' )
->set_attribute( 'type', 'number' )
->set_width( 50 )
->set_help_text( 'Цена за 5 дней, например: 17900' ),
))
->add_tab('👨‍🏫 Наставники', array(
Field::make( 'html', 'mentors_tab_desc', '' )
->set_html( '<p style="color: #64748b; font-size: 13px; margin: 0 0 12px;">Секция: <strong>.mentors</strong></p>' ),
Field::make( 'complex', 'mentors', 'Список наставников лагеря' )
->set_layout( 'tabbed-horizontal' )
->set_help_text( 'Каждый наставник — отдельная запись.' )
->add_fields( array(
Field::make( 'text', 'mentor_name', 'ФИО наставника' )
->set_width( 50 ),
Field::make( 'image', 'mentor_foto', 'Фото наставника' )
->set_help_text( 'Оптимально: 1200x800px, WebP/JPG' )
->set_width( 50 ),
Field::make( 'text', 'mentor_job', 'Должность в лагере' )
->set_width( 100 ),
Field::make( 'textarea', 'mentor_about', 'О себе' )
->set_help_text( 'Кратко о наставнике (показывается на карточке).' ),
))
))
->add_tab('⏰ Распорядок дня', array(
Field::make( 'html', 'routine_tab_desc', '' )
->set_html( '<p style="color: #64748b; font-size: 13px; margin: 0 0 12px;">Секция: <strong>.routine</strong></p>' ),
Field::make( 'complex', 'routine', 'Расписание по времени' )
->set_help_text( 'Добавьте пункты распорядка по порядку следования.' )
->add_fields( array(
Field::make( 'text', 'routine_time', 'Время' )
->set_width( 15 )
->set_help_text( 'Формат: 08:30' ),
Field::make( 'text', 'routine_title', 'Название активности' )
->set_width( 40 )
->set_help_text( 'Например: «Научный блок»' ),
Field::make( 'textarea', 'routine_text', 'Описание' )
->set_width( 45 ),
))
))
->add_tab('📷 Фотографии', array(
Field::make( 'html', 'fotos_tab_desc', '' )
->set_html( '<p style="color: #64748b; font-size: 13px; margin: 0 0 12px;">Секция: <strong>.foto</strong></p>' ),
Field::make( 'complex', 'fotos', 'Галерея фотографий' )
->set_layout( 'tabbed-horizontal' )
->set_help_text( 'Добавьте реальные фото детей из лагеря. Формат: WebP, 1:1 или 4:3.' )
->add_fields( array(
Field::make( 'image', 'foto', 'Фотография' )
->set_help_text( 'Оптимально: 1200x800px, WebP/JPG, до 300Кб' ),
)),
))
->add_tab('❓ Вопросы и ответы (FAQ)', array(
Field::make( 'html', 'faq_tab_desc', '' )
->set_html( '<p style="color: #64748b; font-size: 13px; margin: 0 0 12px;">Секция: <strong>.camp-faq</strong></p>' ),
Field::make( 'complex', 'questions', 'Список вопросов и ответов' )
->set_layout( 'tabbed-horizontal' )
->set_help_text( 'Чем больше вопросов, тем меньше возражений у родителей. Минимум 78 вопросов.' )
->add_fields( array(
Field::make( 'textarea', 'questions_question', 'Текст вопроса' )
->set_width( 30 ),
Field::make( 'textarea', 'questions_answer', 'Текст ответа' )
->set_width( 70 ),
)),
))
->add_tab('📍 Контакты и карта', array(
Field::make( 'html', 'contacts_tab_desc', '' )
->set_html( '<p style="color: #64748b; font-size: 13px; margin: 0 0 12px;">Секция: <strong>.camp-contact</strong></p>' ),
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' ),
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', '' )
->set_html( '<p style="color: #64748b; font-size: 13px; margin: 0 0 12px;">Секция: <strong>.modal-camp-request-form</strong></p>' ),
Field::make( 'textarea', 'camp_bitrix_script', 'Скрипт формы Битрикс24' )
->set_help_text( 'Вставьте полный JS-код интеграции с CRM-формой Битрикс24. Выводится в модальном окне заявки.' ),
));
}
// функция получения id курса по его названию
function get_post_by_title($page_title) {
$query = new WP_Query(
[
'post_type' => 'course',
'title' => $page_title,
'post_status' => 'publish',
'posts_per_page' => 1,
'update_post_term_cache' => false,
'update_post_meta_cache' => false,
'orderby' => 'post_date ID',
'order' => 'ASC',
'no_found_rows' => true,
'ignore_sticky_posts' => true,
]);
wp_reset_postdata();
if ( $query->post ) return $query->post->ID;
else return null;
}
// функция случайного цвета
function rand_color() {
return sprintf('#%06X', mt_rand(0, 0xFFFFFF));
}
add_theme_support( 'post-thumbnails' );
add_action('pre_get_posts', 'exclude_custom_taxonomy_posts');
function exclude_custom_taxonomy_posts($query) {
if (!is_admin() && $query->is_main_query() && ($query->is_tax('trainingCategory') || $query->is_tax('direction'))) {
$query->set_404();
}
}
function add_og_image() {
$term = get_queried_object();
if ($term->term_id) {
$snippet = carbon_get_term_meta( $term->term_id, 'snippet' );
if ($snippet != '') echo '<meta property="og:image" content="' . wp_get_attachment_url($snippet) . '" >' . "\n";
}
}
add_action( 'wp_head', 'add_og_image' );
function yoastVariableToTitle($post_id) {
$yoast_title = get_post_meta($post_id, '_yoast_wpseo_title', true);
$title = strstr($yoast_title, '%%', true);
if (empty($title)) {
$title = get_the_title($post_id);
}
$wpseo_titles = get_option('wpseo_titles');
$sep_options = WPSEO_Option_Titles::get_instance()->get_separator_options();
if (isset($wpseo_titles['separator']) && isset($sep_options[$wpseo_titles['separator']])) {
$sep = $sep_options[$wpseo_titles['separator']];
} else {
$sep = '-';
}
$site_title = get_bloginfo('name');
$meta_title = $title . ' ' . $sep . ' ' . $site_title;
return $meta_title;
}
function replaceQuotes($text) {
$text = str_replace(['"'], "'", $text);
return $text;
}
function enqueue_template_specific_styles() {
if ( is_page_template('page-camp.php') ) {
wp_enqueue_style(
'template-specific-style',
get_template_directory_uri() . '/assets/css/camp.css',
array(),
'1.3'
);
wp_enqueue_script(
'camp-script',
get_template_directory_uri() . '/assets/js/camp.js',
NULL,
'1.0.0',
true
);
}
if ( is_page_template('page-after-school.php') ) {
wp_enqueue_style(
'template-after-style',
get_template_directory_uri() . '/assets/css/after-school.css',
array(),
'1.1'
);
}
}
add_action('wp_enqueue_scripts', 'enqueue_template_specific_styles');
add_shortcode( 'get_form_bitrix', 'form_bitrix' );
function form_bitrix( $atts, $content = null ) {
return carbon_get_theme_option( 'site_bitrix_script' );
}
add_shortcode( 'get_reviews', 'sc_reviews' );
function sc_reviews( $atts ) {
$atts = shortcode_atts( [
'type' => 'school',
], $atts );
set_query_var( 'type', $atts['type'] );
ob_start();
load_template( locate_template( '/template-parts/reviews.php' ), false );
return ob_get_clean();
}
add_shortcode( 'get_teachers', 'sc_teachers' );
function sc_teachers( $atts, $content = null ) {
ob_start();
set_query_var( 'sc_teachers', '1' );
load_template( locate_template( '/template-parts/teachers.php' ), false );
return ob_get_clean();
}
function fix_page_1_in_pagination( $link ) {
$reviews_page_id = 91;
$root_url = get_permalink( $reviews_page_id );
if ( substr( $root_url, -1 ) !== '/' ) {
$root_url .= '/';
}
if ( isset($_GET['filter']) ) {
$root_url = add_query_arg('filter', esc_attr($_GET['filter']), $root_url);
}
$page_1_url_full = get_pagenum_link(1);
if (substr($page_1_url_full, -1) !== '/') {
$page_1_url_full .= '/';
}
$canonical_root_url = get_permalink($reviews_page_id);
if (substr($canonical_root_url, -1) !== '/') {
$canonical_root_url .= '/';
}
if (isset($_GET['filter'])) {
$canonical_root_url = add_query_arg('filter', esc_attr($_GET['filter']), $canonical_root_url);
}
$link = str_replace(
'href="' . esc_url($page_1_url_full) . '"',
'href="' . esc_url($canonical_root_url) . '"',
$link
);
$link = str_replace(
'href="' . esc_url(get_pagenum_link(1)) . '"',
'href="' . esc_url($canonical_root_url) . '"',
$link
);
return $link;
}
add_filter( 'paginate_links', 'fix_page_1_in_pagination' );
remove_action('wp_head', 'wp_generator');
remove_action('wp_head', 'rest_output_link_wp_head');
remove_action('wp_head', 'wp_oembed_add_discovery_links');
remove_action('wp_head', 'wp_shortlink_wp_head');
remove_action('wp_head', 'adjacent_posts_rel_link_wp_head');
remove_action('template_redirect', 'rest_output_link_header', 11);
function dekart_disable_emojis() {
remove_action('wp_head', 'print_emoji_detection_script', 7);
remove_action('admin_print_scripts', 'print_emoji_detection_script');
remove_action('wp_print_styles', 'print_emoji_styles');
remove_action('admin_print_styles', 'print_emoji_styles');
remove_filter('the_content_feed', 'wp_staticize_emoji');
remove_filter('comment_text_rss', 'wp_staticize_emoji');
remove_filter('wp_mail', 'wp_staticize_emoji_for_email');
add_filter('tiny_mce_plugins', 'dekart_disable_emojis_tinymce');
add_filter('wp_resource_hints', 'dekart_disable_emojis_remove_dns_prefetch', 10, 2);
}
add_action('init', 'dekart_disable_emojis');
function dekart_disable_emojis_tinymce($plugins) {
if (is_array($plugins)) {
return array_diff($plugins, array('wpemoji'));
}
return array();
}
function dekart_disable_emojis_remove_dns_prefetch($urls, $relation_type) {
if ('dns-prefetch' === $relation_type) {
$emoji_svg_url = apply_filters('emoji_svg_url', 'https://s.w.org/images/core/emoji/');
$urls = array_diff($urls, array($emoji_svg_url));
}
return $urls;
}
// ====================================================
// ✅ Оптимизация скриптов — defer только на фронтенде
// ====================================================
function dekart_add_defer_to_scripts($tag, $handle, $src) {
// Не деферим скрипты в админке, AJAX и REST запросах
if ( is_admin() || wp_doing_ajax() || ( defined('REST_REQUEST') && REST_REQUEST ) ) {
return $tag;
}
$no_defer = array(
'jquery-core',
'jquery',
'carbon-fields-script',
'wp-api-request',
'wp-element',
'wp-components',
);
if (in_array($handle, $no_defer)) {
return $tag;
}
if (strpos($tag, 'defer') !== false || strpos($tag, 'async') !== false) {
return $tag;
}
return str_replace('<script ', '<script defer ', $tag);
}
add_filter('script_loader_tag', 'dekart_add_defer_to_scripts', 10, 3);
// ====================================================
// ✅ Заголовки безопасности — только на фронтенде
// ====================================================
function dekart_security_headers() {
// Не применяем в админке, AJAX и cron
if ( is_admin() || wp_doing_ajax() || defined('DOING_CRON') ) {
return;
}
header('X-Frame-Options: SAMEORIGIN');
header('X-XSS-Protection: 1; mode=block');
header('X-Content-Type-Options: nosniff');
header('Referrer-Policy: strict-origin-when-cross-origin');
}
add_action('send_headers', 'dekart_security_headers');
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
// === ACF JSON Auto-save ===
// Автоматически сохраняет группы полей в JSON при редактировании
add_filter('acf/settings/save_json', function($path) {
return get_stylesheet_directory() . '/acf-json';
});
// Загружает группы полей из JSON
add_filter('acf/settings/load_json', function($paths) {
$paths[] = get_stylesheet_directory() . '/acf-json';
return $paths;
});
// Автоматическое удаление JSON при удалении группы полей
add_action('trashed_post', 'dekart_acf_delete_json', 10, 1);
add_action('deleted_post', 'dekart_acf_delete_json', 10, 1);
function dekart_acf_delete_json($post_id) {
if (get_post_type($post_id) !== 'acf-field-group') {
return;
}
$key = get_post_field('post_name', $post_id);
$json_file = get_stylesheet_directory() . '/acf-json/' . $key . '.json';
if (file_exists($json_file)) {
unlink($json_file);
}
}
// ─────────────────────────────────────────────────────────────
// Счетчики — централизованное управление (Настройки → Счетчики)
// ─────────────────────────────────────────────────────────────
add_action('admin_menu', 'dekart_counters_menu');
function dekart_counters_menu() {
add_options_page('Счетчики', 'Счетчики', 'manage_options', 'dekart-counters', 'dekart_counters_page');
}
add_action('admin_init', 'dekart_counters_settings');
function dekart_counters_settings() {
register_setting('dekart_counters_group', 'dekart_counter_yandex');
register_setting('dekart_counters_group', 'dekart_counter_gtm_head');
register_setting('dekart_counters_group', 'dekart_counter_gtm_body');
register_setting('dekart_counters_group', 'dekart_counter_footer');
$yandex_default = "<!-- Yandex.Metrika counter -->\n<script>\n (function(m,e,t,r,i,k,a){\n m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};\n m[i].l=1*new Date();\n for (var j = 0; j < document.scripts.length; j++) {if (document.scripts[j].src === r) { return; }}\n k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)\n })(window, document,'script','https://mc.yandex.ru/metrika/tag.js', 'ym');\n\n ym(99835482, 'init', {webvisor:true, clickmap:true, referrer: document.referrer, url: location.href, accurateTrackBounce:true, trackLinks:true});\n</script>\n<!-- /Yandex.Metrika counter -->";
$gtm_head_default = "<!-- Google Tag Manager -->\n<script>\n(function(w,d,s,l,i){\n w[l]=w[l]||[];\n w[l].push({'gtm.start':new Date().getTime(),event:'gtm.js'});\n var f=d.getElementsByTagName(s)[0],\n j=d.createElement(s),\n dl=l!='dataLayer'?'&l='+l:'';\n j.async=true;\n j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl;\n f.parentNode.insertBefore(j,f);\n})(window,document,'script','dataLayer','GTM-WJVZ4MKN');\n</script>\n<!-- /Google Tag Manager -->";
$gtm_body_default = "<!-- Google Tag Manager (noscript) -->\n<noscript><iframe src=\"https://www.googletagmanager.com/ns.html?id=GTM-WJVZ4MKN\"\nheight=\"0\" width=\"0\" style=\"display:none;visibility:hidden\"></iframe></noscript>\n<!-- /Google Tag Manager (noscript) -->";
$footer_default = "<!-- Yandex.Metrika counter -->\n<noscript><div><img src=\"https://mc.yandex.ru/watch/99835482\" style=\"position:absolute; left:-9999px;\" alt=\"\"></div></noscript>\n<!-- /Yandex.Metrika counter -->";
if (get_option('dekart_counter_yandex') === false) add_option('dekart_counter_yandex', $yandex_default);
if (get_option('dekart_counter_gtm_head') === false) add_option('dekart_counter_gtm_head', $gtm_head_default);
if (get_option('dekart_counter_gtm_body') === false) add_option('dekart_counter_gtm_body', $gtm_body_default);
if (get_option('dekart_counter_footer') === false) add_option('dekart_counter_footer', $footer_default);
}
function dekart_counters_page() {
?>
<div class="wrap">
<h1>Счетчики</h1>
<form method="post" action="options.php">
<?php settings_fields('dekart_counters_group'); ?>
<h2 class="title">Яндекс.Метрика / Tag Manager</h2>
<table class="form-table">
<tr>
<th scope="row">Yandex Code</th>
<td><textarea name="dekart_counter_yandex" rows="10" class="large-text code"><?php echo esc_textarea(get_option('dekart_counter_yandex', '')); ?></textarea>
<p class="description">Код счетчика. Выводится в <code>&lt;head&gt;</code>.</p></td>
</tr>
</table>
<h2 class="title">Google Tag Manager (GTM)</h2>
<table class="form-table">
<tr>
<th scope="row">GTM Head</th>
<td><textarea name="dekart_counter_gtm_head" rows="10" class="large-text code"><?php echo esc_textarea(get_option('dekart_counter_gtm_head', '')); ?></textarea>
<p class="description">Основной код GTM. Выводится в <code>&lt;head&gt;</code>.</p></td>
</tr>
<tr>
<th scope="row">GTM Body</th>
<td><textarea name="dekart_counter_gtm_body" rows="6" class="large-text code"><?php echo esc_textarea(get_option('dekart_counter_gtm_body', '')); ?></textarea>
<p class="description">Код <code>&lt;noscript&gt;</code>. Выводится сразу после открытия <code>&lt;body&gt;</code> через хук <code>wp_body_open</code>.</p></td>
</tr>
</table>
<h2 class="title">Произвольные скрипты</h2>
<table class="form-table">
<tr>
<th scope="row">Site-wide Footer Scripts</th>
<td><textarea name="dekart_counter_footer" rows="10" class="large-text code"><?php echo esc_textarea(get_option('dekart_counter_footer', '')); ?></textarea>
<p class="description">Для чатов, пикселей и прочих скриптов. Выводится в <code>&lt;footer&gt;</code>.</p></td>
</tr>
</table>
<?php submit_button(); ?>
</form>
</div>
<?php
}
add_action('wp_head', 'dekart_output_counters', 1);
function dekart_output_counters() {
$yandex = stripslashes(get_option('dekart_counter_yandex', ''));
$gtmhead = stripslashes(get_option('dekart_counter_gtm_head', ''));
if ($yandex) echo "\n" . $yandex . "\n";
if ($gtmhead) echo "\n" . $gtmhead . "\n";
}
add_action('wp_body_open', 'dekart_output_gtm_body', 1);
function dekart_output_gtm_body() {
$gtmbody = stripslashes(get_option('dekart_counter_gtm_body', ''));
if ($gtmbody) echo "\n" . $gtmbody . "\n";
}
add_action('wp_footer', 'dekart_output_counters_footer', 100);
function dekart_output_counters_footer() {
$footer = stripslashes(get_option('dekart_counter_footer', ''));
if ($footer) echo "\n" . $footer . "\n";
}