900 lines
41 KiB
PHP
900 lines
41 KiB
PHP
<?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( 'Пример: <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('Баннер', array(
|
||
Field::make( 'image', 'banner_img', 'Изображение для баннера' ),
|
||
Field::make( 'text', 'banner_title', 'Текст заголовка H1:' ),
|
||
Field::make( 'textarea', 'banner_text', 'Текст под заголовком:' ),
|
||
Field::make( 'text', 'banner_label1', 'Тестовая метка:' )
|
||
->set_default_value('6,5–11 лет'),
|
||
Field::make( 'text', 'banner_label2', 'Тестовая метка:' )
|
||
->set_default_value('мастер-классы'),
|
||
Field::make( 'text', 'banner_label3', 'Тестовая метка:' )
|
||
->set_default_value('коммуникация'),
|
||
))
|
||
->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 '<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.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('<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
|
||
// Test comment Thu May 7 17:21:53 MSK 2026
|
||
// Test Thu May 7 17:27:22 MSK 2026
|
||
// Admin test Thu May 7 17:27:51 MSK 2026
|