As we have discussed about Schema.org in Sitecore and its benefits in my previous blog. We will be exploring the implementation of schema.org on components.
In this blog, I am taking a scenario where I will be implementing Schema.org on the FAQ Accordion component in Sitecore
Prerequisites:
- Sitecore 9.1 and above
- SXA
For this component, I have added a paint bucket style for the Accordion (OOTB) component. The addition of this class will differentiate the Accordion component from the FAQ Accordion. This class (schema-accordion) can be used to fetch the data from the component.
How to implement Schema.org in a Sitecore FAQ accordion
1. Create a paint bucket style for the Accordion (out of the box) component at sitecore/content/TenantName/SiteName/Presentation/Styles/Accordion. I named the style Schema Accordion and the value (class name) as schema-accordion. Allowed rendering can be added to make the style rendering specific.
2. Add the Accordion component to any page and create a data source.
3. Add the style (Schema Accordion) we have created to the rendering
4. Create a rendering variant of Page Content rendering for Heading, Title, and Content. Add Scriban to the rendering variant and add the following code to the Scriban:
For the Heading:
{{ if (o_pagemode.is_experience_editor_editing) }} {{ sc_field i_item "Heading" }} {{ else }} <div class="field-heading">{{ i_item.Heading.raw }}</div> {{ end }}
For the Title:
{{ if (o_pagemode.is_experience_editor_editing) }} {{ sc_field i_item "Heading" }} {{ else }} <p class="faq-question" itemprop={{i_item.name}}> {{ i_item.Heading.raw }} </p> {{ end }}
For the Content:
{{ if (o_pagemode.is_experience_editor_editing) }} {{ sc_field i_item "Content" }} {{ else }} <div itemscope itemprop="acceptedAnswer" itemtype="https://schema.org/Answer"> <div class="faq-answer" itemprop="text"> {{ i_item.Content.raw }} </div> </div> {{ end }}
5. Add the following code to your JavaScript file so that the schema will get added to the component
function insertScript(tagToAdd, tags = null, updatedScript, deleteOtherNodes = false) { if (!tagToAdd) return; var headElement = document.getElementsByTagName(tagToAdd)[0]; if (tags && tags.length > 0) { document.getElementsByTagName(tagToAdd)[0].replaceChild(updatedScript, tags[0]); if (!deleteOtherNodes) return; for (let i = 1; i < tags.length; i++) { headElement.removeChild(tags[i]); } } else { headElement.appendChild(updatedScript); } } const accordion = document.querySelector(".accordion.schema-accordion"); var accordionItems = accordion.querySelectorAll("ul li"); var accordionList = []; accordionItems && accordionItems.forEach((items, index) => { var question = accordionItems[index].querySelector(".toggle-header .field-heading").innerText; var answer = accordionItems[index].querySelector(".toggle-content .field-content").innerText; accordionList.push({ "@@type": "question", "name": question, "acceptedAnswer": { "@@type": "answer", "text": answer } }); }); var schemaMarkup = "[{ \"@@context\": \"https://schema.org/\", \"@@type\": \"FAQPage\", \"mainEntity\":" + JSON.stringify(accordionList) + "}]"; var prevTagss = document.getElementsByTagName('head')[0].querySelectorAll("script[type="application/ld+json""); prevTagss = Array.from(prevTagss); prevTagss = prevTagss.filter((p) => p.innerHTML.indexOf("@@graph") > -1); var newScriptt = document.createElement('script'); newScriptt.type="application/ld+json"; newScriptt.innerHTML = schemaMarkup; insertScript('head', prevTags, newScriptt, true);
Note: Make sure to use the class names you have used in your component.
6. The schema should appear in the <head> tag of the page and should look like this
By performing the above steps, Schema.org can be implemented in a Sitecore FAQ Accordion Component.
As this FAQ accordion is properly marked, this may be eligible to have a rich result on Search and an action on google assistant, which can help your site reach the right users.
I will be exploring more about schema.org and PowerShell scripts by which we can perform tedious tasks effortlessly. Stay tuned!