/* Micromarking 1.01 */ function MySchema(options) { // Общие переменные options = options; var currentUrl = window.location.href, titleSyte = options.generalSettings.titleSyte || 'Наркологическая клиника', city2Syte = options.generalSettings.city2Syte, city = options.generalSettings.city, address = options.generalSettings.address, region = options.generalSettings.region, phone = document.querySelector(options.generalSettings.phone)?.innerText || document.querySelector(options.generalSettings.phone)?.outerText, // подставляем класс нужного телефона представленного на сайте logo_img = document.querySelector(options.generalSettings.logo)?.src, // подставляем класс лого представленного на сайте head = document.getElementsByTagName('head')[0], socialMedia = [...document.querySelectorAll(options.generalSettings.socialMedia)].map((e) => e.href); // подставляем класс социальных сетей и желательно указать более точный путь с футера console.log(city); if (options.generalSettings.isRegion == 'y') { urlMainSyte = `${window.location.origin}/${window.location.pathname.split('/')[1]}/`; } else if (options.generalSettings.isRegion == 'n') { urlMainSyte = `${window.location.origin}/regions/${window.location.pathname.split('/')[2]}`; } else { urlMainSyte = window.location.origin; } if (window.location.href.includes('almaty')) { var priceCurrency = 'KZT'; var addressCountry = 'Казахстан'; } else { var priceCurrency = 'RUB'; var addressCountry = 'Россия'; } if (options.generalSettings.email) { mail = document.querySelector(options.generalSettings.email).href; } else { mail = 'mailto:info@' + window.location.hostname; // + '.ru' // опционально, если нужно добавить дополнительно .ru }; // MedicalOrganization function createMedicalOrganization(parameters) { // передаем в параметры необходимые аргументы в файле php (Например $current_catalogue[Catalogue_Name] ) const script = document.createElement('script'); script.type = 'application/ld+json'; script.text = JSON.stringify({ "@context": "https://schema.org", "@type": "MedicalOrganization", "name": parameters.name, // Прописываем нужное имя по желанию СЕО "alternateName": parameters.englName, // Тоже самое "url": urlMainSyte, "telephone": phone, "email": mail, "logo": { "@type": "ImageObject", "@id": logo_img, "url": logo_img }, "image": logo_img, "aggregateRating": { "@type": "AggregateRating", // Выставляем значения нужные для СЕО "bestRating": "5", // Выставляем значения нужные для СЕО "worstRating": "1", // Выставляем значения нужные для СЕО "ratingCount": "35", // Выставляем значения нужные для СЕО "ratingValue": "4.6" // Выставляем значения нужные для СЕО }, "address": { "@type": "PostalAddress", // В зависимости о т пожеланий сео выставляем здесь нужные параметры. "streetAddress": address, "addressLocality": city, "addressRegion": region, // или parameters.city или что нужно для СЕО "addressCountry": addressCountry }, "sameAs": socialMedia // Выводим социальные сети }); head.appendChild(script); }; // WebSite function createWebSite() { const script = document.createElement('script'); script.type = 'application/ld+json'; script.text = JSON.stringify({ "@context": "https://schema.org", "@type": "WebSite", "url": urlMainSyte, "potentialAction": { "@type": "SearchAction", "target": { "@type": "EntryPoint", "urlTemplate": `${urlMainSyte}/search?q={search_term_string}` // Стандартный шаблон. Нужно будет подставить код от СЕО }, "query-input": "required name=search_term_string" // Стандартный шаблон. Нужно будет подставить код от СЕО } }); head.appendChild(script); }; // BreadcrumbList function createBreadcrumbList(parameters) { const wrapperBreadList = document.querySelectorAll(parameters.bread); // Выбираем хлебные крошки, берем родителя а далее > * let i = 1; if (wrapperBreadList.length > 0) { // Скрываем от главной и других одиночных страниц const breadArrey = Array.from(wrapperBreadList).map((e, i) => { return { "@type": "ListItem", "position": i++, "name": e.innerText || "Главная", "item": e.href || window.location.href }; }); const script = document.createElement('script'); script.type = 'application/ld+json'; script.text = JSON.stringify({ "@context": "https://schema.org", "@type": "BreadcrumbList", "itemListElement": breadArrey }); head.appendChild(script); } }; /* BreadcrumbList Этот вариант нужен, если хлебные крошки построены не стандартным способом. ПРИМЕР:
В таком случае, мы получаем весь элемент родителя, образовываем в строку. разбиваем по разделителю на массив, а после парсем элементы с html в DOM элементы, там где нет тэгов просто подставляем нужный текст и урл текущий страницы (либо ставим дополнительное условие и выбираем нужный url) */ /* function createBreadcrumbList(parameters) { let wrapperBreadList = document.querySelectorAll(parameters.bread); let a = wrapperBreadList[0].innerHTML.split(' / '); // Подбираем нужный нам разделитель let breadArrey = []; let nameItem = ''; let urlItem = ''; if (a.length > 0) { a.forEach((e, i) => { if (i == a.length - 1) { nameItem = a[a.length - 1]; urlItem = ''; } else { var doc = new DOMParser().parseFromString(a[i], "text/xml"); nameItem = doc.all[0].innerHTML; urlItem = doc.all[0].attributes[0].value; } i++; breadArrey.push([nameItem, urlItem]); }); let breadOn = Array.from(breadArrey).map((e, i) => { return { "@type": "ListItem", "position": ++i, "name": e[0] || "Главная", "item": e[1] || window.location.pathname }; }); const script = document.createElement('script'); script.type = 'application/ld+json'; script.text = JSON.stringify({ "@context": "https://schema.org", "@type": "BreadcrumbList", "itemListElement": breadOn }); head.appendChild(script); } }; */ // MedicalScholarlyArticle function createMedicalScholarlyArticle(parameters) { const { title } = document, // Получаем title страницы headlineTitle = document.querySelector('h1')?.innerText; // Получаем h1 на странице if (parameters.data) { if (document.querySelectorAll(parameters.data).length > 0) { var data = document.querySelector(parameters.data)?.innerText ? document.querySelector(parameters.data)?.innerText : "2023-06-26"; } } if (parameters.doctor) { if (document.querySelectorAll(parameters.doctor).length > 0) { var doctor = document.querySelector(parameters.doctor), // Подставляем класс имени врача { innerText: nameDoctor, href } = doctor ?? {}, // Получаем имя врача и ссылку на врача, если ссылка отстутствует то ссылка будет заменена на урл сайта (на текующую страницу) urlDoctor = href || currentUrl; } } if (parameters.job) { var jobDoctor = parameters.job ? document.querySelector(parameters.job)?.innerText : 'Психиатр-нарколог'; // Подставляем класс должности врача } else { var jobDoctor = 'Психиатр-нарколог'; } if (parameters.banner) { let verif = document.querySelectorAll(parameters.banner).length > 0 ? document.querySelector(parameters.banner)?.style.backgroundImage : false; if (verif) { let banner = document.querySelector(parameters.banner)?.style.backgroundImage; // Подставляем класс нужной ссылки на баннер если изображение в виде img то добавляем const imgBanner = document.querySelector('.banner_image').srcset; а нижнюю строку комментируем var imageUrlBanner = banner ? banner.slice(5, -2) : ''; // удаляем "url(" и ")" из начала и конца строки } else { let img1 = false, img2 = false; if (parameters.img.img1) { img1 = document.querySelectorAll(parameters.img.img1).length > 0 ? document.querySelectorAll(parameters.img.img1) : false; } if (parameters.img.img2) { img2 = document.querySelectorAll(parameters.img.img2).length > 0 ? document.querySelectorAll(parameters.img.img2) : false; } let verif = img1 || img2; if (verif) { var imageUrlBanner = verif?.src || verif?.currentSrc; } } } else { let img1 = false, img2 = false; if (parameters.img.img1) { img1 = document.querySelectorAll(parameters.img.img1).length > 0 ? document.querySelectorAll(parameters.img.img1) : false; } if (parameters.img.img2) { img2 = document.querySelectorAll(parameters.img.img2).length > 0 ? document.querySelectorAll(parameters.img.img2) : false; } let verif = img1[0] || img2[0]; if (verif) { var imageUrlBanner = verif?.src || verif?.currentSrc; } else { var imageUrlBanner = false; } } if (imageUrlBanner && headlineTitle && window.location.pathname !== '/') { const script = document.createElement('script'); script.type = 'application/ld+json'; script.text = JSON.stringify({ "@context": "http://schema.org", "@type": "MedicalScholarlyArticle", "audience": { "@type": "Audience", "url": "https://schema.org/Clinician" }, "name": title, "headline": headlineTitle, "image": imageUrlBanner, "datePublished": data, // СВОИ ЗНАЧЕНИЯ, ВОЗМОЖНО ДЛЯ ЭТОГО СВОЙСТВА ПОНАДОБИТСЯ ПАРАМЕТР, ВЫБОР С САЙТА ИЛИ ЖЕ РАНДОМНАЯ ДАТА. ПО ЖЕЛАНИЮ СЕО "author": { "@type": "Person", "url": urlDoctor, "name": nameDoctor, "jobTitle": jobDoctor // В данном случае просто выводим Психиатр-нарколог } }); head.appendChild(script); } }; // FAQPage function createFAQPage(parameters) { const questionFAQ = document.querySelectorAll(parameters.question), // Класс всех вопросов answerFAQ = document.querySelectorAll(parameters.answer); // Класс всех ответов if (questionFAQ.length > 0) { const script = document.createElement('script'); script.type = 'application/ld+json'; let object = {}; for (let i = 0; i < questionFAQ.length; i++) { object[questionFAQ[i]?.textContent] = answerFAQ[i]?.textContent } let text = { "@context": "http://schema.org", "@type": "FAQPage", "mainEntity": [] } for (let item in object) { text.mainEntity.push({ "@type": "Question", "name": `${item}`, "acceptedAnswer": { "@type": "Answer", "text": `${object[item]}` } }) } script.textContent = JSON.stringify(text); head.appendChild(script); } }; // Product function createProduct(parameters) { var object = {}; if (parameters.TABLE_PriceWrapper) { // Если цены находятся в таблице var table_price = document.querySelectorAll(parameters.TABLE_PriceWrapper); // передаем класс на элементы таблицы tr (должно быть два td с названием и ценой) Пример: #classic_prices tbody tr for (let i = 0; i < table_price.length; i++) { let a = table_price[i]?.innerText, b = (a.includes('\t') ? a.split('\t') : a.split('\n')), price = (b[3]) ? b[3].replace(' ₽', '').replace(',', '.').trim() : ''; price = price == 'Бесплатно' ? '0' : price; price = price.replace(/\D/g, ''); price = Number(price); if (price) { object[b[1]] = price; } } } else { // Если цены находятся в div var table_price = document.querySelectorAll(parameters.DIV_PriceWrapper), title = document.querySelectorAll(parameters.DIV_pricePoint), price = document.querySelectorAll(parameters.DIV_itemPrice); for (let i = 0; i < table_price.length; i++) { let prNum = price[i]?.outerText == 'Бесплатно' ? '0' : price[i]?.outerText; prNum = prNum.replace(/\D/g, '').replace(',', '.').replace('\n', '').replace('руб', '').trim(); prNum = Number(prNum); object[title[i]?.innerText] = prNum; } } if (table_price) { for (let key of Object.keys(object)) { let script = document.createElement('script'); script.type = 'application/ld+json'; let text = { "@context": "http://schema.org/", "@type": "Product", "name": key, "image": logo_img, "description": `${key} ${city2Syte}`, "brand": { "@type": "Brand", "name": `${titleSyte} ${city2Syte}`, }, "offers": { "@type": "Offer", "priceCurrency": priceCurrency, "price": object[key], "availability": "https://schema.org/InStock", "itemCondition": "https://schema.org/NewCondition" } }; script.textContent = JSON.stringify(text); head.appendChild(script); } } } function createPhysicianSlider(parameters) { var bannerUrl = parameters.banner ? parameters.banner : false, imgUrl = parameters.img ? parameters.img : false, verification = bannerUrl || imgUrl, doctorDescription = '', nameDoctor = '', verificationClass = document.querySelectorAll(verification); if (verificationClass.length > 0 && parameters.banner) { let verif = document.querySelectorAll(bannerUrl)[0].style.backgroundImage || false; if (verif) { let banner = document.querySelector(bannerUrl).style.backgroundImage; // Подставляем класс нужной ссылки на баннер если изображение в виде img то добавляем const imgBanner = document.querySelector('.banner_image').srcset; а нижнюю строку комментируем var imageUrlBanner = banner ? banner.slice(5, -2) : ''; // удаляем "url(" и ")" из начала и конца строки if (parameters.doctor) { doctor = [...document.querySelectorAll(parameters.doctor)].map(e => e?.innerText), nameDoctor = doctor.join(); } docLink = [...document.querySelectorAll(parameters.doctorLink)].map(e => e?.href), doctorLink = docLink.join(), docImg = [...document.querySelectorAll(parameters.img)].map(e => e?.src), doctorImg = docImg.join(), doctorDescription = [...document.querySelectorAll(parameters.descrDoctor)].map(e => e?.innerText), doctorDescription = doctorDescription.join(), openingHoursTime = parameters.time ? document.querySelector(parameters.time) : 'Mo, Tu, We, Th, Fr, Sa, Su 07:30-16:00'; } else { var imageUrlBanner = document.querySelectorAll(imgUrl)[0].src; if (parameters.doctor) { doctor = [...document.querySelectorAll(parameters.doctor)].map(e => e.innerText), nameDoctor = doctor.join(); } docLink = [...document.querySelectorAll(parameters.doctorLink)].map(e => e.href), doctorLink = docLink.join(), docImg = [...document.querySelectorAll(parameters.img)].map(e => e.src), doctorImg = docImg.join(), doctorDescription = [...document.querySelectorAll(parameters.descrDoctor)].map(e => e.innerText), doctorDescription = doctorDescription.join(), openingHoursTime = parameters.time ? document.querySelector(parameters.time) : 'Mo, Tu, We, Th, Fr, Sa, Su 07:30-16:00'; } } else if (verificationClass.length > 0 && parameters.img) { var imageUrlBanner = document.querySelectorAll(imgUrl)[0].src; if (parameters.doctor) { doctor = [...document.querySelectorAll(parameters.doctor)].map(e => e.innerText), nameDoctor = doctor.join(); } docLink = [...document.querySelectorAll(parameters.doctorLink)].map(e => e.href), doctorLink = docLink.join(), docImg = [...document.querySelectorAll(parameters.img)].map(e => e.src), doctorImg = docImg.join(), doctorDescription = [...document.querySelectorAll(parameters.descrDoctor)].map(e => e.innerText), doctorDescription = doctorDescription.join(), openingHoursTime = parameters.time ? document.querySelector(parameters.time) : 'Mo, Tu, We, Th, Fr, Sa, Su 07:30-16:00'; } if (parameters.map) { var map = parameters.map; } else { var map = "https://www.google.com/maps/place/…"; } if (nameDoctor && doctorDescription) { const nameoneDoctor = nameDoctor.split(','); if (nameoneDoctor.length > 1) { const nameoneLink = doctorLink.split(','); const nameoneDescription = doctorDescription.split(','); const nameoneImg = doctorImg.split(','); for (let i = 0; i < nameoneDoctor.length; i++) { const nameDoctor1 = nameoneDoctor[i]; const doctorLink1 = nameoneLink[i]; const doctorDescription1 = nameoneDescription[i]; const script = document.createElement('script'); script.type = 'application/ld+json'; script.text = JSON.stringify({ "@context": "http://www.schema.org", "@type": "Physician", "name": nameoneDoctor[i], "url": nameoneLink[i], "image": nameoneImg[i], "description": nameoneDescription[i], "address": { "@type": "PostalAddress", "streetAddress": address, "addressLocality": city, "addressRegion": region, // или parameters.region или что нужно для СЕО, в данном примере сити "addressCountry": addressCountry }, "hasMap": map, "openingHours": openingHoursTime, "contactPoint": { "@type": "ContactPoint", "telephone": phone, "contactType": "Customer Support" } }); head.appendChild(script); } } } } // Physician function createPhysician(parameters) { var bannerUrl = parameters.banner ? parameters.banner : false, imgUrl = parameters.img ? parameters.img : false, verification = bannerUrl || imgUrl, doctorDescription = '', nameDoctor = '', verificationClass = document.querySelectorAll(verification); if (verificationClass.length > 0 && parameters.banner) { let verif = document.querySelectorAll(bannerUrl)[0].style.backgroundImage || false; if (verif) { let banner = document.querySelector(bannerUrl).style.backgroundImage; // Подставляем класс нужной ссылки на баннер если изображение в виде img то добавляем const imgBanner = document.querySelector('.banner_image').srcset; а нижнюю строку комментируем var imageUrlBanner = banner ? banner.slice(5, -2) : ''; // удаляем "url(" и ")" из начала и конца строки if (parameters.doctor) { var doctor = document.querySelector(parameters.doctor), // Подставляем класс имени врача { innerText: nameDoctor, href } = doctor ?? {}, // Получаем имя врача и ссылку на врача, если ссылка отстутствует то ссылка будет заменена на урл сайта (на текующую страницу) urlDoctor = href || url; } doctorDescription = [...document.querySelectorAll(parameters.descrDoctor)].map(e => e.innerText), doctorDescription = doctorDescription.join(), openingHoursTime = parameters.time ? document.querySelector(parameters.time) : 'Mo, Tu, We, Th, Fr, Sa, Su 07:30-16:00'; doctorDescription = doctorDescription ? doctorDescription : false; } else { var imageUrlBanner = document.querySelectorAll(imgUrl)[0].src; if (parameters.doctor) { var doctor = document.querySelector(parameters.doctor), // Подставляем класс имени врача { innerText: nameDoctor, href } = doctor ?? {}, // Получаем имя врача и ссылку на врача, если ссылка отстутствует то ссылка будет заменена на урл сайта (на текующую страницу) urlDoctor = href || url; } doctorDescription = [...document.querySelectorAll(parameters.descrDoctor)].map(e => e.innerText), doctorDescription = doctorDescription.join(), openingHoursTime = parameters.time ? document.querySelector(parameters.time) : 'Mo, Tu, We, Th, Fr, Sa, Su 07:30-16:00'; doctorDescription = doctorDescription ? doctorDescription : false; } } else if (verificationClass.length > 0 && parameters.img) { var imageUrlBanner = document.querySelectorAll(imgUrl)[0].src; if (parameters.doctor) { var doctor = document.querySelector(parameters.doctor), // Подставляем класс имени врача { innerText: nameDoctor, href } = doctor ?? {}, // Получаем имя врача и ссылку на врача, если ссылка отстутствует то ссылка будет заменена на урл сайта (на текующую страницу) urlDoctor = href || currentUrl; } doctorDescription = [...document.querySelectorAll(parameters.descrDoctor)].map(e => e.innerText), doctorDescription = doctorDescription.join(), openingHoursTime = parameters.time ? document.querySelector(parameters.time) : 'Mo, Tu, We, Th, Fr, Sa, Su 07:30-16:00'; doctorDescription = doctorDescription ? doctorDescription : false; } if (parameters.map) { var map = parameters.map; } else { var map = "https://www.google.com/maps/place/…"; } if (parameters.doctor) { doctor = [...document.querySelectorAll(parameters.doctor)].map(e => e?.innerText), doctorLength = doctor.join().split(',').length; } if (nameDoctor && doctorDescription && doctorLength == 1) { const script = document.createElement('script'); script.type = 'application/ld+json'; script.text = JSON.stringify({ "@context": "http://www.schema.org", "@type": "Physician", "name": nameDoctor, "url": urlDoctor, "image": imageUrlBanner, "description": doctorDescription, "address": { "@type": "PostalAddress", "streetAddress": address, "addressLocality": city, "addressRegion": region, // или parameters.region или что нужно для СЕО, в данном примере сити "addressCountry": addressCountry }, "hasMap": map, "openingHours": openingHoursTime, "contactPoint": { "@type": "ContactPoint", "telephone": phone, "contactType": "Customer Support" } }); head.appendChild(script); } else { if (options.createPhysicianSlider) { createPhysicianSlider(SliderPhysicianParameters); } } } // Review function createReview(parameters) { var nameReview = document.querySelectorAll(parameters.interviewer), textReview = document.querySelectorAll(parameters.textInterviewerReview); script = document.createElement('script'), reviews = []; if(parameters.dats){ var dats = document.querySelectorAll(parameters.dats); } if (nameReview.length > 1) { script.type = 'application/ld+json'; for (let i = 0; i < textReview.length; i++) { const nameRev = nameReview[i].textContent.split(',')[0].trim(); const reviewText = textReview[i].textContent.trim(); if(parameters.dats){ var data = dats[i].textContent.trim(); } else { var data = "2023-06-26"; } const review = { "@type": "Review", "reviewRating": { "@type": "Rating", "ratingValue": "4", "bestRating": "5" }, "author": { "@type": "Person", "name": nameRev }, "reviewBody": reviewText, "datePublished": data, // СВОИ ЗНАЧЕНИЯ, ВОЗМОЖНО ДЛЯ ЭТОГО СВОЙСТВА ПОНАДОБИТСЯ ПАРАМЕТР, ВЫБОР С САЙТА ИЛИ ЖЕ РАНДОМНАЯ ДАТА. ПО ЖЕЛАНИЮ СЕО }; console.log(review); reviews.push(review); } const json = { "@context": "https://schema.org", "@type": "LocalBusiness", "image": logo_img, "name": titleSyte, "review": reviews, "url": currentUrl, "telephone": phone, "address": { "@type": "PostalAddress", "streetAddress": address, "addressLocality": city, "addressRegion": region, // или parameters.region или что нужно для СЕО, в данном примере сити "addressCountry": addressCountry }, "aggregateRating": { "@type": "AggregateRating", "bestRating": "5", // Выставляем значения нужные для СЕО "worstRating": "1", // Выставляем значения нужные для СЕО "ratingCount": reviews.length.toString(), "ratingValue": "4.5" // Выставляем значения нужные для СЕО } }; script.textContent = JSON.stringify(json); document.head.appendChild(script); } } // Video function createVideo(parameters) { if (parameters.descriptionVideo && parameters.title && parameters.contentUrl && parameters.posterUrl) { var descriptionVideo = document.querySelectorAll(parameters.descriptionVideo), title = document.querySelectorAll(parameters.title), contentUrl = document.querySelectorAll(parameters.contentUrl), posterUrl = document.querySelectorAll(parameters.posterUrl), script = document.createElement('script'), id = 1; wrapperVideo = []; script.type = 'application/ld+json'; if (title.length > 0 && contentUrl.length > 0) { for (let i = 0; i < title.length; i++) { var titleVideo = title[i].innerText; if (descriptionVideo.length > 0) { descriptionVideo = descriptionVideo[i].innerText; } if ( contentUrl[i].src) { contentUrl = contentUrl[i].src } else { contentUrl = contentUrl[i].href }; if (posterUrl[i]) { if (posterUrl[i].poster) { posterUrl = posterUrl[i].poster } if (posterUrl[i].hasAttribute('src')) { posterUrl = posterUrl[i].getAttribute('src'); } } const videoJSON = { "@type": "ListItem", "position": id, "item": { "@type": "VideoObject", "@id": `#video${id++}`, "name": titleVideo, "description": descriptionVideo, "thumbnailUrl": posterUrl, "duration": "PT5M17S", "contentUrl": contentUrl, "uploadDate": "2020-03-25", "url": currentUrl } }; wrapperVideo.push(videoJSON); } const json = { "@context": "https://schema.org", "@type": "ItemList", "itemListElement": wrapperVideo }; script.textContent = JSON.stringify(json); document.head.appendChild(script); } } } if (options.createMedicalOrganization) { createMedicalOrganization(MedicalOrganizationParameters); } if (options.createWebSite) { createWebSite(); } if (options.createBreadcrumbList) { createBreadcrumbList(BreadcrumbListParameters); } if (options.createFAQPage) { createFAQPage(FAQPageParameters); } if (options.createMedicalScholarlyArticle) { createMedicalScholarlyArticle(MedicalScholarlyArticleParameters); } if (options.createProduct) { createProduct(ProductParameters); } if (options.createPhysician) { createPhysician(PhysicianParameters); } if (options.createReview) { createReview(ReviewParameters); } if (options.createVideo) { createVideo(VideoParameters); } }