Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save jpigla/e63989983a5eeeb26dc9b1b82bafcb99 to your computer and use it in GitHub Desktop.
Save jpigla/e63989983a5eeeb26dc9b1b82bafcb99 to your computer and use it in GitHub Desktop.
dynamically add faq schema to your content
// h/t: https://pastebin.com/WzrQanMx
// Define the class for your questions and answers here.
// They should be marked up in a consistent manner.
var questionClass = 'question';
var answerClass = 'answer';
// Output schema to console. Set to `false` if adding via tag manager.
var logOutput = false;
(function(){
// Build Data
var questions = Array.from(document.getElementsByClassName(questionClass)).map(function(e){return e.textContent});
var answers = Array.from(document.getElementsByClassName(answerClass)).map(function(e){return e.textContent});
if (questions.length && answers.length){
var data = {
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": []
};
buildItem = (q,a) => {
var item = {
"@type": "Question",
"name": null ,
"acceptedAnswer": {
"@type": "Answer",
"text":null }
};
item['name'] = q;
item['acceptedAnswer']['text'] = a;
return item;
}
console.assert(questions.length == answers.length, {questions: questions.length, answers: answers.length, errorMsg: "Questions and Answers are not the same lengths"});
data['mainEntity'] = questions.map(function(q,i){return buildItem(q,answers[i])});
var script = document.createElement('script');
script.type = "application/ld+json";
script.innerHTML = JSON.stringify(data);
document.getElementsByTagName('head')[0].appendChild(script);
if (logOutput){
console.log(script.outerHTML);
}
}
})(document);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment