If you have ever Googled a question and seen a result with expandable questions and answers right on the search page, you have seen FAQ rich results in action. They take up more space, they answer the searcher's question before the click, and pages that earn them tend to get clicked more often. The markup that makes them possible is called FAQ schema, and adding it to WordPress does not require a plugin at all.
In this guide we will walk through the whole process by hand: writing questions that qualify, generating the JSON-LD code, placing it in WordPress without installing anything, and validating that Google can read it.
FAQ schema is a piece of structured data, written in a format called JSON-LD, that tells Google "this page contains a list of questions and answers." When Google understands your Q and A pairs, the page becomes eligible for FAQ rich results: those expandable dropdowns beneath your listing in the search results.
A quick reality check: Google has narrowed when it shows FAQ rich results, and these days they appear mostly for well-known, authoritative sites. That does not make the markup pointless. Structured data still helps Google understand your content, and you cannot win a rich result you are not eligible for.
The other thing to know is that FAQ schema has a strict rule: the questions and answers in your markup must be visible on the page itself. Marking up content that visitors cannot see is against Google's guidelines and can get the rich result removed.
The manual approach needs nothing beyond what WordPress already gives you:
One more consideration: if the same FAQ content appears on many pages, decide which page is the canonical version. Search engines dislike seeing identical FAQ blocks scattered across dozens of URLs, so make sure each page has a proper canonical URL pointing at the version you want indexed.
Not every Q and A qualifies. Google's guidelines for FAQ pages are specific, and following them from the start saves you a failed validation later:
JSON-LD is just a script tag containing structured data. Here is what a finished FAQPage block looks like for two questions:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "How long does shipping take?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Standard shipping takes 3 to 5 business days within the country. Express shipping is available at checkout and arrives in 1 to 2 business days."
}
},
{
"@type": "Question",
"name": "Can I return a product?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes. You can return any unused product within 30 days of delivery for a full refund. Start your return from the order history page in your account."
}
}
]
}
</script>
The structure is simple once you see it: a FAQPage containing a list of Question objects, each with a name and an acceptedAnswer. Rather than typing this by hand and risking a misplaced comma, generate it with our free schema markup generator. Select the FAQ type, paste in your questions and answers, and it produces valid JSON-LD you can copy.
You have two clean options, depending on how comfortable you are with theme files.
Option A: the Custom HTML block (easiest). In the block editor, add a Custom HTML block at the end of your post or page, paste the entire script tag into it, and update the page. WordPress outputs the block's contents verbatim, so the JSON-LD lands in the page source exactly as generated. This is the best choice when only a few pages need FAQ markup.
Option B: your child theme's functions.php (for many pages). If you run FAQs across dozens of posts, editing each one is tedious. Instead, hook the markup into the page head conditionally:
add_action('wp_head', function () {
if (is_single(42)) { // replace 42 with your post ID
echo '<script type="application/ld+json">';
echo '{"@context":"https://schema.org","@type":"FAQPage",';
echo '"mainEntity":[{ ... your questions here ... }]}';
echo '</script>';
}
});
The is_single() check ensures the markup only appears on the page it belongs to. Always use a child theme for this, so a theme update does not wipe out your code. Never paste the script into a paragraph block: the editor will escape it and it will render as visible text.
Never assume the code is correct; check it with Google's own tools. Open the Rich Results Test, enter your page URL, and look for the FAQ item in the detected structured data. It should show your questions with zero errors. For a second opinion, run the same URL through the Schema Markup Validator too.
Common validation failures and their fixes:
While you are in validation mode, it is worth checking the rest of the page's on-page basics too. A quick run through a meta tags analyzer confirms your title, description, and Open Graph tags are in shape alongside your new structured data.
Most FAQ schema problems come from a short list of avoidable errors:
Structured data only helps if Google crawls the page that carries it. After adding FAQ schema, make sure your sitemap reflects the changes so crawlers discover updated pages promptly. If you do not have a current sitemap, generate one with a free XML sitemap generator and submit it in Search Console.
Adding FAQ schema without a plugin is a fifteen-minute job: write honest questions, generate the JSON-LD, paste it into a Custom HTML block or your child theme, and validate. No extra plugin means no extra updates, no performance overhead, and no dependency on a third party to keep your markup working. Do it for the pages where real questions live, keep the answers current, and you will be eligible for rich results whenever Google decides to show them.
Ready to build your markup? Generate valid FAQPage JSON-LD in seconds with our free schema markup generator, no signup required.
No. You can paste JSON-LD markup into a Custom HTML block in the editor, or hook it into your child theme's wp_head for sitewide control. A plugin only adds convenience; the markup itself is just a script tag that WordPress outputs verbatim.
No. Schema makes your page eligible for FAQ rich results, but Google decides whether to display them, and it currently shows them mainly for well-known, authoritative sites. The markup is still worth adding because it helps Google understand your content and keeps you eligible.
You should not. Google's guidelines expect the FAQPage markup to live on the page where the questions naturally belong, and the marked-up content must be visible on that page. Duplicating identical FAQ blocks across many pages looks manipulative and can cost you eligibility.
FAQPage is for a static list of questions with answers provided by the site owner, like a support page. QAPage is for forum-style pages where users ask questions and the marked-up content must be visible on that page. Duplicating identical FAQ blocks across many pages looks manipulative and can cost you eligibility.
Enter the page URL in Google's Rich Results Test. It will list the FAQ structured data it detected, show each question, and flag any errors. Also verify in the page source that the JSON-LD script is present and that every question and answer in it is visible on the page.