_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 сентября
скидка 10% на весь учебный год!'), )) ->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( 'Пример: <span>Математика</span><span>Русский язык</span>'), 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. Пример: <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></iframe>' ), 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('Hero (новый дизайн)', array( Field::make( 'image', 'banner_img', 'Фото в Hero-секции (главное изображение):' ) ->set_help_text( 'Рекомендуемый размер: 840×560 px, WebP. Будет автоматически обрезано до 840px.' ), Field::make( 'image', 'hero_img_mobile', 'Фото Hero для мобильных (опционально):' ) ->set_help_text( 'Рекомендуемый размер: 480×320 px, WebP. Если не заполнено — используется главное фото.' ), Field::make( 'text', 'hero_title_h1', 'Заголовок H1 (первая часть):' ) ->set_default_value( 'Mind-Blowing Innovation.' ), Field::make( 'text', 'hero_title_span', 'Заголовок span (вторая часть, цветная):' ) ->set_default_value( 'Big Summer Fun!' ), Field::make( 'textarea', 'banner_text', 'Текст под заголовком:' ) ->set_default_value( 'Городской лагерь для детей 7–14 лет: наука, творчество и настоящие приключения каждый день' ), Field::make( 'separator', 'hero_cta_sep', 'Кнопки' ), Field::make( 'text', 'hero_btn_primary', 'Текст главной кнопки:' ) ->set_default_value( 'Записаться на пробный день' ), Field::make( 'text', 'hero_btn_secondary', 'Текст второй кнопки:' ) ->set_default_value( 'Посмотреть программу' ), Field::make( 'text', 'hero_btn_primary_link', 'Ссылка с главной кнопки (ID смены или URL):' ) ->set_default_value( '#programs' ), Field::make( 'text', 'hero_btn_secondary_link', 'Ссылка с второй кнопки:' ) ->set_default_value( '#programs' ), Field::make( 'separator', 'hero_search_sep', 'Форма поиска лагеря' ), Field::make( 'text', 'hero_search_title', 'Заголовок формы поиска:' ) ->set_default_value( 'Find the Camp Galileo Closest to You' ), Field::make( 'text', 'hero_search_placeholder', 'Плейсхолдер поля поиска:' ) ->set_default_value( 'Search by Zip Code' ), Field::make( 'separator', 'hero_metrics_sep', 'Метрики доверия' ), Field::make( 'text', 'hero_metric_1_icon', 'Иконка метрики 1 (emoji):' ) ->set_default_value( '🏆' ), Field::make( 'text', 'hero_metric_1_text', 'Текст метрики 1:' ) ->set_default_value( '12 лет в городе' ), Field::make( 'text', 'hero_metric_2_icon', 'Иконка метрики 2 (emoji):' ) ->set_default_value( '👶' ), Field::make( 'text', 'hero_metric_2_text', 'Текст метрики 2:' ) ->set_default_value( '2 500+ счастливых детей' ), Field::make( 'text', 'hero_metric_3_icon', 'Иконка метрики 3 (emoji):' ) ->set_default_value( '⭐' ), Field::make( 'text', 'hero_metric_3_text', 'Текст метрики 3:' ) ->set_default_value( '4.9 / 5 — рейтинг от родителей' ), )) ->add_tab('Дополнительный баннер', array( Field::make( 'image', 'banner_add_img', 'Фоновое изображение баннера' ), Field::make( 'text', 'banner_add_title', 'Текст заголовка:' ), Field::make( 'textarea', 'banner_add_text', 'Текст под заголовком:' ), Field::make( 'text', 'banner_add_text_min', 'Сноска (под кнопкой):' ) )) ->add_tab('Дополнительный баннер-2', array( Field::make( 'image', 'banner_add_img2', 'Фоновое изображение баннера' ), Field::make( 'text', 'banner_add_title2', 'Текст заголовка:' ), Field::make( 'textarea', 'banner_add_text2', 'Текст под заголовком:' ), Field::make( 'text', 'banner_add_text_min2', 'Сноска (под кнопкой):' ) )) ->add_tab('Мы предлагаем', array( Field::make( 'complex', 'suggestions', 'Блок "Что мы предлагаем"' ) ->set_layout( 'tabbed-horizontal' ) ->add_fields( array( Field::make( 'image', 'suggestions_img', 'Изображение для баннера (десктопная версия)' ), Field::make( 'text', 'suggestions_title', 'Текст заголовка:' ), Field::make( 'textarea', 'suggestions_text', 'Текст под заголовком:' ) )), )) ->add_tab('Программы', array( Field::make( 'text', 'price_half_day', 'Стоимость за половину дня:' ) ->set_attribute( 'type', 'number' ), Field::make( 'text', 'price_full_day', 'Стоимость за весь день:' ) ->set_attribute( 'type', 'number' ), Field::make( 'complex', 'programs', 'Блок "Весенние и летние программы"' ) ->set_layout( 'tabbed-horizontal' ) ->add_fields( array( Field::make( 'image', 'programs_img', 'Изображение для баннера (десктопная версия)' ), Field::make( 'text', 'programs_title', 'Текст заголовка:' ), Field::make( 'text', 'programs_date', 'Даты проведения:' ), Field::make( 'textarea', 'programs_text', 'Описание в карточке:' ), Field::make( 'text', 'programs_price', 'Стоимость:' ) ->set_attribute( 'type', 'number' ) ->set_width( 30 ), Field::make( 'text', 'programs_days', 'Количество дней:' ) ->set_width( 30 ), Field::make( 'rich_text', 'programs_content', 'Описание для всплывающего окна:' ), )), )) ->add_tab('Наставники', array( Field::make( 'complex', 'mentors', 'Наставники' ) ->set_layout( 'tabbed-horizontal' ) ->add_fields( array( Field::make('association', 'mentor', 'Выберите наставника') ->set_width( 32 ) ->set_types(array( array( 'type' => 'post', 'post_type' => 'teacher', ) )) ->set_max(1) ->help_text( 'выбирается только один наставник для вкладки' ), Field::make( 'text', 'mentor_job', 'Должность:' ), Field::make( 'complex', 'mentor_directions', 'Направления наставника:' ) ->add_fields( array( Field::make( 'text', 'direction_name', 'Название направления:' ), )), Field::make( 'text', 'mentor_experience', 'Опыт работы в сфере образования:' ), )) )) ->add_tab('Распорядок дня', array( Field::make( 'complex', 'routine', 'Блок "Распорядок дня"' ) ->add_fields( array( Field::make( 'text', 'routine_time', 'Время:' ) ->set_width( 15 ), Field::make( 'text', 'routine_title', 'Название мероприятия:' ) ->set_width( 40 ), Field::make( 'textarea', 'routine_text', 'Описание мероприятия:' ) ->set_width( 45 ), )) )) ->add_tab('Фотографии', array( Field::make( 'complex', 'fotos', 'Блок с фотографиями' ) ->set_layout( 'tabbed-horizontal' ) ->add_fields( array( Field::make( 'image', 'foto', 'Фотография:' ) )), Field::make( 'rich_text', 'fotos_content', 'Текстовый контент:' ), Field::make( 'text', 'fotos_link_vk', 'Ссылка на ВК:' ) ->set_default_value('#') )) ->add_tab('Вопросы-Ответы', array( 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 ), )), )) ->add_tab('Контакты', array( Field::make( 'text', 'contact_address', 'Адрес:' ), Field::make( 'text', 'contact_location', 'Координаты адреса (для яндекc карт):' ), Field::make( 'text', 'contact_location_text', 'Название метки на карте' ), Field::make( 'text', 'contact_tel', 'Телефон' ), Field::make( 'text', 'contact_mail', 'Електронная почта:' ), 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( 'textarea', 'camp_bitrix_script', 'script (формы) БИТРИКС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 '' . "\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.0' ); 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.0' ); } } 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('