'Все настройки', 'menu_title' => 'Все настройки', 'menu_slug' => 'theme-general-settings', 'capability' => 'edit_posts', 'redirect' => false )); acf_add_options_sub_page(array( 'page_title' => 'Настройки', 'menu_title' => 'Настройки', 'parent_slug' => 'edit.php?post_type=cities', 'capability' => 'edit_posts', 'redirect' => false )); } ?> 'Города', 'singular_name' => 'Город', 'add_new' => 'Добавить город', 'add_new_item' => 'Добавить новый город', 'edit_item' => 'Редактировать город', 'new_item' => 'Новый город', 'all_items' => 'Все города', 'view_item' => 'Просмотр города', 'search_items' => 'Поиск городов', 'not_found' => 'Города не найдены', 'not_found_in_trash' => 'В корзине нет городов', 'menu_name' => 'Города' ); $args = array( 'labels' => $labels, 'public' => true, 'show_ui' => true, 'has_archive' => true, 'publicly_queryable' => false, 'menu_position' => -1, 'menu_icon' => 'dashicons-building', 'supports' => array( 'title' ) ); register_post_type('cities', $args); #Коворкинги $labels = array( 'name' => 'Коворкинги', 'singular_name' => 'Коворкинги', 'add_new' => 'Добавить коворкинг', 'add_new_item' => 'Добавить новый коворкинг', 'edit_item' => 'Редактировать коворкинг', 'new_item' => 'Новый коворкинг', 'all_items' => 'Все коворкинги', 'view_item' => 'Просмотр коворкинга', 'search_items' => 'Поиск коворкингов', 'not_found' => 'Коворкинги не найдены', 'not_found_in_trash' => 'В корзине нет коворкингов', 'menu_name' => 'Коворкинги' ); $args = array( 'labels' => $labels, 'public' => true, 'show_ui' => true, 'has_archive' => true, 'publicly_queryable' => true, 'menu_position' => -1, 'menu_icon' => 'dashicons-location-alt', 'supports' => array( 'title', 'thumbnail' ) ); register_post_type('coworking', $args); #Уведомления клиенту $labels = array( 'name' => 'Уведомления клиенту [EMAIL / SMS]', 'singular_name' => 'Уведомления клиенту', 'add_new' => 'Добавить уведомление', 'add_new_item' => 'Добавить новое уведомление', 'edit_item' => 'Редактировать уведомление', 'new_item' => 'Новое уведомление', 'all_items' => 'Все уведомления', 'view_item' => 'Просмотр уведомления', 'search_items' => 'Поиск уведомлений', 'not_found' => 'Уведомления не найдены', 'not_found_in_trash' => 'В корзине нет уведомлений', 'menu_name' => 'Уведомления клиенту' ); $args = array( 'labels' => $labels, 'public' => true, 'show_ui' => true, 'has_archive' => true, 'publicly_queryable' => false, 'menu_position' => -1, 'menu_icon' => 'dashicons-airplane', 'supports' => array( 'title' ) ); register_post_type('client-notifications', $args); #Помещения коворкингов $labels = array( 'name' => 'Помещения коворкингов', 'singular_name' => 'Помещения коворкингов', 'add_new' => 'Добавить помещение коворкингов', 'add_new_item' => 'Добавить новое помещение коворкингов', 'edit_item' => 'Редактировать помещение коворкингов', 'new_item' => 'Новое помещение коворкингов', 'all_items' => 'Все помещения коворкингов', 'view_item' => 'Просмотр помещения коворкингов', 'search_items' => 'Поиск помещений коворкингов', 'not_found' => 'Помещения коворкингов не найдены', 'not_found_in_trash' => 'В корзине нет помещений коворкингов', 'menu_name' => 'Помещения коворкингов' ); $args = array( 'labels' => $labels, 'public' => true, 'show_ui' => true, 'has_archive' => true, 'publicly_queryable' => false, 'menu_position' => -1, 'taxonomies' => array('coworking-spaces-types', 'coworking-spaces-categories', 'coworking-spaces-services'), 'menu_icon' => 'dashicons-admin-multisite', 'supports' => array( 'title', 'thumbnail' ) ); register_post_type('coworking-spaces', $args); //home page: post_types #ТопБлок (ГЛ) $labels = array( 'name' => 'ТопБлок (ГЛ)', 'singular_name' => 'ТопБлок (ГЛ)', 'add_new' => 'Добавить топБлок', 'add_new_item' => 'Добавить новый топБлок', 'edit_item' => 'Редактировать топБлок', 'new_item' => 'Новый топБлок', 'all_items' => 'Все топБлоки', 'view_item' => 'Просмотр топБлоков', 'search_items' => 'Поиск топБлоков', 'not_found' => 'ТопБлоки не найдены', 'not_found_in_trash' => 'В корзине нет топБлоков', 'menu_name' => 'ТопБлок (ГЛ)' ); $args = array( 'labels' => $labels, 'public' => true, 'show_ui' => true, 'has_archive' => false, 'publicly_queryable' => false, 'menu_position' => -1, 'menu_icon' => 'dashicons-welcome-view-site', 'supports' => array( 'title' ) ); register_post_type('top-block-home', $args); #О компании $labels = array( 'name' => 'О компании', 'singular_name' => 'О компании', 'add_new' => 'Добавить описание о компании', 'add_new_item' => 'Добавить новое описание о компании', 'edit_item' => 'Редактировать описание о компании', 'new_item' => 'Новое описание о компании', 'all_items' => 'Все описания о компании', 'view_item' => 'Просмотр описаний о компании', 'search_items' => 'Поиск описаний о компании', 'not_found' => 'Описания о компании не найдены', 'not_found_in_trash' => 'В корзине нет описаний о компании', 'menu_name' => 'О компании' ); $args = array( 'labels' => $labels, 'public' => true, 'show_ui' => true, 'has_archive' => false, 'publicly_queryable' => false, 'menu_position' => -1, 'menu_icon' => 'dashicons-share-alt', 'supports' => array( 'title' ) ); register_post_type('about-company', $args); #Стандарты сети $labels = array( 'name' => 'Стандарты сети', 'singular_name' => 'Стандарты сети', 'add_new' => 'Добавить стандарты сети', 'add_new_item' => 'Добавить новые стандарты сети', 'edit_item' => 'Редактировать стандарты сети', 'new_item' => 'Новые стандарты сети', 'all_items' => 'Все стандарты сети', 'view_item' => 'Просмотр стандартов сети', 'search_items' => 'Поиск стандартов сети', 'not_found' => 'Стандарты сети не найдены', 'not_found_in_trash' => 'В корзине нет стандартов сети', 'menu_name' => 'Стандарты сети' ); $args = array( 'labels' => $labels, 'public' => true, 'show_ui' => true, 'has_archive' => false, 'publicly_queryable' => false, 'menu_position' => -1, 'menu_icon' => 'dashicons-rest-api', 'supports' => array( 'title', 'thumbnail' ) ); register_post_type('company-standards', $args); #Комьюнити $labels = array( 'name' => 'Комьюнити', 'singular_name' => 'Комьюнити', 'add_new' => 'Добавить комьюнити', 'add_new_item' => 'Добавить новые комьюнити', 'edit_item' => 'Редактировать комьюнити', 'new_item' => 'Новые комьюнити', 'all_items' => 'Все комьюнити', 'view_item' => 'Просмотр комьюнити', 'search_items' => 'Поиск комьюнити', 'not_found' => 'Комьюнити не найдены', 'not_found_in_trash' => 'В корзине нет комьюнити', 'menu_name' => 'Комьюнити' ); $args = array( 'labels' => $labels, 'public' => true, 'show_ui' => true, 'has_archive' => false, 'publicly_queryable' => false, 'menu_position' => -1, 'menu_icon' => 'dashicons-universal-access-alt', 'supports' => array( 'title', 'thumbnail' ) ); register_post_type('community', $args); #Партнеры $labels = array( 'name' => 'Партнеры', 'singular_name' => 'Партнеры', 'add_new' => 'Добавить партнера', 'add_new_item' => 'Добавить нового партнера', 'edit_item' => 'Редактировать партнера', 'new_item' => 'Новый партнер', 'all_items' => 'Все партнеры', 'view_item' => 'Просмотр партнера', 'search_items' => 'Поиск партнеров', 'not_found' => 'Партнеры не найдены', 'not_found_in_trash' => 'В корзине нет партнеров', 'menu_name' => 'Партнеры' ); $args = array( 'labels' => $labels, 'public' => true, 'show_ui' => true, 'has_archive' => false, 'publicly_queryable' => false, 'menu_position' => -1, 'menu_icon' => 'dashicons-businessman', 'supports' => array( 'title', 'thumbnail' ) ); register_post_type('partners', $args); #Фотогалерея $labels = array( 'name' => 'Фотогалерея', 'singular_name' => 'Фотогалерея', 'add_new' => 'Добавить фотогалерею', 'add_new_item' => 'Добавить новую фотогалерею', 'edit_item' => 'Редактировать фотогалерею', 'new_item' => 'Новая фотогалерея', 'all_items' => 'Все фотогалерии', 'view_item' => 'Просмотр фотогалерии', 'search_items' => 'Поиск фотогалерей', 'not_found' => 'Фотогалереи не найдены', 'not_found_in_trash' => 'В корзине нет фотогалерей', 'menu_name' => 'Фотогалерея' ); $args = array( 'labels' => $labels, 'public' => true, 'show_ui' => true, 'has_archive' => false, 'publicly_queryable' => false, 'menu_position' => -1, 'menu_icon' => 'dashicons-format-gallery', 'supports' => array( 'title' ) ); register_post_type('photogallery', $args); #СМИ $labels = array( 'name' => 'СМИ', 'singular_name' => 'СМИ', 'add_new' => 'Добавить СМИ', 'add_new_item' => 'Добавить новых СМИ', 'edit_item' => 'Редактировать СМИ', 'new_item' => 'Новое СМИ', 'all_items' => 'Все СМИ', 'view_item' => 'Просмотр СМИ', 'search_items' => 'Поиск СМИ', 'not_found' => 'СМИ не найдены', 'not_found_in_trash' => 'В корзине нет СМИ', 'menu_name' => 'СМИ' ); $args = array( 'labels' => $labels, 'public' => true, 'show_ui' => true, 'has_archive' => false, 'publicly_queryable' => false, 'menu_position' => -1, 'menu_icon' => 'dashicons-megaphone', 'supports' => array( 'title', 'thumbnail' ) ); register_post_type('mass-media', $args); #Премии $labels = array( 'name' => 'Премии', 'singular_name' => 'Премии', 'add_new' => 'Добавить премию', 'add_new_item' => 'Добавить новую премию', 'edit_item' => 'Редактировать премию', 'new_item' => 'Новая премия', 'all_items' => 'Все премии', 'view_item' => 'Просмотр премии', 'search_items' => 'Поиск премий', 'not_found' => 'Премии не найдены', 'not_found_in_trash' => 'В корзине нет премий', 'menu_name' => 'Премии' ); $args = array( 'labels' => $labels, 'public' => true, 'show_ui' => true, 'has_archive' => false, 'publicly_queryable' => false, 'menu_position' => -1, 'menu_icon' => 'dashicons-awards', 'supports' => array( 'title', 'thumbnail' ) ); register_post_type('awards', $args); #БЕСТЪ: Достижения $labels = array( 'name' => 'БЕСТЪ: Достижения', 'singular_name' => 'БЕСТЪ: Достижения', 'add_new' => 'Добавить достижение', 'add_new_item' => 'Добавить новое достижение', 'edit_item' => 'Редактировать достижение', 'new_item' => 'Новое достижение', 'all_items' => 'Все достижения', 'view_item' => 'Просмотр достижений', 'search_items' => 'Поиск достижений', 'not_found' => 'Достижения не найдены', 'not_found_in_trash' => 'В корзине нет достижений', 'menu_name' => 'Достижения' ); $args = array( 'labels' => $labels, 'public' => true, 'show_ui' => true, 'has_archive' => false, 'publicly_queryable' => false, 'menu_position' => -1, 'menu_icon' => 'dashicons-thumbs-up', 'supports' => array( 'title', 'thumbnail' ) ); register_post_type('best-brand', $args); #БЕСТЪ: Другие проекты $labels = array( 'name' => 'БЕСТЪ: Другие проекты', 'singular_name' => 'БЕСТЪ: Другие проекты', 'add_new' => 'Добавить проект', 'add_new_item' => 'Добавить новый проект', 'edit_item' => 'Редактировать проект', 'new_item' => 'Новые проект', 'all_items' => 'Все проекты', 'view_item' => 'Просмотр проектов', 'search_items' => 'Поиск проектов', 'not_found' => 'Проекты не найдены', 'not_found_in_trash' => 'В корзине нет проектов', 'menu_name' => 'Другие проекты' ); $args = array( 'labels' => $labels, 'public' => true, 'show_ui' => true, 'has_archive' => false, 'publicly_queryable' => false, 'menu_position' => -1, 'menu_icon' => 'dashicons-networking', 'supports' => array( 'title', 'thumbnail' ) ); register_post_type('best-other-projects', $args); #Мероприятия $labels = array( 'name' => 'Мероприятия', 'singular_name' => 'Мероприятия', 'add_new' => 'Добавить мероприятие', 'add_new_item' => 'Добавить новое мероприятие', 'edit_item' => 'Редактировать мероприятие', 'new_item' => 'Новое мероприятие', 'all_items' => 'Все мероприятия', 'view_item' => 'Просмотр мероприятий', 'search_items' => 'Поиск мероприятий', 'not_found' => 'Мероприятия не найдены', 'not_found_in_trash' => 'В корзине нет мероприятий', 'menu_name' => 'Мероприятия' ); $args = array( 'labels' => $labels, 'public' => true, 'show_ui' => true, 'has_archive' => true, 'publicly_queryable' => true, 'menu_position' => -1, 'taxonomies' => array('events-categories'), 'menu_icon' => 'dashicons-calendar-alt', 'supports' => array( 'title', 'thumbnail' ) ); register_post_type('events', $args); #Кейсы $labels = array( 'name' => 'Кейсы', 'singular_name' => 'Кейсы', 'add_new' => 'Добавить кейс', 'add_new_item' => 'Добавить новый кейс', 'edit_item' => 'Редактировать кейс', 'new_item' => 'Новый кейс', 'all_items' => 'Все кейсы', 'view_item' => 'Просмотр кейсов', 'search_items' => 'Поиск кейсов', 'not_found' => 'Кейсы не найдены', 'not_found_in_trash' => 'В корзине нет кейсов', 'menu_name' => 'Кейсы' ); $args = array( 'labels' => $labels, 'public' => true, 'show_ui' => true, 'has_archive' => true, 'publicly_queryable' => true, 'menu_position' => -1, 'menu_icon' => 'dashicons-superhero', 'supports' => array( 'title' ) ); register_post_type('cases', $args); //coworking: post_types #ТопБлок (ГЛ) $labels = array( 'name' => 'ТопБлок (КВ)', 'singular_name' => 'ТопБлок (КВ)', 'add_new' => 'Добавить топБлок', 'add_new_item' => 'Добавить новый топБлок', 'edit_item' => 'Редактировать топБлок', 'new_item' => 'Новый топБлок', 'all_items' => 'Все топБлоки', 'view_item' => 'Просмотр топБлоков', 'search_items' => 'Поиск топБлоков', 'not_found' => 'ТопБлоки не найдены', 'not_found_in_trash' => 'В корзине нет топБлоков', 'menu_name' => 'ТопБлок (КВ)' ); $args = array( 'labels' => $labels, 'public' => true, 'show_ui' => true, 'has_archive' => false, 'publicly_queryable' => false, 'menu_position' => -1, 'menu_icon' => 'dashicons-welcome-view-site', 'supports' => array( 'title' ) ); register_post_type('top-block-coworking', $args); #Атмосфера $labels = array( 'name' => 'Атмосфера', 'singular_name' => 'Атмосфера', 'add_new' => 'Добавить атмосферу', 'add_new_item' => 'Добавить новую атмосферу', 'edit_item' => 'Редактировать атмосферу', 'new_item' => 'Новая атмосферу', 'all_items' => 'Все атмосферы', 'view_item' => 'Просмотр атмосферы', 'search_items' => 'Поиск атмосфер', 'not_found' => 'Атмосферы не найдены', 'not_found_in_trash' => 'В корзине нет атмосфер', 'menu_name' => 'Атмосфера' ); $args = array( 'labels' => $labels, 'public' => true, 'show_ui' => true, 'has_archive' => false, 'publicly_queryable' => false, 'menu_position' => -1, 'menu_icon' => 'dashicons-buddicons-activity', 'supports' => array( 'title' ) ); register_post_type('atmosphere', $args); #Пространство $labels = array( 'name' => 'Пространство', 'singular_name' => 'Пространство', 'add_new' => 'Добавить пространство', 'add_new_item' => 'Добавить новое пространство', 'edit_item' => 'Редактировать пространство', 'new_item' => 'Новое пространство', 'all_items' => 'Все пространства', 'view_item' => 'Просмотр пространства', 'search_items' => 'Поиск пространств', 'not_found' => 'Пространства не найдены', 'not_found_in_trash' => 'В корзине нет пространств', 'menu_name' => 'Пространство' ); $args = array( 'labels' => $labels, 'public' => true, 'show_ui' => true, 'has_archive' => false, 'publicly_queryable' => false, 'menu_position' => -1, 'menu_icon' => 'dashicons-tide', 'supports' => array( 'title' ) ); register_post_type('space', $args); #Услуги (табы) $labels = array( 'name' => 'Услуги (табы)', 'singular_name' => 'Услуги (табы)', 'add_new' => 'Добавить услугу', 'add_new_item' => 'Добавить новую услугу', 'edit_item' => 'Редактировать услугу', 'new_item' => 'Новая услуга', 'all_items' => 'Все услуги', 'view_item' => 'Просмотр услуги', 'search_items' => 'Поиск услуг', 'not_found' => 'Услуги не найдены', 'not_found_in_trash' => 'В корзине нет услуг', 'menu_name' => 'Услуги (табы)' ); $args = array( 'labels' => $labels, 'public' => true, 'show_ui' => true, 'has_archive' => false, 'publicly_queryable' => false, 'menu_position' => -1, 'menu_icon' => 'dashicons-portfolio', 'supports' => array( 'title' ) ); register_post_type('services-tabs', $args); #Тарифы $labels = array( 'name' => 'Тарифы', 'singular_name' => 'Тарифы', 'add_new' => 'Добавить тариф', 'add_new_item' => 'Добавить новый тариф', 'edit_item' => 'Редактировать тариф', 'new_item' => 'Новый тариф', 'all_items' => 'Все тарифы', 'view_item' => 'Просмотр тарифа', 'search_items' => 'Поиск тарифов', 'not_found' => 'Тарифы не найдены', 'not_found_in_trash' => 'В корзине нет тарифов', 'menu_name' => 'Тарифы' ); $args = array( 'labels' => $labels, 'public' => true, 'show_ui' => true, 'has_archive' => false, 'publicly_queryable' => false, 'menu_position' => -1, 'menu_icon' => 'dashicons-tickets-alt', 'supports' => array( 'title' ) ); register_post_type('rates-coworking', $args); #Услуги (список) $labels = array( 'name' => 'Услуги (список)', 'singular_name' => 'Услуги (список)', 'add_new' => 'Добавить услугу', 'add_new_item' => 'Добавить новую услугу', 'edit_item' => 'Редактировать услугу', 'new_item' => 'Новая услуга', 'all_items' => 'Все услуги', 'view_item' => 'Просмотр услуги', 'search_items' => 'Поиск услуг', 'not_found' => 'Услуги не найдены', 'not_found_in_trash' => 'В корзине нет услуг', 'menu_name' => 'Услуги (список)' ); $args = array( 'labels' => $labels, 'public' => true, 'show_ui' => true, 'has_archive' => false, 'publicly_queryable' => false, 'menu_position' => -1, 'menu_icon' => 'dashicons-schedule', 'supports' => array( 'title', 'thumbnail' ) ); register_post_type('services-list', $args); //bs: post_types #ТопБлок (БС) $labels = array( 'name' => 'ТопБлок (БС)', 'singular_name' => 'ТопБлок (БС)', 'add_new' => 'Добавить топБлок', 'add_new_item' => 'Добавить новый топБлок', 'edit_item' => 'Редактировать топБлок', 'new_item' => 'Новый топБлок', 'all_items' => 'Все топБлоки', 'view_item' => 'Просмотр топБлоков', 'search_items' => 'Поиск топБлоков', 'not_found' => 'ТопБлоки не найдены', 'not_found_in_trash' => 'В корзине нет топБлоков', 'menu_name' => 'ТопБлок (БС)' ); $args = array( 'labels' => $labels, 'public' => true, 'show_ui' => true, 'has_archive' => false, 'publicly_queryable' => false, 'menu_position' => -1, 'menu_icon' => 'dashicons-welcome-view-site', 'supports' => array( 'title' ) ); register_post_type('top-block-bs', $args); #Ресурсы (БС) $labels = array( 'name' => 'Ресурсы', 'singular_name' => 'Ресурсы', 'add_new' => 'Добавить ресурсы', 'add_new_item' => 'Добавить новые ресурсы', 'edit_item' => 'Редактировать ресурсы', 'new_item' => 'Новые ресурсы', 'all_items' => 'Все ресурсы', 'view_item' => 'Просмотр ресурсов', 'search_items' => 'Поиск ресурсов', 'not_found' => 'Ресурсы не найдены', 'not_found_in_trash' => 'В корзине нет ресурсов', 'menu_name' => 'Ресурсы' ); $args = array( 'labels' => $labels, 'public' => true, 'show_ui' => true, 'has_archive' => false, 'publicly_queryable' => false, 'menu_position' => -1, 'menu_icon' => 'dashicons-art', 'supports' => array( 'title', 'thumbnail' ) ); register_post_type('business-tasks-bs', $args); #Для работы (БС) $labels = array( 'name' => 'Для работы', 'singular_name' => 'Для работы', 'add_new' => 'Добавить данные', 'add_new_item' => 'Добавить новые данные', 'edit_item' => 'Редактировать данные', 'new_item' => 'Новые данные', 'all_items' => 'Все данные', 'view_item' => 'Просмотр данных', 'search_items' => 'Поиск данных', 'not_found' => 'Данные не найдена', 'not_found_in_trash' => 'В корзине нет данных', 'menu_name' => 'Для работы' ); $args = array( 'labels' => $labels, 'public' => true, 'show_ui' => true, 'has_archive' => false, 'publicly_queryable' => false, 'menu_position' => -1, 'menu_icon' => 'dashicons-image-filter', 'supports' => array( 'title' ) ); register_post_type('work-environment-bs', $args); #Для жизни (БС) // $labels = array( // 'name' => 'Для жизни', // 'singular_name' => 'Для жизни', // 'add_new' => 'Добавить данные', // 'add_new_item' => 'Добавить новые данные', // 'edit_item' => 'Редактировать данные', // 'new_item' => 'Новые данные', // 'all_items' => 'Все данные', // 'view_item' => 'Просмотр данных', // 'search_items' => 'Поиск данных', // 'not_found' => 'Данные не найдена', // 'not_found_in_trash' => 'В корзине нет данных', // 'menu_name' => 'Для жизни' // ); // $args = array( // 'labels' => $labels, // 'public' => true, // 'show_ui' => true, // 'has_archive' => false, // 'publicly_queryable' => false, // 'menu_position' => -1, // 'menu_icon' => 'dashicons-cloud', // 'supports' => array( // 'title' // ) // ); // register_post_type('life-environment-bs', $args); #Для обучения (БС) $labels = array( 'name' => 'Для обучения', 'singular_name' => 'Для обучения', 'add_new' => 'Добавить данные', 'add_new_item' => 'Добавить новые данные', 'edit_item' => 'Редактировать данные', 'new_item' => 'Новые данные', 'all_items' => 'Все данные', 'view_item' => 'Просмотр данных', 'search_items' => 'Поиск данных', 'not_found' => 'Данные не найдена', 'not_found_in_trash' => 'В корзине нет данных', 'menu_name' => 'Для обучения' ); $args = array( 'labels' => $labels, 'public' => true, 'show_ui' => true, 'has_archive' => false, 'publicly_queryable' => false, 'menu_position' => -1, 'menu_icon' => 'dashicons-buddicons-community', 'supports' => array( 'title', 'thumbnail' ) ); register_post_type('tch-environment-bs', $args); #Спикеры (БС) $labels = array( 'name' => 'Спикеры', 'singular_name' => 'Спикеры', 'add_new' => 'Добавить спикера', 'add_new_item' => 'Добавить нового спикера', 'edit_item' => 'Редактировать спикера', 'new_item' => 'Новый спикер', 'all_items' => 'Все спикеры', 'view_item' => 'Просмотр спикеров', 'search_items' => 'Поиск спикеров', 'not_found' => 'Спикеры не найдена', 'not_found_in_trash' => 'В корзине нет спикеров', 'menu_name' => 'Спикеры' ); $args = array( 'labels' => $labels, 'public' => true, 'show_ui' => true, 'has_archive' => false, 'publicly_queryable' => false, 'menu_position' => -1, 'menu_icon' => 'dashicons-sos', 'supports' => array( 'title', 'thumbnail' ) ); register_post_type('speakers-bs', $args); #Карта клуба (БС) $labels = array( 'name' => 'Карта клуба', 'singular_name' => 'Карта клуба', 'add_new' => 'Добавить карту клуба', 'add_new_item' => 'Добавить новую карту клуба', 'edit_item' => 'Редактировать карту клуба', 'new_item' => 'Новая карта клуба', 'all_items' => 'Все карты клуба', 'view_item' => 'Просмотр карт клуба', 'search_items' => 'Поиск карт клуба', 'not_found' => 'Карты клуба не найдена', 'not_found_in_trash' => 'В корзине нет карт клуба', 'menu_name' => 'Карта клуба' ); $args = array( 'labels' => $labels, 'public' => true, 'show_ui' => true, 'has_archive' => false, 'publicly_queryable' => false, 'menu_position' => -1, 'menu_icon' => 'dashicons-buddicons-replies', 'supports' => array( 'title', 'thumbnail' ) ); register_post_type('cb-form-bs', $args); #Привилегии (БС) $labels = array( 'name' => 'Привилегии', 'singular_name' => 'Привилегии', 'add_new' => 'Добавить привилегию', 'add_new_item' => 'Добавить новую привилегию', 'edit_item' => 'Редактировать привилегию', 'new_item' => 'Новая привилегия', 'all_items' => 'Все привилегии', 'view_item' => 'Просмотр привилегий', 'search_items' => 'Поиск привилегий', 'not_found' => 'Привилегии не найдена', 'not_found_in_trash' => 'В корзине нет привилегий', 'menu_name' => 'Привилегии' ); $args = array( 'labels' => $labels, 'public' => true, 'show_ui' => true, 'has_archive' => false, 'publicly_queryable' => false, 'menu_position' => -1, 'menu_icon' => 'dashicons-buddicons-groups', 'supports' => array( 'title', 'thumbnail' ) ); register_post_type('privilege-bs', $args); #ТопБлок (ПК) $labels = array( 'name' => 'ТопБлок (ПК)', 'singular_name' => 'ТопБлок (ПК)', 'add_new' => 'Добавить топБлок', 'add_new_item' => 'Добавить новый топБлок', 'edit_item' => 'Редактировать топБлок', 'new_item' => 'Новый топБлок', 'all_items' => 'Все топБлоки', 'view_item' => 'Просмотр топБлоков', 'search_items' => 'Поиск топБлоков', 'not_found' => 'ТопБлоки не найдены', 'not_found_in_trash' => 'В корзине нет топБлоков', 'menu_name' => 'ТопБлок (ПК)' ); $args = array( 'labels' => $labels, 'public' => true, 'show_ui' => true, 'has_archive' => false, 'publicly_queryable' => false, 'menu_position' => -1, 'menu_icon' => 'dashicons-welcome-view-site', 'supports' => array( 'title' ) ); register_post_type('top-block-pk', $args); #Типы помещений (ПК) $labels = array( 'name' => 'Типы помещений (ПК)', 'singular_name' => 'Типы помещений (ПК)', 'add_new' => 'Добавить тип помещения', 'add_new_item' => 'Добавить новый тип помещения', 'edit_item' => 'Редактировать тип помещения', 'new_item' => 'Новый тип помещения', 'all_items' => 'Все типы помещений', 'view_item' => 'Просмотр типа помещения', 'search_items' => 'Поиск типов помещений', 'not_found' => 'Типы помещений не найдены', 'not_found_in_trash' => 'В корзине нет типов помещений', 'menu_name' => 'Типы помещений' ); $args = array( 'labels' => $labels, 'public' => true, 'show_ui' => true, 'has_archive' => false, 'publicly_queryable' => false, 'menu_position' => -1, 'menu_icon' => 'dashicons-block-default', 'supports' => array( 'title', 'thumbnail' ) ); register_post_type('rooms-pk', $args); #Помещения (ПК) $labels = array( 'name' => 'Помещения (ПК)', 'singular_name' => 'Помещения (ПК)', 'add_new' => 'Добавить помещение', 'add_new_item' => 'Добавить новое помещение', 'edit_item' => 'Редактировать помещение', 'new_item' => 'Новое помещение', 'all_items' => 'Все помещения', 'view_item' => 'Просмотр помещения', 'search_items' => 'Поиск помещений', 'not_found' => 'Помещения не найдены', 'not_found_in_trash' => 'В корзине нет помещений', 'menu_name' => 'Помещения' ); $args = array( 'labels' => $labels, 'public' => true, 'show_ui' => true, 'has_archive' => false, 'publicly_queryable' => false, 'menu_position' => -1, 'menu_icon' => 'dashicons-open-folder', 'supports' => array( 'title' ) ); register_post_type('rent-pk', $args); #Инфраструктура (ПК) $labels = array( 'name' => 'Инфраструктура (ПК)', 'singular_name' => 'Инфраструктура (ПК)', 'add_new' => 'Добавить инфраструктуру', 'add_new_item' => 'Добавить новую инфраструктуру', 'edit_item' => 'Редактировать инфраструктуру', 'new_item' => 'Новая инфраструктура', 'all_items' => 'Все инфраструктуры', 'view_item' => 'Просмотр инфраструктуры', 'search_items' => 'Поиск инфраструктур', 'not_found' => 'Инфраструктура не найдены', 'not_found_in_trash' => 'В корзине нет инфраструктур', 'menu_name' => 'Инфраструкт.' ); $args = array( 'labels' => $labels, 'public' => true, 'show_ui' => true, 'has_archive' => false, 'publicly_queryable' => false, 'menu_position' => -1, 'menu_icon' => 'dashicons-food', 'supports' => array( 'title', 'thumbnail' ) ); register_post_type('infrastructure-pk', $args); } add_action('init', 'registerCustomPostType'); #добавляем кастомные таксономии function registerCustomTaxonomies() { #Категории для раздела: "Мероприятия" $labels = array( 'name' => 'Категории', '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('events-categories', array('events'), array( 'labels' => $labels, 'public' => false, 'hierarchical' => true, 'show_in_nav_menus' => true, 'show_ui' => true, 'show_admin_column' => true, 'query_var' => true, '_builtin' => true )); #Типы помещений для раздела: "Помещения коворкингов" $labels = array( 'name' => 'Типы помещений', '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('coworking-spaces-types', array('coworking-spaces'), array( 'labels' => $labels, 'public' => false, 'hierarchical' => true, 'show_in_nav_menus' => true, 'show_ui' => true, 'show_admin_column' => true, 'query_var' => true, '_builtin' => true )); #Категории для раздела: "Помещения коворкингов" $labels = array( 'name' => 'Категории', '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('coworking-spaces-categories', array('coworking-spaces'), array( 'labels' => $labels, 'public' => false, 'hierarchical' => true, 'show_in_nav_menus' => true, 'show_ui' => true, 'show_admin_column' => true, 'query_var' => true, '_builtin' => true )); #Услуги для раздела: "Помещения коворкингов" $labels = array( 'name' => 'Услуги', '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('coworking-spaces-services', array('coworking-spaces'), array( 'labels' => $labels, 'public' => false, 'hierarchical' => true, 'show_in_nav_menus' => true, 'show_ui' => true, 'show_admin_column' => true, 'query_var' => true, '_builtin' => true )); } add_action('init', 'registerCustomTaxonomies', 0); ?> post_name."&tb=1"; $rules["feed/(feed|rdf|rss|rss2|atom)/?$"] = 'index.php?pagename='.$post->post_name.'&feed=$matches[1]'; $rules["(feed|rdf|rss|rss2|atom)/?$"] = 'index.php?pagename='.$post->post_name.'&feed=$matches[1]'; $rules["coworking/?([0-9]{1,})/?$"] = 'index.php?pagename='.$post->post_name.'&paged=$matches[1]'; $rules["comment-page-([0-9]{1,})/?$"] = 'index.php?pagename='.$post->post_name.'&cpage=$matches[1]'; $rules["wc-api(/(.*))?/?$"] = 'index.php?pagename='.$post->post_name.'&wc-api=$matches[2]'; $rules["$"] = "index.php?pagename=".$post->post_name; $rules['([^/]+)/?$'] = 'index.php?pagename='.$post->post_name.'/$matches[1]'; return $rules; } #coworkings as subdomain add_filter('coworking_rewrite_rules', function($rules) { $url = getenv('HTTP_HOST'); $domain = explode(".", $url); $pageslug = $domain[0]; $coworkings = get_posts([ 'post_type' => 'coworking', 'posts_per_page' => '-1' ]); foreach ($coworkings as $coworking) { if (($pageslug == $coworking->post_name) || ($pageslug == $coworking->subdomain)) { $newrules = getCoworkingSubdomainRules($coworking); $rules = $newrules + $rules; } } return $rules; }); function is_fr() { return (is_page('franchise') || is_page('management')) ? true : false; } function is_coworking_subDomain() { $url = getenv('HTTP_HOST'); $domain = explode(".", $url); return ($domain[0] == 'avenue' || $domain[0] == 'benua' || $domain[0] == 'rodelen' || $domain[0] == 'instrumentalnaya' || $domain[0] == 'kazanskaya' || $domain[0] == 'ugol' || $domain[0] == 'docklands' || $domain[0] == 'smolninsky' || $domain[0] == 'vyatka' || $domain[0] == 'ratusha') ? true : false; } class multiCities { public $allCities = array(); public $defaultSubdomain; public $currentSubDomain; public $currentCityId; public $currentCityTitle; public $currentCityTitleCase; #сохраняем данные в переменные public function __construct() { $this->defaultSubdomain = $this->getDefaultSubdomain(); $this->currentSubDomain = $this->getCurrentSubDomain(); $this->allCities = $this->getAllCities(); $this->currentCityId = ($val = $this->getCurrentCityData()) ? $val->ID : ''; $this->currentCityTitle = ($val = $this->getCurrentCityData()) ? $val->post_title : ''; $this->currentCityTitleCase = ($val = $this->getCurrentCityData()->title_case) ? $val : $this->currentCityTitle; add_action('rest_api_init', function () { register_rest_route('wp/v2', '/coworking/get-by-city-id', array( 'methods' => 'GET', 'callback' => array($this, 'coworkingListByCity'), 'args' => array( 'id' => array( 'validate_callback' => function($param, $request, $key) { return is_numeric($param); } )))); }); add_action('rest_api_init', function () { register_rest_route('wp/v2', '/coworking/get-city-coworking', array( 'methods' => 'GET', 'callback' => array($this, 'cityCoworkingList') )); }); } #получаем домен по умолчанию public function getDefaultSubdomain() { if ($defaultCity = get_field('default_city', 'option')) { return $defaultCity->subdomain; } } #проверяем валидный (существует) ли поддомен public function checkIfSubDomainExist($subdomain) { return (get_posts(array( 'numberposts' => 1, 'post_type' => 'cities', 'fields' => array('ID'), 'meta_key' => 'subdomain', 'meta_value' => $subdomain ))) ? true : false; } #получаем поддомен текущего города (в случае если поддомена нет - делаем редирект) public function getCurrentSubDomain() { if (preg_match('/(?:http[s]*\:\/\/)*(.*?)\.(?=[^\/]*\..{2,5})/i', $_SERVER['HTTP_HOST'], $matcher)) { if ($this->checkIfSubDomainExist($matcher[1])) { return $matcher[1]; } else { if ($matcher[1] == 'franchise' || $matcher[1] == 'management' || $matcher[1] == 'avenue' || $matcher[1] == 'benua' || $matcher[1] == 'rodelen' || $matcher[1] == 'instrumentalnaya' || $matcher[1] == 'kazanskaya' || $matcher[1] == 'ugol' || $matcher[1] == 'docklands' || $matcher[1] == 'smolninsky' || $matcher[1] == 'vyatka' || $matcher[1] == 'ratusha') { return $this->defaultSubdomain; } else { header('Location: https://'.$this->defaultSubdomain.'.'.explode($matcher[1].'.', $_SERVER['HTTP_HOST'])[1].'/'); exit(); } } } else { header('Location: https://'.$this->defaultSubdomain.'.'.$_SERVER['HTTP_HOST'].'/'); exit(); } } #получаем список всех городов public function getAllCities() { $items = get_posts(array( 'numberposts' => -1, 'post_type' => 'cities' )); return $items; } #получаем данные текущего города public function getCurrentCityData() { foreach ($this->allCities as $item) { if ($item->subdomain == $this->currentSubDomain) { return $item; } } } #получаем данные acf repeater текущего города public function getCurrentCityRepeaterData($items) { foreach ($items as $item) { if ($item['city'] == $this->currentCityId) { return $item; } } } #добавляем свой rest-api метод для получения списка коворкингов по ID города public function coworkingListByCity($request) { $id = $request->get_param('id'); $data = array(); $mapData = array(); $images = array(); if (!isset($id)) { return new WP_Error('error', 'Missing required parameters', array('status' => 200)); } $args = array( 'numberposts' => -1, 'post_type' => 'coworking' ); if (isset($id) && $id != 0) { $args['meta_key'] = 'city'; $args['meta_value'] = $id; } $items = get_posts($args); if ($items) { #ID коворкинга который по-умолчанию открыт на карте (активен) $data['item_default_active'] = (get_field('default_active_coworking_on_map_type', $this->currentCityId) == 'specified') ? get_field('default_active_coworking_on_map', $this->currentCityId) : $items[array_rand($items, 1)]->ID; foreach ($items as $item) { $mapData = ($v = get_field('contacts_map_position', $item->ID)) ? json_decode($v) : ''; //$images = array(getImageSrcByPostId($item->ID, '760x530')); $images = array(); if ($v = get_field('images_location_map', $item->ID)) { foreach ($v as $vItem) { $images[] = getImageSrcByThumbId($vItem['id'], '760x530'); } } else { $images = array(getImageSrcByPostId($item->ID, '760x530')); } $data['items'][] = array( 'id' => $item->ID, 'url' => get_permalink($item->ID), 'info' => array( 'post_title' => $item->post_title, 'title' => get_field('location_map_block_sub_title', $item->ID), 'seats_number' => get_field('seats_number', $item->ID), 'price' => get_field('price', $item->ID), 'desc' => get_field('desc_short', $item->ID), 'images' => $images, 'cb_email' => get_field('cb_email', $item->ID), 'isNew' => get_field('is_new', $item->ID), 'isOpen' => get_field('is_open', $item->ID), ), 'modalCallBackData' => array( 'mcbd1' => modalLink(get_field('cbform_modal1', multiCities()->currentCityId), $item->ID, $item->ID), 'mcbd2' => modalLink(get_field('cbform_modal2', multiCities()->currentCityId), $item->ID, $item->ID), 'mcbd3' => modalLink(get_field('cbform_modal3', multiCities()->currentCityId), $item->ID, $item->ID), 'mcbd2_link_title' => get_field('cbmodal1_link_title', $item->ID), 'mcbd3_link_title' => get_field('cbmodal2_link_title', $item->ID) ), 'contacts' => array( 'phone' => strip_tags(get_field('contacts_phone', $item->ID)), 'email' => get_field('contacts_email', $item->ID), 'address' => get_field('contacts_address', $item->ID), 'worktime' => get_field('contacts_worktime', $item->ID), 'worktime_holidays' => get_field('contacts_worktime_holidays', $item->ID), 'routes_title' => get_field('contacts_routes_title', $item->ID), 'routes_title_color' => get_field('contacts_routes_title_color', $item->ID), 'routes_desc' => get_field('contacts_routes_desc', $item->ID), 'routes_desc2' => get_field('contacts_routes_desc2', $item->ID), 'routes_desc3' => get_field('contacts_routes_desc3', $item->ID), 'social' => get_field('contacts_social', $item->ID), 'messengers' => get_field('contacts_social_messengers', $item->ID) ), 'geo' => array( 'lat' => ($mapData) ? $mapData->marks[0]->coords[0] : '', 'lng' => ($mapData) ? $mapData->marks[0]->coords[1] : '', 'icon' => get_field('contacts_map_icon', $item->ID), 'icon_active' => get_field('contacts_map_icon_active', $item->ID), 'icon_width' => 67, 'icon_height' => 90 ) ); } return ($data['items']) ? new WP_REST_Response($data, 200) : false; } else { return false; } } #добавляем свой rest-api метод для получения списка всех городов и коворкингов public function cityCoworkingList($request) { $data = array(); if ($items = get_posts(array( 'numberposts' => -1, 'post_type' => 'cities' ))) { foreach ($items as $item) { $data[] = array( 'id' => $item->ID, 'title' => $item->post_title, 'url' => ((preg_match('/(?:http[s]*\:\/\/)*(.*?)\.(?=[^\/]*\..{2,5})/i', $_SERVER['HTTP_HOST'], $matcher)) ? 'https://'.$item->subdomain.'.'.explode($matcher[1].'.', $_SERVER['HTTP_HOST'])[1] : 'https://'.$item->subdomain.'.'.$_SERVER['HTTP_HOST']), 'items' => array_map(function($e) { $coworkingTitle = (($e->title_alternate2) ? $e->title_alternate2 : (($e->title_alternate) ? $e->title_alternate : $e->post_title)); return array( 'id' => $e->ID, 'title' => str_replace('', '', $coworkingTitle), 'url' => 'https://'.get_field('city', $e)->subdomain.'.'.((preg_match('/(?:http[s]*\:\/\/)*(.*?)\.(?=[^\/]*\..{2,5})/i', $_SERVER['HTTP_HOST'], $matcher)) ? explode($matcher[1].'.', $_SERVER['HTTP_HOST'])[1] : $_SERVER['HTTP_HOST']).'/coworking/'.$e->post_name.'/', 'colorMetro' => get_field('contacts_routes_title_color', $e->ID), ); }, get_posts(array( 'numberposts' => -1, 'post_type' => 'coworking', 'meta_key' => 'city', 'meta_value' => $item->ID ))) ); } } else { return new WP_Error('error', 'Not found cities', array('status' => 200)); } return ($data) ? new WP_REST_Response($data, 200) : false; } #получаем список коворкингов всех или в конкретном горооде public function getCityCoworkingItems($by = '') { $args = array( 'numberposts' => -1, 'post_type' => 'coworking' ); if ($by != 'all') { $args['meta_key'] = 'city'; $args['meta_value'] = $this->currentCityId; } return ($items = get_posts($args)) ? $items : false; } } if (!is_admin()) { global $multiCities; $multiCities = new multiCities(); function multiCities() { global $multiCities; return $multiCities; } } ?> btx24_id = ($v = get_user_meta($user->ID, 'btx24_id', true)) ? $v : ''; $user->patronymic = ($v = get_user_meta($user->ID, 'patronymic', true)) ? $v : ''; $user->phone = ($v = get_user_meta($user->ID, 'phone', true)) ? $v : ''; $user->btx24_id = ($v = get_user_meta($user->ID, 'btx24_id', true)) ? $v : ''; } return $user; } #синхронизируемся с битрикс24 / СКУД if (is_user_logged_in() && $user = profile_user()) { syncUserDataBtx24($user->ID, false); syncUserDataSKUD($user->ID); } #отключаем wp-admin для обычных пользователей add_action('admin_init', function() { $role = get_role('subscriber'); $role->remove_cap('read'); }); #отключаем wp-admin-bar для обычных пользователей add_action('wp_head', function() { if (current_user_can('subscriber')) { add_filter('show_admin_bar','__return_false'); } }); #делаем обычным пользователям редирект с wp-admin add_filter('login_redirect', function($redirect_to, $request, $user) { if (isset($user->roles) && is_array( $user->roles)) { if (in_array('subscriber', $user->roles)) { return home_url(); } } return $redirect_to; }, 10, 3); #добавляем свои методы API add_action('rest_api_init', function () { #получение данных о стоимости коворкинга по его ID (рабочие места / тарифы / доп. услуги) register_rest_route('wp/v2', '/api/coworking/prices', array( 'methods' => 'GET', 'callback' => function($request) { $id = ($v = $request->get_param('id')) ? $v : ''; $response = array( 'workplacesTariffs' => get_field('workplaces_tariffs', $id), 'additionalServices' => get_field('additional_services', $id), 'requisites' => (get_field('requisites_title', $id) || get_field('requisites_desc', $id)) ? [ 'title' => get_field('requisites_title', $id), 'desc' => get_field('requisites_desc', $id) ] : [], 'userAgreementLink' => ($v = get_field('user_agreement_link', $id)) ? $v : '' ); return ($response) ? new WP_REST_Response($response, 200) : false; } )); #регистрация register_rest_route('wp/v2', '/api/profile/registration/', array( 'methods' => 'GET, POST', 'callback' => function($request) { $step = $request->get_param('step'); $phone = ($v = $request->get_param('phone')) ? '+' . str_replace(' ', '', $v) : ''; $code = $request->get_param('code'); $sessionId = $request->get_param('sessionId'); $response = array(); if (!$step) { $response = array( 'success' => false, 'errorCode' => 1, 'errorText' => 'Ошибка! Отсутствует одно или несколько необходимых значений' ); } else { switch ($step) { case 1: #генерация смс-кода / сохранение временно сессии: шаг #1 if (!$phone) { $response = array( 'success' => false, 'errorCode' => 2, 'errorText' => 'Ошибка! Отсутствует одно или несколько необходимых значений' ); } else { session_start(); $secretCode = rand(10, 99).'-'.rand(10, 99); $_SESSION['reg_'.substr(md5($phone), 0, 8)] = array( 'code' => $secretCode, 'phone' => $phone ); #отправка смс-кода, сообщением пользователю на телефон $sendSms = smsSender(array('phone' => $phone, 'secretCode' => $secretCode)); if (!$sendSms['success']) { return new WP_REST_Response($sendSms); } $response = array( 'success' => true, 'sessionId' => session_id() ); } break; case 2: #проверка введенного смс-кода / доступ к следующему шагу регистрации if (!$phone || !$code || !$sessionId) { $response = array( 'success' => false, 'errorCode' => 3, 'errorText' => 'Ошибка! Отсутствует одно или несколько необходимых значений' ); } else { session_id($sessionId); session_start(); $userSession = $_SESSION['reg_'.substr(md5($phone), 0, 8)]; if (!$userSession || !$userSession['code']) { $response = array( 'success' => false, 'errorCode' => 4, 'errorText' => 'Ошибка! Сессия истекла, повторите процедуру регистрации заново' ); } else { if ($userSession['code'] != $code) { // if ($code != '77-77') { $response = array( 'success' => false, 'errorCode' => 5, 'errorText' => 'Ошибка! Вы ввели неверный код из смс сообщения. Пожалуйста, введите корректное значение' ); } else { $coworking = []; if ($items = multiCities()->getCityCoworkingItems()) { foreach ($items as $item) { $coworking[] = (($item->title_alternate2) ? $item->title_alternate2 : (($item->title_alternate) ? $item->title_alternate : $item->post_title)). ' | ID: '.$item->ID; } } $response = array( 'success' => true, 'coworkings' => $coworking ); } } } break; case 3: #все данные пользователя / процедура добавления юзера в базу $data = (isset($_POST['data']) && $_POST['data']) ? json_decode(stripslashes($_POST['data']), true) : array(); if (!isset($data) || !$data || !$data['coworking'] || !$data['firstname'] || !$data['lastname'] || !$data['patronymic'] || !$data['email'] || !$data['phone'] || !$data['password'] || !$data['password2']) { $response = array( 'success' => false, 'errorCode' => 6, 'errorText' => 'Ошибка! Отсутствует одно или несколько необходимых значений' ); } else { #проверка паролей if ($data['password'] != $data['password2']) { return new WP_REST_Response($response = array( 'success' => false, 'errorCode' => 7, 'errorText' => 'Ошибка! Введённые пароли не совпадают между собой. Попробуйте ещё раз' )); } #проверка пользователя на существование в базе if (username_exists($data['email']) || email_exists($data['email'])) { return new WP_REST_Response($response = array( 'success' => false, 'errorCode' => 8, 'errorText' => 'Ошибка! Пользователь с данной электронной почтой уже зарегистрирован' )); } $coworkingId = explode(' | ID: ', $data['coworking'])[1]; $coworkingTitle = get_the_title($coworkingId); $coworkingBtx24Id = get_post($coworkingId)->btx24_id; #добавляем нового пользователя в базу сайта if (!$userId = wp_create_user($data['email'], sanitize_text_field($data['password']), $data['email'])) { return new WP_REST_Response($response = array( 'success' => false, 'errorCode' => 9, 'errorText' => 'Ошибка! Невозможно добавить пользователя в базу сайта. Повторите попытку немного позже' )); } #чистим телефон от лишних знаков $data['phone'] = '+' . str_replace(['+', '-', ' ', '(', ')', '_'], '', $data['phone']); #почта в нижний регистр $data['email'] = strtolower($data['email']); #обновляем данные нового пользователя wp_update_user(array( 'ID' => $userId, 'first_name' => $data['firstname'], 'last_name' => $data['lastname'], 'rich_editing' => false, 'show_admin_bar_front' => 'false', 'role' => 'subscriber', 'display_name' => $data['firstname'].' '.$data['lastname'] )); #обновляем дополнительные данные нового пользователя update_user_meta($userId, 'patronymic', $data['patronymic']); update_user_meta($userId, 'phone', $data['phone']); #проверяем (ищем) пользователя в bitrix24, если есть - получаем ID BTX24 + обновляем поле с WP ID / если нет - добавляем + добавляем новый лид $btx24Data = btx24Helpers([ 'action' => 'check-add-contact', 'data' => [ 'firstname' => $data['firstname'], 'lastname' => $data['lastname'], 'patronymic' => $data['patronymic'], 'phone' => $data['phone'], 'email' => $data['email'], 'userId' => $userId, 'responsibleUserId' => getBtx24ResponsibleUserIdByPostId($coworkingId, 'option'), 'coworkingId' => $coworkingId, 'coworkingBtx24Id' => $coworkingBtx24Id, 'coworkingTitle' => $coworkingTitle, 'currentUrl' => $_SERVER['HTTP_REFERER'] ] ]); if (!$btx24Data['success']) { return new WP_REST_Response($btx24Data); } #записываем btx24ID пользователя update_user_meta($userId, 'btx24_id', $btx24Data['clientId']); if ($btx24Data['clientId']) { #синхронизируемся с битрикс24 syncUserDataBtx24($userId, false); } #синхронизируемся с СКУД syncUserDataSKUD($userId, false); #уведомление админу на почту wp_new_user_notification($userId, null, 'admin'); #уведомление пользователю на почту mailSender(array( 'to' => $data['email'], 'type' => 'user-registration', 'data' => array( 'name' => $data['firstname'].' '.$data['lastname'], 'email' => $data['email'], 'password' => $data['password'] ) )); #авторизуем пользователя nocache_headers(); wp_clear_auth_cookie(); $user = wp_signon(array( 'user_login' => $data['email'], 'user_password' => $data['password'], 'remember' => true ), true); if (is_wp_error($user)) { if (isset($user->errors['incorrect_password']) && $user->errors['incorrect_password']) { return new WP_REST_Response($response = array( 'success' => false, 'errorCode' => 26, 'errorText' => 'Ошибка! Вы ввели неверный логин или пароль. Проверьте данные и повторите попытку еще раз' )); } if (isset($user->errors['invalid_email']) && $user->errors['invalid_email']) { return new WP_REST_Response($response = array( 'success' => false, 'errorCode' => 27, 'errorText' => 'Ошибка! Пользователя с данным логином не существует. Проверьте данные и повторите попытку еще раз' )); } return new WP_REST_Response($response = array( 'success' => false, 'errorCode' => 28, 'errorText' => 'Ошибка! Не удалось авторизоваться, повторите попытку немного позже' )); } $response = array( 'success' => true, 'userId' => $userId ); } break; } } return ($response) ? new WP_REST_Response($response, 200) : false; } )); #авторизация register_rest_route('wp/v2', '/api/profile/authorization/', array( 'methods' => 'POST', 'callback' => function() { $response = array(); $data = (isset($_POST['data']) && $_POST['data']) ? json_decode(stripslashes($_POST['data']), true) : array(); if (!isset($data) || !$data || !$data['login'] || !$data['password']) { return new WP_REST_Response($response = array( 'success' => false, 'errorCode' => 10, 'errorText' => 'Ошибка! Отсутствует одно или несколько необходимых значений' )); } nocache_headers(); wp_clear_auth_cookie(); $user = wp_signon(array( 'user_login' => $data['login'], 'user_password' => $data['password'], 'remember' => (isset($data['remember']) && $data['remember']) ? $data['remember'] : false ), true); if (is_wp_error($user)) { if (isset($user->errors['incorrect_password']) && $user->errors['incorrect_password']) { return new WP_REST_Response($response = array( 'success' => false, 'errorCode' => 11, 'errorText' => 'Ошибка! Вы ввели неверный логин или пароль. Проверьте данные и повторите попытку еще раз' )); } if (isset($user->errors['invalid_email']) && $user->errors['invalid_email']) { return new WP_REST_Response($response = array( 'success' => false, 'errorCode' => 12, 'errorText' => 'Ошибка! Пользователя с данным логином не существует. Проверьте данные и повторите попытку еще раз' )); } return new WP_REST_Response($response = array( 'success' => false, 'errorCode' => 13, 'errorText' => 'Ошибка! Не удалось авторизоваться, повторите попытку немного позже' )); } #синхронизируемся с битрикс24 syncUserDataBtx24($user->ID, false); #синхронизируемся с СКУД syncUserDataSKUD($user->ID, false); $response = array( 'success' => true ); return ($response) ? new WP_REST_Response($response, 200) : false; } )); #восстановление (сброс) пароля register_rest_route('wp/v2', '/api/profile/recovery-password/', array( 'methods' => 'GET', 'callback' => function($request) { $login = sanitize_text_field($request->get_param('login')); $response = array(); if (!$login) { return new WP_REST_Response($response = array( 'success' => false, 'errorCode' => 19, 'errorText' => 'Ошибка! Отсутствует одно или несколько необходимых значений' )); } if (!$user = get_user_by('email', $login)) { return new WP_REST_Response($response = array( 'success' => false, 'errorCode' => 20, 'errorText' => 'Ошибка! Пользователя с данным логином не существует' )); } $new_password = wp_generate_password(); wp_set_password($new_password, $user->ID); #уведомление пользователю на почту mailSender(array( 'to' => $user->user_email, 'type' => 'user-recovery-password', 'data' => array( 'name' => $user->data->display_name, 'email' => $user->user_email, 'password' => $new_password ) )); $response = array( 'success' => true ); return ($response) ? new WP_REST_Response($response, 200) : false; } )); #смена пароля register_rest_route('wp/v2', '/api/profile/change-password/', array( 'methods' => 'POST', 'callback' => function($request) { $response = array(); $data = (isset($_POST['data']) && $_POST['data']) ? json_decode(stripslashes($_POST['data']), true) : array(); if (!isset($data) || !$data || !$data['userId'] || !$data['currentPassword'] || !$data['password1'] || !$data['password2']) { return new WP_REST_Response($response = array( 'success' => false, 'errorCode' => 21, 'errorText' => 'Ошибка! Отсутствует одно или несколько необходимых значений' )); } if (!$user = get_userdata($data['userId'])) { return new WP_REST_Response($response = array( 'success' => false, 'errorCode' => 22, 'errorText' => 'Ошибка! Нет данных о авторизованном пользователе. Войдите на сайт заново и повторите попытку еще раз' )); } if (!$user->data->user_pass) { return new WP_REST_Response($response = array( 'success' => false, 'errorCode' => 23, 'errorText' => 'Ошибка! Нет данных о текущем пароле авторизованого пользователя' )); } if (!wp_check_password($data['currentPassword'], $user->data->user_pass)) { return new WP_REST_Response($response = array( 'success' => false, 'errorCode' => 24, 'errorText' => 'Ошибка! Введённый текущий пароль не соответствует действующему паролю авторизованого пользователя' )); } #проверка паролей if ($data['password1'] != $data['password2']) { return new WP_REST_Response($response = array( 'success' => false, 'errorCode' => 25, 'errorText' => 'Ошибка! Введённые новые пароли не совпадают между собой. Попробуйте ещё раз' )); } #смена пароля wp_set_password($data['password1'], $user->ID); nocache_headers(); wp_clear_auth_cookie(); wp_set_auth_cookie($user->ID); #уведомление пользователю на почту mailSender(array( 'to' => $user->user_email, 'type' => 'user-change-password', 'data' => array( 'name' => $user->display_name, 'email' => $user->user_login, 'password' => $data['password1'] ) )); $response = array( 'success' => true ); return ($response) ? new WP_REST_Response($response, 200) : false; } )); #удаление сотрудника из активной услуги register_rest_route('wp/v2', '/api/profile/remove-employee/', array( 'methods' => 'GET', 'callback' => function($request) { $dealId = sanitize_text_field($request->get_param('dealId')); $contactId = sanitize_text_field($request->get_param('contactId')); $response = array( 'success' => false ); if (!$dealId || !$contactId) { return new WP_REST_Response($response = array( 'success' => false, 'errorCode' => 32, 'errorText' => 'Ошибка! Отсутствует одно или несколько необходимых значений' )); } $webhook_url = get_field('bitrix24_webhook_url', 'option'); $deal = getBitrix24DealByDealId($webhook_url, $dealId); if (!$deal || !$deal['result']) { return new WP_REST_Response($response = array( 'success' => false, 'errorCode' => 33, 'errorText' => 'Ошибка! Нет данных о сделке' )); } if ($deal['result']['CONTACT_ID'] == $contactId) { return new WP_REST_Response($response = array( 'success' => false, 'errorCode' => 34, 'errorText' => 'Ошибка! Нельзя удалять данный контакт с текущей сделки' )); } $removeContactFromDeal = removeBitrix24ContactFromDeal($webhook_url, $dealId, $contactId); if (!$removeContactFromDeal || !$removeContactFromDeal['result']) { return new WP_REST_Response($response = array( 'success' => false, 'errorCode' => 35, 'errorText' => 'Ошибка! Невозможно удалить данный контакт с текущей сделки' )); } $response = array( 'success' => true ); return ($response) ? new WP_REST_Response($response, 200) : false; } )); #добавление сотрудника для активной услуги register_rest_route('wp/v2', '/api/profile/add-employee/', array( 'methods' => 'POST', 'callback' => function() { $response = array( 'success' => false ); $data = (isset($_POST['data']) && $_POST['data']) ? json_decode(stripslashes($_POST['data']), true) : array(); if (!isset($data) || !$data || !$data['dealId'] || !$data['last_name'] || !$data['first_name'] || !$data['second_name'] || !$data['email'] || !$data['phone']) { return new WP_REST_Response($response = array( 'success' => false, 'errorCode' => 36, 'errorText' => 'Ошибка! Отсутствует одно или несколько необходимых значений' )); } $webhook_url = get_field('bitrix24_webhook_url', 'option'); $deal = getBitrix24DealByDealId($webhook_url, $data['dealId']); if (!$deal || !$deal['result']) { return new WP_REST_Response($response = array( 'success' => false, 'errorCode' => 37, 'errorText' => 'Ошибка! Нет данных о сделке' )); } $newContactData = array( 'LAST_NAME' => $data['last_name'], 'NAME' => $data['first_name'], 'SECOND_NAME' => $data['second_name'], 'ASSIGNED_BY_ID' => getBtx24ResponsibleUserIdByPostId(url_to_postid($_SERVER['HTTP_REFERER']), 'option'), #ответственный для нового контакта в bitrix24 'PHONE' => array( array( 'VALUE' => str_replace(array('+', '-', ' ', '(', ')'), '', $data['phone']), 'VALUE_TYPE' => 'MOBILE' ) ), 'EMAIL' => array( array( 'VALUE' => $data['email'], 'VALUE_TYPE' => checkIfEmailIsPrivate($data['email']) ? 'HOME' : 'WORK' ) ) ); $contact = addBitrix24Contact($webhook_url, $newContactData); if (!$contact) { return new WP_REST_Response($response = array( 'success' => false, 'errorCode' => 38, 'errorText' => 'Ошибка! Невозможно добавить новый контакт или получить информацию о существующем' )); } if ($deal['result']['CONTACT_ID'] == $contact) { return new WP_REST_Response($response = array( 'success' => false, 'errorCode' => 39, 'errorText' => 'Ошибка! Нельзя присвоить данный контакт для текущей сделки' )); } $addBitrix24ContactToDeal = addBitrix24ContactToDeal($webhook_url, $data['dealId'], $contact); if (!$addBitrix24ContactToDeal || !$addBitrix24ContactToDeal['result']) { return new WP_REST_Response($response = array( 'success' => false, 'errorCode' => 40, 'errorText' => 'Ошибка! Невозможно присвоить данный контакт для текущей сделки' )); } $response = array( 'success' => true, 'contactId' => $contact ); return ($response) ? new WP_REST_Response($response, 200) : false; } )); #генерация qr кода register_rest_route('wp/v2', '/api/profile/gen-qr/', array( 'methods' => 'GET', 'callback' => function($request) { $string = ($v = $request->get_param('s')) ? sanitize_text_field($v) : ''; if (!$string) { return false; } require_once(dirname(__DIR__, 2) . '/lib/phpqrcode/qrlib.php'); QRcode::png($string, false, 'H', '8px', 0); } )); #получение списка помещений коворкинга register_rest_route('wp/v2', '/api/coworking/spaces', array( 'methods' => 'GET', 'callback' => function($request) { $type = $request->get_param('type'); $date = $request->get_param('date'); $dateFrom = $request->get_param('dateFrom'); $dateTo = $request->get_param('dateTo'); $numberPeople = $request->get_param('numberPeople'); $services = $request->get_param('services'); $coworking = $request->get_param('coworkingId'); $totalCount = 0; $response = array( 'success' => false, 'totalCount' => $totalCount, 'items' => array() ); $taxQuery = array('relation' => 'AND'); $metaQuery = array('relation' => 'AND'); #фильтрация #--- коворкинг if ($coworking) { $metaQuery[] = array( 'key' => 'coworking', 'value' => $coworking ); } #--- тип помещения if ($type) { $taxQuery[] = array( 'taxonomy' => 'coworking-spaces-types', 'field' => 'term_id', 'terms' => $type ); } #--- услуги (дополнительно) if ($services) { $taxQuery[] = array( 'taxonomy' => 'coworking-spaces-services', 'field' => 'term_id', 'terms' => $services ); } #--- кол-во людей if ($numberPeople) { $metaQuery[] = array( 'key' => 'capacity', 'value' => (int)$numberPeople, 'compare' => '>=', 'type' => 'NUMERIC' ); } if ($spaces = get_posts(array( 'post_type' => 'coworking-spaces', 'posts_per_page' => -1, 'tax_query' => $taxQuery, 'meta_query' => $metaQuery ))) { $btx24CalendarEvents = getBtx24CalendarEvents(); #события календаря Bitrix24 foreach ($spaces as $space) { $type = ''; $category = ''; $services = array(); if (!$space->coworking) continue; #забронированные даты / время $bookedDates = []; foreach ($btx24CalendarEvents as $btx24CalendarEvent) { if ($btx24CalendarEvent['id'] == $space->btx24_id) { $bookedDates[] = $btx24CalendarEvent; } } #проверяем нет ли забронированных событий в календаре bitrix24 при фильтрации по времени $isBooking = false; if (($dateFrom || $dateTo) && $bookedDates) { foreach ($bookedDates as $bookedDate) { $filterTimeFrom = ($v = $dateFrom) ? DateTime::createFromFormat('H:i', $v) : ''; $filterTimeTo = ($v = $dateTo) ? DateTime::createFromFormat('H:i', $v) : ''; $bDateFrom = ($v = $bookedDate['date_from']) ? new DateTime($v) : ''; $bDateTo = ($v = $bookedDate['date_to']) ? new DateTime($v) : ''; #если в фильтре выбрана конкретная дата (день) и эта дата равна дате брони if ($date) { if ($date == $bDateFrom->format('d.m.Y')) { $isBooking = checkIfTimeBooking($dateFrom, $dateTo, $bookedDate['date_from'], $bookedDate['date_to']); } } else { #в фильтре выбрано только время, без конкретной даты (без дня) $isBooking = checkIfTimeBooking($dateFrom, $dateTo, $bookedDate['date_from'], $bookedDate['date_to']); } } } if ($isBooking) continue; $mapData = ($v = get_field('contacts_map_position', $space->coworking)) ? json_decode($v) : ''; if (!$response['items'][$space->coworking]) { $priceFrom = array(); $response['items'][$space->coworking] = array( 'coworking' => array( 'id' => (int)$space->coworking, 'title' => ($v = get_field('title_alternate3', $space->coworking)) ? $v : (($v = get_field('title_alternate2', $space->coworking)) ? $v : get_the_title($space->coworking)), 'url' => get_permalink($space->coworking), 'phone' => get_field('contacts_phone', $space->coworking), 'worktime' => get_field('contacts_worktime', $space->coworking), 'address' => get_field('contacts_address', $space->coworking), 'subway_station' => strip_tags(get_field('contacts_routes_title', $space->coworking)), 'subway_station_color' => get_field('contacts_routes_title_color', $space->coworking), 'subItemsCount' => 0, 'priceFrom' => 0, 'hasOnlinePayment' => (get_field('yk_shop_id', $space->coworking) && get_field('yk_secret_key', $space->coworking)) ? true : false, 'geo' => array( 'lat' => ($mapData) ? $mapData->marks[0]->coords[0] : '', 'lng' => ($mapData) ? $mapData->marks[0]->coords[1] : '', 'icon' => get_field('contacts_map_icon', $space->coworking), 'icon_width' => 67, 'icon_height' => 90 ) ), 'subItems' => array() ); } if ($types = wp_get_post_terms($space->ID, 'coworking-spaces-types')) { $type = $types[0]->name; } if ($categories = wp_get_post_terms($space->ID, 'coworking-spaces-categories')) { $category = $categories[0]->name; } if ($servicesItems = wp_get_post_terms($space->ID, 'coworking-spaces-services')) { foreach ($servicesItems as $service) { $services[] = array( 'title' => $service->name, 'icon' => get_field('icon', "coworking-spaces-services_{$service->term_id}") ); } } $discount = ($v = $space->discount) ? (float)$v : 0; $price_weekdays = (int)$space->price_weekdays; $price_weekend = (int)$space->price_weekend; $price_weekdays_with_discount = (int)round(($discount) ? $price_weekdays-($price_weekdays*($discount/100)) : 0); $price_weekend_with_discount = (int)round(($discount) ? $price_weekend-($price_weekend*($discount/100)) : 0); $price_weekdays_pagecoin = (int)$space->price_weekdays_pagecoin; $price_weekend_pagecoin = (int)$space->price_weekend_pagecoin; $price_weekdays_pagecoin_with_discount = (int)round(($discount) ? $price_weekdays_pagecoin-($price_weekdays_pagecoin*($discount/100)) : 0); $price_weekend_pagecoin_with_discount = (int)round(($discount) ? $price_weekend_pagecoin-($price_weekend_pagecoin*($discount/100)) : 0); #записываем все цены, чтобы потом найти минимальную $priceFrom[] = ($price_weekdays_with_discount) ? $price_weekdays_with_discount : $price_weekdays; $priceFrom[] = ($price_weekend_with_discount) ? $price_weekend_with_discount : $price_weekend; $response['items'][$space->coworking]['subItems'][] = array( 'id' => $space->ID, 'resourceId' => ($v = $space->btx24_id) ? (int)$v : '', 'title' => $space->post_title, 'type' => $type, 'category' => $category, 'worktime_from' => ($v = get_field('worktime_from', $space->ID)) ? $v : '09:00', 'worktime_to' => ($v = get_field('worktime_to', $space->ID)) ? $v : '21:00', 'capacity' => (int)$space->capacity, 'price_weekdays' => $price_weekdays, 'price_weekend' => $price_weekend, 'price_weekdays_with_discount' => $price_weekdays_with_discount, 'price_weekend_with_discount' => $price_weekend_with_discount, 'price_weekdays_pagecoin' => $price_weekdays_pagecoin, 'price_weekend_pagecoin' => $price_weekend_pagecoin, 'price_weekdays_pagecoin_with_discount' => $price_weekdays_pagecoin_with_discount, 'price_weekend_pagecoin_with_discount' => $price_weekend_pagecoin_with_discount, 'discount' => $discount, 'bookedDates' => $bookedDates, 'price_desc' => (($v = $space->price_desc) ? $v . '
' : '') . '1 час в будние (пн-пт): ' . (($v = $price_weekdays_with_discount) ? number_format($v*2, 0, ',', ' ') . ' (-'.$discount.'%)' : number_format($price_weekdays*2, 0, ',', ' ')) . ' руб.
1 час в выходные (сб-вс): ' . (($v = $price_weekend_with_discount) ? number_format($v*2, 0, ',', ' ') . ' (-'.$discount.'%)' : number_format($price_weekend*2, 0, ',', ' ')) . ' руб.', 'desc' => $space->desc, 'services' => $services, 'images' => ($v = $space->images) ? array_map(function($e) { return getImageSrcByThumbId($e, '760x530'); }, $v) : array() ); $response['items'][$space->coworking]['coworking']['subItemsCount']++; $response['items'][$space->coworking]['coworking']['priceFrom'] = min($priceFrom); $totalCount++; } } if ($response['items']) { $response['success'] = true; $response['totalCount'] = $totalCount; $response['items'] = array_values($response['items']); } return ($response) ? new WP_REST_Response($response, 200) : false; } )); #сохранение временных данных бронирования помещений коворкингов при переходе в онлайн-оплату register_rest_route('wp/v2', '/api/coworking/spaces/add-tmp-order', array( 'methods' => 'POST', 'callback' => function($request) { $spaceId = sanitize_text_field(($v = $request->get_param('cs_spaceId')) ? $v : ''); $orderData = $request->get_param('cs_order'); $response = []; $error = new WP_Error(); if (empty($spaceId)) { $error->add('spaceId-is-required', 'Space ID field is required', ['status' => 400]); return $error; } if (empty($orderData)) { $error->add('orderData-is-required', 'Order data is required', ['status' => 400]); return $error; } $coworkingId = ($v = get_field('coworking', $spaceId)) ? $v : ''; if (empty($coworkingId)) { $error->add('coworkingId-not-found', 'Coworking ID not found', ['status' => 400]); return $error; } global $wpdb; $wpdb->insert('wp_mrb_orders', [ 'coworkingId' => $coworkingId, 'spaceId' => $spaceId, 'orderData' => $orderData ]); $orderId = $wpdb->insert_id; if (empty($orderId)) { $error->add('orderId-is-empty', 'Order ID is empty', ['status' => 400]); return $error; } $response = [ 'orderId' => $orderId, 'coworkingId' => $coworkingId ]; return new WP_REST_Response($response, 200); } )); #получение данных о забронированном помещении на админской странице register_rest_route('wp/v2', '/api/coworking/spaces/get-booking-item-data', array( 'methods' => 'GET', 'callback' => function($request) { $title = ($v = $request->get_param('title')) ? $v : ''; $dateCreated = ($v = $request->get_param('dateCreated')) ? $v : ''; $response = []; $error = new WP_Error(); $webhook_url = get_field('bitrix24_webhook_url', 'option'); $findBy = ''; $leadId = ''; $dealId = ''; if (empty($dateCreated)) { $error->add('date-created-is-required', 'Date created field is required', ['status' => 400]); return $error; } if (empty($webhook_url)) { $error->add('webhook-is-required', 'Webhook field is required', ['status' => 400]); return $error; } if ($title) { #проверяем есть ли в заголовке ID лида if ($v = explode('[L-', $title)) { if ($v[1] && ($v2 = explode(']', $v[1]))) { if ($v2[0]) { $leadId = $v2[0]; } } } #проверяем есть ли в заголовке ID сделки if ($v = explode('[D-', $title)) { if ($v[1] && ($v2 = explode(']', $v[1]))) { if ($v2[0]) { $dealId = $v2[0]; } } } } if ($leadId || $dealId) { $findBy = 'titleId'; if ($leadId) { $lead = getBitrix24LeadByLeadId($webhook_url, $leadId); $lead['result'][0] = $lead['result']; } if ($dealId) { $deal = getBitrix24DealByDealId($webhook_url, $dealId); $deal['result'][0] = $deal['result']; } } else { $lead = getBitrix24Lead($webhook_url, [ 'filter' => [ 'DATE_CREATE' => $dateCreated ], 'select' => array("*", "UF_*", "PHONE", "EMAIL") ]); $deal = getBitrix24Deal($webhook_url, [ 'filter' => [ 'DATE_CREATE' => $dateCreated ], 'select' => array("*", "UF_*", "PHONE", "EMAIL") ]); $findBy = 'dateCreated'; } #lead if ($lead['result'] && ($lead = $lead['result'][0])) { $contact = getBitrix24Contact($webhook_url, $lead['CONTACT_ID']); $contactData = []; if ($contact && $contact['result']) { $contactData = [ 'firstName' => ($v = $contact['result']['NAME']) ? str_replace(' ', '', $v) : '', 'secondName' => ($v = $contact['result']['SECOND_NAME']) ? str_replace(' ', '', $v) : '', 'lastName' => ($v = $contact['result']['LAST_NAME']) ? str_replace(' ', '', $v) : '', 'phone' => ($v = $contact['result']['PHONE'][0]['VALUE']) ? $v : '', 'email' => ($v = $contact['result']['EMAIL'][0]['VALUE']) ? $v : '' ]; } else { $contactData = [ 'firstName' => ($v = $lead['NAME']) ? str_replace(' ', '', $v) : '', 'secondName' => ($v = $lead['SECOND_NAME']) ? str_replace(' ', '', $v) : '', 'lastName' => ($v = $lead['LAST_NAME']) ? str_replace(' ', '', $v) : '', 'phone' => ($v = $lead['PHONE'][0]['VALUE']) ? $v : '', 'email' => ($v = $lead['EMAIL'][0]['VALUE']) ? $v : '' ]; } $response[] = [ 'id' => (int)$lead['ID'], 'findBy' => $findBy, 'type' => 'lead', 'url' => "https://page.bitrix24.ru/crm/lead/details/{$lead['ID']}/", 'paymentStatus' => ($lead['UF_CRM_1602594511'] == 406 || $lead['STATUS_ID'] == 26) ? true : false, 'price' => ($v = $lead['UF_CRM_1629385174639']) ? (int)$v : 0, 'comment' => ($v = $lead['COMMENTS']) ? $v : '', 'contact' => $contactData ]; } #deal if ($deal['result'] && ($deal = $deal['result'][0])) { $contact = getBitrix24Contact($webhook_url, $deal['CONTACT_ID']); $contactData = []; if ($contact && $contact['result']) { $contactData = [ 'firstName' => ($v = $contact['result']['NAME']) ? str_replace(' ', '', $v) : '', 'secondName' => ($v = $contact['result']['SECOND_NAME']) ? str_replace(' ', '', $v) : '', 'lastName' => ($v = $contact['result']['LAST_NAME']) ? str_replace(' ', '', $v) : '', 'phone' => ($v = $contact['result']['PHONE'][0]['VALUE']) ? $v : '', 'email' => ($v = $contact['result']['EMAIL'][0]['VALUE']) ? $v : '' ]; } else { $contactData = [ 'firstName' => ($v = $deal['NAME']) ? str_replace(' ', '', $v) : '', 'secondName' => ($v = $deal['SECOND_NAME']) ? str_replace(' ', '', $v) : '', 'lastName' => ($v = $deal['LAST_NAME']) ? str_replace(' ', '', $v) : '', 'phone' => ($v = $deal['PHONE'][0]['VALUE']) ? $v : '', 'email' => ($v = $deal['EMAIL'][0]['VALUE']) ? $v : '' ]; } $response[] = [ 'id' => (int)$deal['ID'], 'findBy' => $findBy, 'type' => 'deal', 'url' => "https://page.bitrix24.ru/crm/deal/details/{$deal['ID']}/", 'paymentStatus' => ($deal['UF_CRM_5F85AA083CC81'] == 406 || $deal['STAGE_ID'] == 10 || $deal['STAGE_ID'] == 'WON') ? true : false, 'price' => ($v = $deal['UF_CRM_611E791ED7742']) ? (int)$v : 0, 'comment' => ($v = $deal['COMMENTS']) ? $v : '', 'contact' => $contactData ]; } return ($response) ? new WP_REST_Response($response, 200) : false; } )); #получаем список мессенжеров по id коворкинга register_rest_route('wp/v2', '/api/coworking/messengers/', array( 'methods' => 'GET', 'callback' => function($request) { $id = sanitize_text_field($request->get_param('id')); $error = new WP_Error(); $response = []; if (!$id) { $error->add('id-is-required', 'ID field is required', ['status' => 400]); return $error; } $response = [ 'items' => ($v = get_field('contacts_social_messengers', $id)) ? $v : [] ]; return new WP_REST_Response($response, 200); } )); }); function smsSender($args) { $phoneClear = str_replace(array('(', ')', ' ', '-', '+'), '', $args['phone']); $smsApiId = 'E6F91ECA-25F2-E921-B74C-3A13248CA7A2'; $smsText = urlencode('Проверочный код для регистрации на сайте: '.$args['secretCode']); $sendSms = file_get_contents("https://sms.ru/sms/send?api_id={$smsApiId}&to={$phoneClear}&msg={$smsText}&json=1"); if (!$sendSms) { return array( 'success' => false, 'errorCode' => 14, 'errorText' => 'Ошибка! При попытке отправки смс-сообщения произошла ошибка. Повторите попытку немного позже' ); } if (!$sendSms = json_decode($sendSms)) { return array( 'success' => false, 'errorCode' => 15, 'errorText' => 'Ошибка! При попытке отправки смс-сообщения произошла ошибка. Повторите попытку немного позже' ); } if ($sendSms->status != 'OK') { return array( 'success' => false, 'errorCode' => 16, 'errorText' => 'Ошибка! При попытке отправки смс-сообщения произошла ошибка. Повторите попытку немного позже' ); } return array( 'success' => true ); } function mailSender($args) { $subject = 'PAGECLUB.RU | '; $message = ''; switch ($args['type']) { case 'user-registration': $subject .= 'Добро пожаловать на сайт. Ваши данные для входа на сайт'; $message = "

Здравствуйте, {$args['data']['name']}!
Спасибо, что присоединились к PAGECLUB.RU!

Данные для доступа в личный кабинет:

Логин (электронная почта): {$args['data']['email']}
Пароль: {$args['data']['password']}

Надеемся вам у нас понравится!

"; break; case 'user-recovery-password': $subject .= 'Сброс пароля от аккаунта на сайте: pageclub.ru'; $message = "

Здравствуйте, {$args['data']['name']}!
На вашем аккаунте произошел сброс (восстановление) пароля

Новые данные для доступа в личный кабинет:

Логин (электронная почта): {$args['data']['email']}
Пароль: {$args['data']['password']}

Если вам не нравится сгенерированный пароль, вы его можете сменить самостоятельно в личном кабинете
В случае если сброс пароля выполнили не вы - сообщите нам об этом!

"; break; case 'user-change-password': $subject .= 'Смена пароля от аккаунта на сайте: pageclub.ru'; $message = "

Здравствуйте, {$args['data']['name']}!
На вашем аккаунте произошла смена пароля

Новые данные для доступа в личный кабинет:

Логин (электронная почта): {$args['data']['email']}
Пароль: {$args['data']['password']}

В случае если смену пароля выполнили не вы - сообщите нам об этом!

"; break; } $headers = array( 'From: '.$_SERVER['SERVER_NAME'].' ', 'content-type: text/html' ); wp_mail($args['to'], $subject, $message, $headers); } function btx24Helpers($args) { $response = array(); $webhook_url = get_field('bitrix24_webhook_url', 'option'); if (!$webhook_url) { return array( 'success' => false, 'errorCode' => 17, 'errorText' => 'Ошибка! При попытке соединения с bitrix24 произошла ошибка (отсутствует: webhook_url)' ); } switch ($args['action']) { case 'check-add-contact': if (isset($args['data']['phone']) && $args['data']['phone']) { $args['data']['phone'] = '+' . str_replace(['+', '-', ' ', '(', ')', '_'], '', $args['data']['phone']); } if (isset($args['data']['email']) && $args['data']['email']) { $args['data']['email'] = strtolower($args['data']['email']); } $data = array( 'LAST_NAME' => $args['data']['lastname'], 'NAME' => $args['data']['firstname'], 'SECOND_NAME' => $args['data']['patronymic'], 'UF_CRM_1607618762' => $args['data']['userId'], 'ASSIGNED_BY_ID' => $args['data']['responsibleUserId'], 'PHONE' => array( array( 'VALUE' => $args['data']['phone'], 'VALUE_TYPE' => 'MOBILE' ) ), 'EMAIL' => array( array( 'VALUE' => $args['data']['email'], 'VALUE_TYPE' => checkIfEmailIsPrivate($args['data']['email']) ? 'HOME' : 'WORK' ) ) ); if (!$clientId = addBitrix24Contact($webhook_url, $data)) { return array( 'success' => false, 'errorCode' => 18, 'errorText' => 'Ошибка! При попытке проверки / добавления контакта в bitrix24 произошла ошибка' ); } #обновляем контакт (нужно на случай если контакт ранее существовал, но в нём не было WP ID юзера) updateBitrix24Contact($webhook_url, array( 'UF_CRM_1607618762' => $args['data']['userId'] ), $clientId); #добавляем запись в ленту контакта addBitrix24TimelinePost($webhook_url, array( "ENTITY_ID" => $clientId, "ENTITY_TYPE" => "contact", "COMMENT" => 'Контакт создал личный кабинет на сайте pageclub.ru. Данному контакту присвоен WP ID пользователя: '.$args['data']['userId'] )); #ищем существующие лиды $whatToDoWithLead = whatToDoWithLead([ 'phone' => $args['data']['phone'], 'email' => $args['data']['email'], 'coworkingIdWp' => $args['data']['coworkingId'], 'currentType' => 'profile' ]); $leadBtx24data = [ 'TITLE' => "{$args['data']['lastname']} {$args['data']['firstname']} {$args['data']['patronymic']} | Санкт-Петербург", 'SOURCE_DESCRIPTION' => "{$args['data']['lastname']} {$args['data']['firstname']} {$args['data']['patronymic']} | Санкт-Петербург", 'STATUS_ID' => 19, 'SOURCE_ID' => 2, 'roistat' => $_COOKIE['roistat_visit'], 'ROISTAT' => $_COOKIE['roistat_visit'], 'LAST_NAME' => $args['data']['lastname'], 'NAME' => $args['data']['firstname'], 'SECOND_NAME' => $args['data']['patronymic'], 'ASSIGNED_BY_ID' => $args['data']['responsibleUserId'], 'PHONE' => array( array( 'VALUE' => $args['data']['phone'], 'VALUE_TYPE' => 'MOBILE' ) ), 'EMAIL' => array( array( 'VALUE' => $args['data']['email'], 'VALUE_TYPE' => checkIfEmailIsPrivate($args['data']['email']) ? 'HOME' : 'WORK' ) ), 'UF_CRM_1602667276' => [$args['data']['coworkingBtx24Id']], 'UF_CRM_1591064988' => [coworkingFieldReplacer($args['data']['coworkingBtx24Id'])['lead']], 'UF_CRM_1599307433' => $args['data']['currentUrl'] ]; if ($whatToDoWithLead && $whatToDoWithLead['action']) { switch ($whatToDoWithLead['action']) { case 'add': $leadId = addBitrix24Lead($webhook_url, $leadBtx24data); break; case 'update': $leadId['result'] = $whatToDoWithLead['id']; clearLead($leadId['result']); updateBitrix24Lead($webhook_url, [ 'id' => $leadId['result'], 'fields' => $leadBtx24data ], false); break; } } else { $leadId = addBitrix24Lead($webhook_url, $leadBtx24data); } $timeLineMessage = "Контакт создал личный кабинет на сайте pageclub.ru. \nДанному контакту присвоен WP ID пользователя: {$args['data']['userId']}"; if ($args['data']['coworkingTitle']) { $timeLineMessage .= "\nКоворкинг: {$args['data']['coworkingTitle']}"; } if ($args['data']['currentUrl']) { $timeLineMessage .= "\nОтправлено со страницы: {$args['data']['currentUrl']}"; } #добавляем новый пост в таймлайн лида addBitrix24TimelinePost($webhook_url, array( "ENTITY_ID" => $leadId['result'], "ENTITY_TYPE" => "lead", "COMMENT" => $timeLineMessage )); $response = array( 'success' => true, 'clientId' => $clientId ); break; case 'sync-user-data': $response['data'] = array(); if ($args['userBtx24Id']) { if ($contact = getBitrix24Contact($webhook_url, $args['userBtx24Id'])) { if ($contact['result']) { #contact data $response['data']['contact'] = array( 'id' => $contact['result']['ID'], 'last_name' => $contact['result']['LAST_NAME'], 'first_name' => $contact['result']['NAME'], 'patronymic' => $contact['result']['SECOND_NAME'], 'phone' => $contact['result']['PHONE'][0]['VALUE'], 'email' => $contact['result']['EMAIL'][0]['VALUE'], 'pageCoinBalance' => ($v = $contact['result']['UF_CRM_1624867498']) ? (int)$v : 0, 'pageCoinExpirationDate' => ($v = $contact['result']['UF_CRM_1628849631']) ? $v : '' ); #company data if ($contact['result']['COMPANY_ID']) { if ($company = getBitrix24Company($webhook_url, $contact['result']['COMPANY_ID'])) { if ($company['result']['ID']) { $response['data']['company']['id'] = $company['result']['ID']; $response['data']['company']['title'] = $company['result']['TITLE']; if ($requisites = getBitrix24RequisiteByCompanyId($webhook_url, $company['result']['ID'])) { if ($requisites['result'][0]['ID']) { if ($requisites['result'][0]['RQ_COMPANY_NAME']) { $response['data']['company']['title'] = $requisites['result'][0]['RQ_COMPANY_NAME']; } $response['data']['company']['inn'] = $requisites['result'][0]['RQ_INN']; $response['data']['company']['ogrn'] = $requisites['result'][0]['RQ_OGRN']; $response['data']['company']['kpp'] = $requisites['result'][0]['RQ_KPP']; $response['data']['company']['director'] = $requisites['result'][0]['RQ_DIRECTOR']; if ($address = getBitrix24AddressByRequisiteId($webhook_url, $requisites['result'][0]['ID'])) { if ($address['result'][0]) { if ($address['result'][0]['POSTAL_CODE']) { $response['data']['company']['address']['postal_code'] = $address['result'][0]['POSTAL_CODE']; } if ($address['result'][0]['COUNTRY']) { $response['data']['company']['address']['country'] = $address['result'][0]['COUNTRY']; } if ($address['result'][0]['CITY']) { $response['data']['company']['address']['city'] = $address['result'][0]['CITY']; } if ($address['result'][0]['ADDRESS_1']) { $response['data']['company']['address']['address1'] = $address['result'][0]['ADDRESS_1']; } if ($address['result'][0]['ADDRESS_2']) { $response['data']['company']['address']['address2'] = $address['result'][0]['ADDRESS_2']; } } } } } } } } } } $response['success'] = true; } break; case 'update-skud-data': $response['data'] = array(); if ($args['userBtx24Id'] && $args['data']['userSkudId']) { #обновляем данные о СКУД внутри контакта битрикса updateBitrix24Contact($webhook_url, array( 'UF_CRM_1617374626' => $args['data']['userSkudId'] ), $args['userBtx24Id']); $response['success'] = true; } break; } return $response; } #синхронизация данных между сайтом и битрикс24 function syncUserDataBtx24($wpUserId, $withTimeControl = true) { if (!$wpUserId) { return false; } if (!$user = get_user_by('id', $wpUserId)) { return false; } if (!$user->btx24_id) { return false; } //обновление данных 1 раз в 1 час if (get_field('btx24_last_sync', 'user_'.$wpUserId) && $withTimeControl && getDatesDiffInMinutes(get_field('btx24_last_sync', 'user_'.$wpUserId), date("d.m.Y H:i:s")) < 60) { return false; } $data = btx24Helpers(array( 'action' => 'sync-user-data', 'userBtx24Id' => $user->btx24_id )); #записываем данные bitrix24 в базу сайта WP if ($data['data']) { #данные о контакте if ($data['data']['contact']) { $updateUserData = array( 'ID' => $wpUserId ); if ($data['data']['contact']['first_name']) { $updateUserData['first_name'] = $data['data']['contact']['first_name']; } if ($data['data']['contact']['last_name']) { $updateUserData['last_name'] = $data['data']['contact']['last_name']; } if ($data['data']['contact']['first_name'] && $data['data']['contact']['last_name']) { $updateUserData['display_name'] = $data['data']['contact']['first_name'].' '.$data['data']['contact']['last_name']; } if ($data['data']['contact']['email']) { $updateUserData['user_email'] = $data['data']['contact']['email']; $updateUserData['nickname'] = $data['data']['contact']['email']; } wp_update_user($updateUserData); if ($data['data']['contact']['patronymic']) { update_user_meta($wpUserId, 'patronymic', $data['data']['contact']['patronymic']); } if ($data['data']['contact']['phone']) { update_user_meta($wpUserId, 'phone', $data['data']['contact']['phone']); } $pageCoinExpirationDate = (isset($data['data']['contact']['pageCoinExpirationDate']) && $data['data']['contact']['pageCoinExpirationDate']) ? new DateTime($data['data']['contact']['pageCoinExpirationDate'], new DateTimeZone('UTC')) : ''; #проверяем дату истечения монет, если дата истекла - обнуляем if ($pageCoinExpirationDate) { if (time() > $pageCoinExpirationDate->format('U')) { #дата активности монет истекла #обновляем контакт в BTX24 (очищам поля с монетами / датой) updateBitrix24Contact($webhook_url, array( 'UF_CRM_1624867498' => 0, 'UF_CRM_1628849631' => '' ), $user->btx24_id); $data['data']['contact']['pageCoinBalance'] = 0; $data['data']['contact']['pageCoinExpirationDate'] = ''; } } update_user_meta($wpUserId, 'btx24_pagecoin_balance', $data['data']['contact']['pageCoinBalance']); update_user_meta($wpUserId, 'btx24_pagecoin_expiration_date', ($pageCoinExpirationDate) ? $pageCoinExpirationDate->format('d.m.Y H:i:s') : ''); } #данные о компании if ($data['data']['company']) { update_user_meta($wpUserId, 'btx24_company_id', $data['data']['company']['id']); update_user_meta($wpUserId, 'btx24_company_name', $data['data']['company']['title']); update_user_meta($wpUserId, 'btx24_company_inn', $data['data']['company']['inn']); update_user_meta($wpUserId, 'btx24_company_ogrn', $data['data']['company']['ogrn']); update_user_meta($wpUserId, 'btx24_company_kpp', $data['data']['company']['kpp']); update_user_meta($wpUserId, 'btx24_company_director', $data['data']['company']['director']); update_user_meta($wpUserId, 'btx24_company_postal_code', $data['data']['company']['address']['postal_code']); update_user_meta($wpUserId, 'btx24_company_country', $data['data']['company']['address']['country']); update_user_meta($wpUserId, 'btx24_company_city', $data['data']['company']['address']['city']); update_user_meta($wpUserId, 'btx24_company_address1', $data['data']['company']['address']['address1']); update_user_meta($wpUserId, 'btx24_company_address2', $data['data']['company']['address']['address2']); } else { #очищаем данные о компании update_user_meta($wpUserId, 'btx24_company_id', ''); update_user_meta($wpUserId, 'btx24_company_name', ''); update_user_meta($wpUserId, 'btx24_company_inn', ''); update_user_meta($wpUserId, 'btx24_company_ogrn', ''); update_user_meta($wpUserId, 'btx24_company_kpp', ''); update_user_meta($wpUserId, 'btx24_company_director', ''); update_user_meta($wpUserId, 'btx24_company_postal_code', ''); update_user_meta($wpUserId, 'btx24_company_country', ''); update_user_meta($wpUserId, 'btx24_company_city', ''); update_user_meta($wpUserId, 'btx24_company_address1', ''); update_user_meta($wpUserId, 'btx24_company_address2', ''); } #записываем дату синхронизации update_user_meta($wpUserId, 'btx24_last_sync', date('d.m.Y H:i:s')); } return array( 'success' => true ); } #синхронизация данных между сайтом и СКУД function syncUserDataSKUD($wpUserId, $withTimeControl = true) { if (!$wpUserId) { return false; } if (!$user = get_user_by('id', $wpUserId)) { return false; } //обновление данных 1 раз в 1 час if (get_field('skud_last_sync', 'user_'.$wpUserId) && $withTimeControl && getDatesDiffInMinutes(get_field('skud_last_sync', 'user_'.$wpUserId), date("d.m.Y H:i:s")) < 60) { return false; } require_once(dirname(__DIR__, 2) . '/lib/orionPro/orionProConnector.php'); $orionProConnector = new orionProConnector(); if ($orionProConnector->checkConnection()) { return; } $needToAdd = false; #проверка на то есть ли СКУД ID в базе WP if (!$user->skud_id) { $needToAdd = true; } else { #если ID СКУД в базе WP есть - проверяем существует ли юзер в базе СКУД $checkSkudUser = $orionProConnector->getPersonById(array( 'id' => $user->skud_id )); if (!$checkSkudUser || !$checkSkudUser->Id) { $needToAdd = true; } } $skudUserData = array( 'LastName' => $user->last_name, 'FirstName' => $user->first_name, 'MiddleName' => $user->patronymic, 'EmailList' => $user->user_email, 'Phone' => $user->phone, 'DepartmentId' => 1, 'Status' => 5, 'AccessLevelId' => 0, 'BirthDate' => '1899-12-30T00:00:00.000+03:00', 'DocumentIssueDate' => '1899-12-30T00:00:00.000+03:00', 'DocumentEndingDate' => '1899-12-30T00:00:00.000+03:00' ); #добавляем пользователя WP в базу СКУД if ($needToAdd) { $newUser = $orionProConnector->addPerson($skudUserData); if ($newUser && isset($newUser->Success) && $newUser->Success == true) { update_user_meta($wpUserId, 'skud_id', $newUser->OperationResult->Id); $user->skud_id = $newUser->OperationResult->Id; } } #обновляем данные пользователя $skudUserData['Id'] = $user->skud_id; $upd = $orionProConnector->updatePerson($skudUserData); #добавляем / обновляем skudId в базе BTX24 btx24Helpers(array( 'action' => 'update-skud-data', 'userBtx24Id' => $user->btx24_id, 'data' => array( 'userSkudId' => $user->skud_id ) )); if ($user->skud_id) { #добавляем / обновляем произвольные поля пользователя $orionProConnector->addPersonCustomFields($user->skud_id, array('Id' => 1, 'Name' => 'wpID', 'Value' => $wpUserId)); $orionProConnector->addPersonCustomFields($user->skud_id, array('Id' => 2, 'Name' => 'btx24ID', 'Value' => $user->btx24_id)); #добавляем новый ключ пользователя в СКУД checkGetSKUDCode($wpUserId); } #записываем дату синхронизации update_user_meta($wpUserId, 'skud_last_sync', date('d.m.Y H:i:s')); return array( 'success' => true ); } function checkGetSKUDCode($userWpId, $action = 'empty', $comment = '') { $needToCreateNewKey = false; $response = array(); if (!$userWpId) { return false; } if (!$user = get_user_by('id', $userWpId)) { return false; } require_once(dirname(__DIR__, 2) . '/lib/orionPro/orionProConnector.php'); $orionProConnector = new orionProConnector(); if ($orionProConnector->checkConnection()) { return; } $code = rand(11111111, 9999999); $codeTM = $orionProConnector->convertToTM($code)['result']; $keyData = array( 'PersonId' => $user->skud_id, 'Code' => $codeTM, 'AccessLevelId' => 0, 'StartDate' => time(), 'EndDate' => time(), 'Comment' => 'CODE FROM PAGECLUB.RU (FROM SITE) | EMPTY KEY' ); $response['success'] = true; #проверяем существование ключа пользователя в СКУДе if ($user->skud_key_id && $user->skud_key_code) { $key = $orionProConnector->getKey($user->skud_key_code); if (!$key->OperationResult) { $needToCreateNewKey = true; } } else { $needToCreateNewKey = true; } #добавляем новый ключ пользователя в СКУД if ($needToCreateNewKey && $user->skud_id) { $key = $orionProConnector->addKey($keyData); if ($key && isset($key->Success) && $key->Success == true && $key->OperationResult) { $user->skud_key_id = $key->OperationResult->Id; $user->skud_key_code = $key->OperationResult->Code; #записываем в базу WP данные о СКУД ключе if ($key->OperationResult->Id && $key->OperationResult->Code) { update_user_meta($userWpId, 'skud_key_id', $key->OperationResult->Id); update_user_meta($userWpId, 'skud_key_code', $key->OperationResult->Code); } $response = array( 'success' => true, 'type' => 'new', 'codeQr' => $code, 'codeTM' => $codeTM ); } } #обновляем существующий ключ if ($action == 'working' && $user->skud_id && $user->skud_key_id) { $keyData['Id'] = $user->skud_key_id; $keyData['AccessLevelId'] = 13; $keyData['EndDate'] = strtotime("+2 minutes", time()); $keyData['Comment'] = 'CODE FROM PAGECLUB.RU (FROM SITE) | QR CODE: ' . $code . (($comment) ? ' | ' . $comment : ''); $key = $orionProConnector->updateKey($keyData); if ($key && isset($key->Success) && $key->Success == true && $key->OperationResult) { #записываем в базу WP данные о СКУД ключе if ($key->OperationResult->Id && $key->OperationResult->Code) { update_user_meta($userWpId, 'skud_key_id', $key->OperationResult->Id); update_user_meta($userWpId, 'skud_key_code', $key->OperationResult->Code); } $response = array( 'success' => true, 'type' => 'updated', 'codeQr' => $code, 'codeTM' => $codeTM ); } } #записываем дату синхронизации update_user_meta($userWpId, 'skud_last_sync', date('d.m.Y H:i:s')); return $response; } function getDatesDiffInMinutes($date1, $date2) { $date1 = new DateTime($date1); $diff = $date1->diff(new DateTime($date2)); $result = $diff->days * 24 * 60; $result += $diff->h * 60; $result += $diff->i; return $result; } #список событий календаря в Bitrix24 function getBtx24CalendarEvents() { $results = []; $webhook_url = get_field('bitrix24_webhook_url', 'option'); #получаем список всех существующих ресурсов if (!$resources = getBitrix24CalendarResourceList($webhook_url)) return; if (!$resources['result'] || !count($resources['result']) || !count(array_column($resources['result'], 'ID'))) return; #получаем список событий календаря if (!$events = getBitrix24CalendarResourceBookingList($webhook_url, [ 'filter' => [ 'resourceTypeIdList' => array_column($resources['result'], 'ID'), 'from' => date('Y-m-d'), 'to' => date(date('Y')+1 . '-m-d') ] ])) return; if (!$events['result'] || !count($events['result'])) return; foreach ($events['result'] as $item) { $results[] = [ 'id' => (int)$item['SECTION_ID'], 'idEvent' => (int)$item['ID'], 'name' => $item['NAME'], 'dateCreated' => $item['DATE_CREATE'], 'date_from' => $item['DATE_FROM'], 'date_to' => $item['DATE_TO'], 'date_length' => (int)$item['DT_LENGTH'], 'date_length_text' => timeToStrDurationConverter((int)$item['DT_LENGTH']), 'type' => 'deal' ]; } return $results; } #проверка подпадают ли забронированные даты под условия фильтра function checkIfTimeBooking($fTimeFrom, $fTimeTo, $bTimeFrom, $bTimeTo) { $isBooking = false; $fTimeFrom = ($v = $fTimeFrom) ? DateTime::createFromFormat('H:i', $v) : ''; $fTimeTo = ($v = $fTimeTo) ? DateTime::createFromFormat('H:i', $v) : ''; $bTimeFrom = ($v = $bTimeFrom) ? new DateTime($v) : ''; $bTimeTo = ($v = $bTimeTo) ? new DateTime($v) : ''; if ($fTimeFrom && (strtotime($fTimeFrom->format('H:i')) >= strtotime($bTimeFrom->format('H:i')) && strtotime($fTimeFrom->format('H:i')) < strtotime($bTimeTo->format('H:i')))) { $isBooking = true; } if ($fTimeTo && (strtotime($fTimeTo->format('H:i')) > strtotime($bTimeFrom->format('H:i')) && strtotime($fTimeTo->format('H:i')) < strtotime($bTimeTo->format('H:i')))) { $isBooking = true; } if (($fTimeFrom && $fTimeTo) && (strtotime($fTimeFrom->format('H:i')) >= strtotime($bTimeFrom->format('H:i')) || strtotime($fTimeTo->format('H:i')) >= strtotime($bTimeTo->format('H:i')))) { $isBooking = true; } return $isBooking; } ?> 'Основное меню (Общее для всех городов)', 'coworking_menu' => 'Коворкинг-меню (общее для всех коворкингов)', 'franchise_menu' => 'Меню на странице: Франшиза' )); } add_action('init', 'register_my_menus'); //wp-admin-bar снизу if (is_user_logged_in() && !current_user_can('subscriber')) { //fix wpadminbar margin function remove_admin_login_header() { remove_action('wp_head', '_admin_bar_bump_cb'); } add_action('get_header', 'remove_admin_login_header'); /* * Отключение стандартных CSS в HTML-коде */ function my_filter_head() { remove_action('wp_head', '_admin_bar_bump_cb'); } add_action('get_header', 'my_filter_head'); /* * CSS для прилепления админки к нижнему краю страницы */ function true_move_admin_bar() { echo ' '; } //add_action( 'admin_head', 'true_move_admin_bar' ); // в админке add_action( 'wp_head', 'true_move_admin_bar' ); // на сайте } // поддержка миниатюр add_theme_support('post-thumbnails'); //миниатюра в списке постов add_filter('manage_posts_columns', 'kolonki_zapisei', 5); add_action('manage_posts_custom_column', 'posts_custom_columns', 5, 2); function kolonki_zapisei($po_umolchaniu) { $po_umolchaniu['miniaturi_postov'] = 'Миниатюра'; return $po_umolchaniu; } function posts_custom_columns($imya_kolonki, $id) { if ($imya_kolonki === 'miniaturi_postov'): print '
'; endif; } //удаляем WP мусор remove_action( 'wp_head', 'wp_shortlink_wp_head', 10, 0 ); remove_action( 'wp_head', 'wp_generator' ); remove_action( 'wp_head', 'wlwmanifest_link' ); remove_action( 'wp_head', 'index_rel_link' ); remove_action( 'wp_head', 'parent_post_rel_link', 10, 0 ); remove_action( 'wp_head', 'start_post_rel_link', 10, 0 ); remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0); remove_action( 'wp_head', 'wlwmanifest_link' ); //фиксим циклические ссылки WP Menu function no_link_current_page($p) { return preg_replace( '%((current_page_item|current-menu-item)[^<]+)[^>]+>([^<]+)%', '$1$3', $p, 1 ); } add_filter('wp_nav_menu', 'no_link_current_page'); //get image src by thumbId function getImageSrcByThumbId($thumbId, $size) { $image = wp_get_attachment_image_src($thumbId, $size); return $image[0]; } //get image src by postId function getImageSrcByPostId($postId, $size) { $image = wp_get_attachment_image_src(get_post_thumbnail_id($postId), $size); return $image[0]; } //склонение падежа числа function NumberEnd($number, $titles) { $cases = array (2, 0, 1, 1, 1, 2); return $titles[ ($number%100>4 && $number%100<20)? 2 : $cases[min($number%10, 5)] ]; } #получаем автозаполнение для полей (для авторизованных пользователей) function getDefaultInputValues() { $values = []; if (is_user_logged_in()) { $user = profile_user(); $values = [ 'last_name' => ($v = $user->user_lastname) ? $v : '', 'first_name' => ($v = $user->user_firstname) ? $v : '', 'second_name' => ($v = $user->patronymic) ? $v : '', 'name' => (($v = $user->user_lastname) ? "{$v} " : '') . (($v = $user->user_firstname) ? "{$v} " : '') . (($v = $user->patronymic) ? $v : ''), 'phone' => ($v = $user->phone) ? $v : '', 'email' => ($v = $user->user_email) ? $v : '' ]; } return $values; } function modalLink($modal, $currentCoworkingId = '') { $modalDataHtml = ''; $modalData = array( 'title' => $modal['modal_title'], 'desc' => $modal['modal_desc'], 'type' => $modal['modal_type'], 'form-subject' => $modal['modal_form_cbform']['cbform_subject'], 'client-notifications' => $modal['modal_form_cbform']['cbform_client_notifications'], 'button-text' => $modal['modal_form_cbform']['cbform_btn_text'] ); if (($modal['modal_type'] == 'form-type-1' || $modal['modal_type'] == 'form-type-2' || $modal['modal_type'] == 'form-type-3') && !is_fr()) { $coworking = array(); if ($items = multiCities()->getCityCoworkingItems()) { foreach ($items as $item) { $coworking[] = (($item->title_alternate2) ? $item->title_alternate2 : (($item->title_alternate) ? $item->title_alternate : $item->post_title)). ' | ID: '.$item->ID; } } $modalData['coworking'] = ($coworking) ? htmlspecialchars(json_encode($coworking)) : ''; if ($currentCoworkingId) { $modalData['coworking-selected'] = $currentCoworkingId; } } if ($modal['modal_type'] == 'form-type-5') { $modalData['desc-2'] = ($modal['modal_desc2']) ? $modal['modal_desc2'] : ''; $modalData['image'] = ($modal['modal_image']) ? $modal['modal_image'] : ''; } if (is_fr()) { $modalData['messengers-franchise'] = '1'; } foreach ($modalData as $key => $value) { if ($value) { $modalDataHtml .= 'data-modal-'.$key.'="'.$value.'" '; } } return $modalDataHtml; } function bData($bPrefix, $type, $from = '') { $bData = array( 'title' => get_field($bPrefix.'_block_title', $from), 'subtitle' => get_field($bPrefix.'_block_sub_title', $from), 'anchor' => get_field($bPrefix.'_block_anchor', $from) ); switch ($type) { case 1: if (!get_field($bPrefix.'_block_status', $from) || (!$items = get_field($bPrefix.'_items', $from))) { return false; } else { $bData['items'] = $items; return $bData; } break; default: if (!get_field($bPrefix.'_block_status', $from)) { return false; } else { return $bData; } break; } } function getYoutubeIdByUrl($url) { preg_match('%(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})%i', $url, $match); return $match[1]; } function getRutubeVideoIdByUrl($url) { // Регулярное выражение для извлечения id видео Rutube if(preg_match('/https?:\/\/(www\.)?(rutube.ru)\/(video\/([a-zA-Z0-9]{32}))/', $url, $matches)) { return isset($matches[3]) ? $matches[3] : null; } return null; } #изменяем качество загружаемых через админку изображений add_filter('jpeg_quality', function($arg) {return 100;}); function gpsiChecker() { return (preg_match('/nux.*oto\sG|x11.*fox\/54|x11.*ome\/39|x11.*ome\/62|oid\s6.*1.*xus\s5.*MRA58N.*ome|JWR66Y.*ome\/62|woobot|speed|ighth|tmetr|eadle/i', $_SERVER['HTTP_USER_AGENT'])) ? true : false; } #добавляем класс scrolled к пунктам меню у которых включена опция прокрутки к якорю при клике add_filter('nav_menu_css_class', 'addScrolledClassToMenuItems', 10, 4); function addScrolledClassToMenuItems($classes, $item, $args, $depth) { if (isset($item->hide_on_page) && $item->hide_on_page) { global $post; if (in_array($post->ID, $item->hide_on_page)) { $classes[] = 'disabled'; } } if ($item->scrolled_item) { $classes[] = 'scrolled'; } return $classes; } #ответственный для bitrix24 (поиск по ID поста / страницы) function getBtx24ResponsibleUserIdByPostId($postId, $from) { $btx24ResponsibleUserId = ''; #ищем ID страницы в списке всех ответственных по страницам if ($assignedForPage = get_field('bitrix24_assigned', $from)) { $idPos = array_search($postId, array_column($assignedForPage, 'page')); if ($idPos !== false) { #присваиваем ID ответственного для данной страницы if ($assignedForPage[$idPos]['items']) { $responsibleUserIds = $assignedForPage[$idPos]['items']; foreach ($responsibleUserIds as $key => $value) { $responsibleUserIdsTmpArray[] = $value['counter']; } $responsibleUserIdKey = array_search(min($responsibleUserIdsTmpArray), $responsibleUserIdsTmpArray); update_sub_field(array('bitrix24_assigned_'.$idPos.'_items', $responsibleUserIdKey+1, 'counter'), $responsibleUserIds[$responsibleUserIdKey]['counter']+1, $from); $btx24ResponsibleUserId = $responsibleUserIds[$responsibleUserIdKey]['id']; } } } #присваиваем ID ответственного (общий или для конкретной страницы) #для конкретной страницы if (!isset($btx24ResponsibleUserId) || !$btx24ResponsibleUserId) { #общий $responsibleUserIds = get_field('bitrix24_assigned_all_pages', $from); foreach ($responsibleUserIds as $key => $value) { $responsibleUserIdsTmpArray[] = $value['counter']; } $responsibleUserIdKey = array_search(min($responsibleUserIdsTmpArray), $responsibleUserIdsTmpArray); update_sub_field(array('bitrix24_assigned_all_pages', $responsibleUserIdKey+1, 'counter'), $responsibleUserIds[$responsibleUserIdKey]['counter']+1, $from); $btx24ResponsibleUserId = $responsibleUserIds[$responsibleUserIdKey]['id']; } return $btx24ResponsibleUserId; } #преобразовывает кол-во секунд в текстовый вид function timeToStrDurationConverter($duration) { $durationM = $duration / 60; #продолжительность в минутах $hours = floor($durationM / 60); $minutes = $durationM % 60; $minutes = ($minutes == 0) ? '00' : $minutes; return ($durationM == 30) ? '0 часов 30 минут' : "{$hours} час".NumberEnd($hours, ['', 'а', 'ов'])." {$minutes} минут"; } #получает один любой коворкинг #в котором есть активная купленная услуга function getFirstCoworkingWithActiveServices($btx24UserId) { if (!$btx24UserId) { return false; } $webhook_url = get_field('bitrix24_webhook_url', 'option'); $firstCoworkingId = ''; if ($firstCoworkingId) { return $firstCoworkingId; } if (!$deals = getBitrix24DealByContactId($webhook_url, $btx24UserId)) { return false; } if (!$deals['result']) { return false; } foreach ($deals['result'] as $deal) { if ($firstCoworkingId) { return $firstCoworkingId; } if (!$deal['ID'] || !$deal['UF_CRM_1603648291'] || (date('d.m.Y') < date('d.m.Y', strtotime($deal['UF_CRM_1603648291']))) || (!$products = getBitrix24DealProductsByDealId($webhook_url, $deal['ID']))) { continue; } if (!$products['result']) { continue; } foreach ($products['result'] as $product) { if ($firstCoworkingId) { return $firstCoworkingId; } if (!$productData = getBitrix24ProductById($webhook_url, $product['PRODUCT_ID'])) { continue; } if (!$productData['result']['PROPERTY_108']['value']) { continue; } $firstCoworkingId = $productData['result']['PROPERTY_108']['value']; } } return $firstCoworkingId; } #проверка на то является ли дата выходным function isWeekend($date) { return (date('N', strtotime($date)) >= 6); } #добавляем произвольную роль пользователя add_role('manager-btx24', 'Менеджер BTX24', [ 'level_0' => true ]); function btx24LeadStatuses($status = '') { if (!$status) { return false; } $items = [ 'NEW' => [ 'leadAction' => [ 'payment' => 'update', 'mrb' => 'update', 'profile' => 'update', 'cbform' => 'update' ], 'dealAction' => 'add', 'desc' => 'Новый лид / Не обработан' ], 'CONVERTED' => [ 'leadAction' => [ 'payment' => 'update', 'mrb' => 'update', 'profile' => 'update', 'cbform' => 'update' ], 'dealAction' => 'add', 'desc' => 'Подписан договор / Переход в сделку' ], 1 => [ 'leadAction' => [ 'payment' => 'update', 'mrb' => 'update', 'profile' => 'update', 'cbform' => 'update' ], 'dealAction' => 'add', 'desc' => 'Перезвонить [ ! только для НОВЫХ лидов ]' ], 2 => [ 'leadAction' => [ 'payment' => 'update', 'mrb' => 'update', 'profile' => 'update', 'cbform' => 'update' ], 'dealAction' => 'add', 'desc' => 'Первый разговор / Презентация коворкинга / Ответы на вопросы о коворкинге' ], 3 => [ 'leadAction' => [ 'payment' => 'update', 'mrb' => 'update', 'profile' => 'update', 'cbform' => 'update' ], 'dealAction' => 'add', 'desc' => 'Назначена встреча / Запись на тестовый день / Отправлены промо-материалы о коворкинге' ], 4 => [ 'leadAction' => [ 'payment' => 'update', 'mrb' => 'update', 'profile' => 'update', 'cbform' => 'update' ], 'dealAction' => 'add', 'desc' => 'Проведена встреча / Тестовый день / Ознакомление с договором' ], 5 => [ 'leadAction' => [ 'payment' => 'update', 'mrb' => 'update', 'profile' => 'update' ], 'dealAction' => 'add', 'desc' => 'Отказ / Территориально неудобно' ], 7 => [ 'leadAction' => [ 'payment' => 'update', 'mrb' => 'update', 'profile' => 'update', 'cbform' => 'update' ], 'dealAction' => 'add', 'desc' => 'Отказ / Нет нужного наполнения коворкинга / Нет нужного кол-ва мест' ], 8 => [ 'leadAction' => [ 'payment' => 'update', 'mrb' => 'update', 'profile' => 'update', 'cbform' => 'update' ], 'dealAction' => 'add', 'desc' => 'Отложенный спрос / Лист ожидания' ], 14 => [ 'leadAction' => [ 'payment' => 'update', 'mrb' => 'update', 'profile' => 'update', 'cbform' => 'update' ], 'dealAction' => 'add', 'desc' => 'Отказ / Уже не актуально / Поменялись планы' ], 15 => [ 'leadAction' => [ 'payment' => 'update', 'mrb' => 'update', 'profile' => 'update', 'cbform' => 'update' ], 'dealAction' => 'add', 'desc' => 'Отказ / Арендовал в другом коворкинге / Арендовал в другом БЦ' ], 16 => [ 'leadAction' => [ 'payment' => 'update', 'mrb' => 'update', 'profile' => 'update', 'cbform' => 'update' ], 'dealAction' => 'add', 'desc' => 'Отказ / Перестал отвечать на звонки' ], 17 => [ 'leadAction' => [ 'payment' => 'update', 'mrb' => 'update', 'profile' => 'update', 'cbform' => 'update' ], 'dealAction' => 'add', 'desc' => '[ ! ] Некорректный лид / Удалить' ], 18 => [ 'leadAction' => [ 'payment' => 'update', 'mrb' => 'update', 'profile' => 'update', 'cbform' => 'update' ], 'dealAction' => 'add', 'desc' => 'Онлайн-оплата / Платеж через ЮKassa успешно завершен' ], 19 => [ 'leadAction' => [ 'payment' => 'update', 'mrb' => 'update', 'profile' => 'update', 'cbform' => 'update' ], 'dealAction' => 'add', 'desc' => 'Создание личного кабинета' ], 20 => [ 'leadAction' => [ 'payment' => 'update', 'mrb' => 'update', 'profile' => 'update', 'cbform' => 'update' ], 'dealAction' => 'add', 'desc' => 'Бронь переговорной / Переговорная не оплачена', ], 21 => [ 'leadAction' => [ 'payment' => 'update', 'mrb' => 'update', 'profile' => 'update', 'cbform' => 'update' ], 'dealAction' => 'add', 'desc' => 'Онлайн-оплата / Платеж через ЮKassa отменен', ], 22 => [ 'leadAction' => [ 'payment' => 'update', 'mrb' => 'update', 'profile' => 'update', 'cbform' => 'update' ], 'dealAction' => 'add', 'desc' => 'Онлайн-оплата / Платеж через ЮKassa создан, НО не завершен', ], 23 => [ 'leadAction' => [ 'payment' => 'update', 'mrb' => 'update', 'profile' => 'update', 'cbform' => 'update' ], 'dealAction' => 'add', 'desc' => 'Онлайн-оплата / Запрос на выставление счета для юр.лица', ], 24 => [ 'leadAction' => [ 'payment' => 'update', 'mrb' => 'update', 'profile' => 'update', 'cbform' => 'update' ], 'dealAction' => 'add', 'desc' => '[ ! ] Повторный лид / Дубль', ], 25 => [ 'leadAction' => [ 'payment' => 'update', 'mrb' => 'update', 'profile' => 'update', 'cbform' => 'update' ], 'dealAction' => 'add', 'desc' => 'Онлайн-оплата / Расчет бонусными монетами PAGECoin успешно завершен', ], 26 => [ 'leadAction' => [ 'payment' => 'update', 'mrb' => 'update', 'profile' => 'update', 'cbform' => 'update' ], 'dealAction' => 'add', 'desc' => 'Бронь переговорной / Переговорная через ЮKassa успешно оплачена', ], 27 => [ 'leadAction' => [ 'payment' => 'update', 'mrb' => 'update', 'profile' => 'update', 'cbform' => 'update' ], 'dealAction' => 'add', 'desc' => 'Бронь переговорной / Переговорная через PAGECoin успешно оплачена', ] ]; return ($v = $items[$status]) ? $v : []; } function btx24DealStages($stage = '') { if (!$stage) { return false; } $items = [ 7, #Онлайн-оплата / Платеж через ЮKassa успешно завершен 8, #Бронь переговорной / Переговорная не оплачена 9, #Онлайн-оплата / Расчет бонусными монетами PAGECoin успешно завершен 10, #Бронь переговорной / Переговорная через PAGECoin успешно оплачена 11, #Онлайн-оплата / Запрос на выставление счета для юр.лица 12, #Онлайн-оплата / Платеж через ЮKassa создан, НО не завершен 13, #Бронь переговорной / Переговорная через ЮKassa успешно оплачена 14, #Онлайн-оплата / Платеж через ЮKassa отменен ]; return in_array($stage, $items); } #проверяем есть ли ранее добавленные лиды у этого контакта function checkIfLeadIsExists($phone = '', $email = '', $assignedIds = [], $returnAll = false) { if (!$phone && !$email && !$assignedIds) { return false; } $lead = []; if ($phone) { $clearPhone = str_replace(array('+', '-', ' ', '(', ')'), '', $phone); $phones = [ $phone, str_replace(array('-', ' ', '(', ')'), '', $phone), str_replace(array('+', '-', ' ', '(', ')'), '', $phone), '+'.substr($clearPhone, 0, 1).'('.substr($clearPhone, 1, 3).')-'.substr($clearPhone, 4, 3).'-'.substr($clearPhone, 7, 2).'-'.substr($clearPhone, 9, 2), '+'.substr($clearPhone, 0, 1).' '.substr($clearPhone, 1, 3).' '.substr($clearPhone, 4, 3).'-'.substr($clearPhone, 7, 2).'-'.substr($clearPhone, 9, 2) ]; foreach ($phones as $item) { if ($lead) { break; } $items = getBitrix24Lead($webhook_url, [ 'filter' => [ 'PHONE' => $item, 'ASSIGNED_BY_ID' => $assignedIds ], 'select' => ["*", "UF_*", "PHONE", "EMAIL"], 'order' => ["DATE_CREATE" => "DESC"] ]); if ($items && $items['result'] && $items['result'][0]) { if ($returnAll) { foreach ($items['result'] as $leadItem) { $lead[] = [ 'id' => $leadItem['ID'], 'statusId' => $leadItem['STATUS_ID'], 'coworkingId' => ($v = $leadItem['UF_CRM_1602667276']) ? $v[0] : '' ]; } } else { $lead = $items['result'][0]; } } } } if ($email && !$lead || $email && $returnAll) { $items = getBitrix24Lead($webhook_url, [ 'filter' => [ 'EMAIL' => $email, 'ASSIGNED_BY_ID' => $assignedIds ], 'select' => ["*", "UF_*", "PHONE", "EMAIL"], 'order' => ["DATE_CREATE" => "DESC"] ]); if ($items && $items['result'] && $items['result'][0]) { if ($returnAll) { foreach ($items['result'] as $leadItem) { $lead[] = [ 'id' => $leadItem['ID'], 'statusId' => $leadItem['STATUS_ID'], 'coworkingId' => ($v = $leadItem['UF_CRM_1602667276']) ? $v[0] : '' ]; } } else { $lead = $items['result'][0]; } } } if ($lead) { return ($returnAll) ? $lead : [ 'id' => $lead['ID'], 'statusId' => $lead['STATUS_ID'], 'coworkingId' => ($v = $lead['UF_CRM_1602667276']) ? $v[0] : '' ]; } else { return false; } } #проверяет и возвращает нужное действие с лидом #args: phone / email / coworkingIdBtx24 / currentType (payment: онлайн оплата рабочих мест / mrb: бронирование / profile: создание личного кабинета) function whatToDoWithLead($args) { $results = ['action' => 'add', 'id' => '']; $assignedIds = []; #получаем список всех отвественных по страницам if ($assignedForPage = get_field('bitrix24_assigned', 'option')) { if ($ids = array_column($assignedForPage, 'page')) { $assignedIndex = array_search($args['coworkingIdWp'], $ids); if ($assignedIndex !== false && $assignedForPage[$assignedIndex]['items']) { $assignedIds = array_column($assignedForPage[$assignedIndex]['items'], 'id'); } } } #делаем запрос на поиск (проверку) лидов $checkIfLeadIsExists = checkIfLeadIsExists($args['phone'], $args['email'], $assignedIds); #проверяем статус у найденного лида if ($checkIfLeadIsExists && $args['currentType'] && $checkIfLeadIsExists['statusId']) { if ($btx24LeadStatuses = btx24LeadStatuses($checkIfLeadIsExists['statusId'])) { $action = $btx24LeadStatuses['leadAction'][$args['currentType']]; $results = ['action' => $action, 'id' => ($action != 'add') ? $checkIfLeadIsExists['id'] : '']; } } return $results; } #очищает данные лида при повторном его обновлении function clearLead($leadId) { updateBitrix24Lead($webhook_url, [ 'id' => $leadId, 'fields' => [ // 'UF_CRM_1591065837' => '', #Услуга 'UF_CRM_1620374131778' => [''], #Ресурсы: СПб: м. «Политехническая» - BENUA PAGE 'UF_CRM_1620471460549' => [''], #Ресурсы: СПб: м. «Петроградская» - AVENUE PAGE 'UF_CRM_1620471734515' => [''], #Ресурсы: СПб: м. «Нарвская» - UGOL PAGE 'UF_CRM_1620479383403' => [''], #Ресурсы: СПб: м. «Невский проспект» - KAZANSKAYA PAGE 'UF_CRM_1620479989694' => [''], #Ресурсы: СПб: м. «Приморская» - DOCKLANDS PAGE 'UF_CRM_1620480646840' => [''], #Ресурсы: СПб: м. «Лесная» - RODELEN PAGE 'UF_CRM_1631002802518' => [''], #Ресурсы: СПб: м. «Петроградская» - INSTRUMENTALNAYA PAGE 'UF_CRM_1650021369' => [''], #Ресурсы: СПб: м. «Пл. Александра Невского» - RATUSHA 'UF_CRM_1646294519349' => [''], #Ресурсы: СПб: м. «Чернышевская» - SMOLNINSKY PAGE 'UF_CRM_1654762679' => [''], #Ресурсы: СПб: м. «Ленинский проспект» - ATL GROUP PAGE 'UF_CRM_1651057444500' => [''], #Ресурсы: Киров - VYATKA PAGE // 'SOURCE_DESCRIPTION' => '', #Дополнительно об источнике // 'UF_CRM_1599307433' => '', #Отправлено со страницы [ WordPress ] // 'UF_CRM_1591064988' => '', #Коворкинг (WP) // 'UF_CRM_1602667276' => '', #Коворкинг (WP) 'UF_CRM_1602594431' => '', #ID заказа [ WordPress ] 'UF_CRM_1602594443' => '', #ID платежа [ ЮKassa ] 'UF_CRM_1602594460' => '', #Ссылка на оплату [ ЮKassa ] 'UF_CRM_1602594511' => '', #Статус оплаты [ ЮKassa ] 'UF_CRM_1629385174639' => '', #Сумма сделки [ только для бронирования помещений ] 'UF_CRM_1628924669' => '', #Количество начисляемых PAGECoin, 'UF_CRM_1609166934' => '', #дата начала аренды 'UF_CRM_1609166973' => '', #дата окончания аренды 'UF_CRM_1609166959' => '', #дата выставления счета ], 'params' => ['REGISTER_SONET_EVENT' => 'Y'] ], false); #товары addBitrix24ProductToLead($webhook_url, ['leadId' => $leadId, 'items' => []]); } #соответствие услуг лида --> сделка function servicesLeadToDealReplacer($leadServiceId) { if (!$leadServiceId) { return false; } $items = [ 254 => 272, #Open Space [ нефиксированное рабочее место ] 256 => 274, #Open Space [ фиксированное рабочее место ] 258 => 276, #Офис на 1 рабочее место 260 => 278, #Офис на 2 рабочих места 262 => 280, #Офис на 3 рабочих места 264 => 282, #Офис на 4 рабочих места 266 => 284, #Офис на 5-10 рабочих мест 314 => 322, #Офис на 11-20 рабочих мест 316 => 324, #Офис на 21-40 рабочих мест 318 => 326, #Офис на 41-80 рабочих мест 320 => 328, #Офис на 81 и более рабочее место 268 => 286, #Юридический адрес 270 => 288, #Переговорная комната 338 => 344, #Конференц-зал 308 => 310, #Аренда локера 340 => 346, #Аренда ноутбука / моноблока 342 => 348, #Интерьерная фотосъемка / видеосъемка ]; return $items[$leadServiceId]; } #соответствие поля "Коворкинг [ WordPress ]" --> к обычному полю "Коворкинг" function coworkingFieldReplacer($leadCoworkingId) { if (!$leadCoworkingId) { return false; } $items = [ 460 => [ 'lead' => 44, 'deal' => 68, 'dealWP' => 466, 'title' => '#СПб: м.«Политехническая» - BENUA PAGE' ], 462 => [ 'lead' => 46, 'deal' => 70, 'dealWP' => 468, 'title' => 'СПб: м.«Петроградская» - AVENUE PAGE' ], 464 => [ 'lead' => 356, 'deal' => 358, 'dealWP' => 470, 'title' => 'СПб: м.«Нарвская» - UGOL PAGE' ], 516 => [ 'lead' => 520, 'deal' => 522, 'dealWP' => 518, 'title' => 'СПб: м.«Приморская» - DOCKLANDS PAGE' ], 536 => [ 'lead' => 528, 'deal' => 530, 'dealWP' => 538, 'title' => 'СПб: м.«Невский проспект» - KAZANSKAYA PAGE' ], 540 => [ 'lead' => 544, 'deal' => 546, 'dealWP' => 542, 'title' => 'СПб: м.«Лесная» - RODELEN PAGE' ], 588 => [ 'lead' => 584, 'deal' => 586, 'dealWP' => 590, 'title' => 'СПб: м.«Петроградская» - INSTRUMENTALNAYA PAGE' ], 904 => [ 'lead' => 896, 'deal' => 902, 'dealWP' => 910, 'title' => 'СПб: м.«Пл. Александра Невского» - RATUSHA PAGE' ], 888 => [ 'lead' => 880, 'deal' => 882, 'dealWP' => 890, 'title' => 'СПб: м.«Чернышевская» - SMOLNINSKIY PAGE' ], 936 => [ 'lead' => 928, 'deal' => 934, 'dealWP' => 942, 'title' => 'СПб: м.«Ленинский проспект» - ATL GROUP PAGE' ], 920 => [ 'lead' => 912, 'deal' => 918, 'dealWP' => 926, 'title' => 'Киров - VYATKA PAGE' ], ]; return $items[$leadCoworkingId]; } #соответствие поля "Коворкинг [ WordPress ]" --> к названию коворкинга function coworkingFieldIdReplacerToTitle($dealCoworkingId) { if (!$dealCoworkingId) { return false; } $items = [ 466 => [ 'title' => '#СПб: м.«Политехническая» - BENUA PAGE', 'wpId' => 118 ], 468 => [ 'title' => 'СПб: м.«Петроградская» - AVENUE PAGE', 'wpId' => 888 ], 470 => [ 'title' => 'СПб: м.«Нарвская» - UGOL PAGE', 'wpId' => 1541 ], 518 => [ 'title' => 'СПб: м.«Приморская» - DOCKLANDS PAGE', 'wpId' => 1986 ], 538 => [ 'title' => 'СПб: м.«Невский проспект» - KAZANSKAYA PAGE', 'wpId' => 1962 ], 542 => [ 'title' => 'СПб: м.«Лесная» - RODELEN PAGE', 'wpId' => 2613 ], 590 => [ 'title' => 'СПб: м.«Петроградская» - INSTRUMENTALNAYA PAGE', 'wpId' => 2784 ], 910 => [ 'title' => 'СПб: м.«Пл. Александра Невского» - RATUSHA PAGE', 'wpId' => 4103 ], 890 => [ 'title' => 'СПб: м.«Чернышевская» - SMOLNINSKIY PAGE', 'wpId' => 3084 ], 942 => [ 'title' => 'СПб: м.«Ленинский проспект» - ATL GROUP PAGE', 'wpId' => 4280 ], 926 => [ 'title' => 'Киров - VYATKA PAGE', 'wpId' => 3923 ], ]; return $items[$dealCoworkingId]; } #соответствие поля "Статус" (лид) --> "Стадия" (сделка) // function leadStatusToDealStageReplacer($statusId) { // if (!$statusId) { return false; } // // $items = [ // 18 => [ #Онлайн-оплата / Платеж через ЮKassa успешно завершен // 'payment' => 7, // 'mrb' => 8, // ], // 20 => 8, #Бронь переговорной / Переговорная не оплачена // 25 => 9, #Онлайн-оплата / Расчет бонусными монетами PAGECoin успешно завершен // 27 => 10, #Бронь переговорной / Переговорная через PAGECoin успешно оплачена // 23 => 11, #Онлайн-оплата / Запрос на выставление счета для юр.лица // 22 => 12, #Онлайн-оплата / Платеж через ЮKassa создан, НО не завершен // 26 => 13, #Бронь переговорной / Переговорная через ЮKassa успешно оплачена // 21 => 14, #Онлайн-оплата / Платеж через ЮKassa отменен // ]; // // return $items[$statusId]; // } //проверка на доступность дат к бронированию function checkIfTimeAvailable($resourceId, $date, $times) { $webhook_url = get_field('bitrix24_webhook_url', 'option'); $isAvailable = true; foreach ($times as $time) { $t = explode('-', $time); if (!$t || count($t) != 2) { $isAvailable = false; continue; } $events = getBitrix24CalendarResourceBookingList($webhook_url, [ 'filter' => [ 'resourceTypeIdList' => [$resourceId], 'from' => date('Y-m-d', strtotime($date)), 'to' => date('Y-m-d', strtotime($date)) ] ]); if ($events && $events['result']) { foreach ($events['result'] as $event) { if (!$isAvailable) { break; } if (strtotime($date) == strtotime(date('d.m.Y', strtotime($event['DATE_FROM'])))) { if (strtotime("{$date} {$t[0]}") < strtotime($event['DATE_TO']) && strtotime($event['DATE_FROM']) < strtotime("{$date} {$t[1]}")) { $isAvailable = false; } } } } } return $isAvailable; } #проверяет является ли переденная элеткронная почта - личной function checkIfEmailIsPrivate($email = '') { if (!$email) { return; } $domain = explode('@', strtolower($email)); if ($domain && isset($domain[1]) && $domain[1]) { $domain = $domain[1]; } else { return; } $domains = [ 'bk.ru', 'e1.ru', 'email.com', 'gmail.com', 'hotmail.com', 'icloud.com', 'inbox.ru', 'list.ru', 'live.ru', 'mail.com', 'mail.ru', 'me.com', 'outlook.com', 'protonmail.com', 'rambler.ru', 'ya.ru', 'yahoo.com', 'yandex.ru' ]; return in_array($domain, $domains); } #обновляет ФИО + контакты ранее существовавших лидов (без привязки к коворкингу и ответственному) function updateOtherLeadsNameContacts($webhook_url, $data) { $otherLeadsPhone = (isset($data['PHONE'][0]['VALUE']) && $data['PHONE'][0]['VALUE']) ? $data['PHONE'][0]['VALUE'] : ''; $otherLeadsEmail = (isset($data['EMAIL'][0]['VALUE']) && $data['EMAIL'][0]['VALUE']) ? $data['EMAIL'][0]['VALUE'] : ''; if ($otherLeadsPhone || $otherLeadsEmail) { if ($otherLeads = checkIfLeadIsExists($otherLeadsPhone, $otherLeadsEmail, [], true)) { $dataUpdate = []; $fieldsUpdate = ['NAME', 'LAST_NAME', 'SECOND_NAME', 'PHONE', 'EMAIL']; foreach ($fieldsUpdate as $field) { if (!isset($data[$field]) || !$data[$field]) { continue; } $dataUpdate[$field] = $data[$field]; } foreach ($otherLeads as $otherLead) { if (!$dataUpdate) { continue; } updateBitrix24Lead($webhook_url, [ 'id' => $otherLead['id'], 'fields' => $dataUpdate ], false, false); } } } } //enable upload for webp image files. //function webp_upload_mimes($existing_mimes) { // $existing_mimes['webp'] = 'image/webp'; // return $existing_mimes; //} //add_filter('mime_types', 'webp_upload_mimes'); //enable preview / thumbnail for webp image files. //function webp_is_displayable($result, $path) { // if ($result === false) { // $displayable_image_types = array( IMAGETYPE_WEBP ); // $info = @getimagesize( $path ); // // if (empty($info)) { // $result = false; // } elseif (!in_array($info[2], $displayable_image_types)) { // $result = false; // } else { // $result = true; // } // } // // return $result; //} //add_filter('file_is_displayable_image', 'webp_is_displayable', 10, 2); // Исправляем ошибку валидатора https://schema.org/query-input не определено в спецификации http://schema.org/SearchAction add_filter( 'disable_wpseo_json_ld_search', '__return_true' ); ?> https://spb.pageclub.ru/post-sitemap.xml 2023-10-19T10:45:26+00:00 https://spb.pageclub.ru/page-sitemap.xml 2026-06-22T09:42:44+00:00 https://spb.pageclub.ru/category-sitemap.xml 2023-10-19T10:45:26+00:00 https://spb.pageclub.ru/post_tag-sitemap.xml 2023-10-19T10:45:26+00:00 https://spb.pageclub.ru/author-sitemap.xml 2024-02-14T10:16:37+00:00