{"id":29,"date":"2026-09-17T21:24:58","date_gmt":"2026-09-17T21:24:58","guid":{"rendered":"https:\/\/wpcontentwriter.com\/kb\/schema-markup-for-ai-search\/"},"modified":"2026-09-17T21:24:58","modified_gmt":"2026-09-17T21:24:58","slug":"schema-markup-for-ai-search","status":"publish","type":"post","link":"https:\/\/wpcontentwriter.com\/kb\/schema-markup-for-ai-search\/","title":{"rendered":"Schema Markup for AI Search"},"content":{"rendered":"<p>Schema markup is structured data you add to a page so a machine can read its facts without inferring them from prose. It has been useful for search for a decade. For AI search it does something slightly different, and it is worth being precise about what.<\/p>\n<div class=\"kb-takeaway\">\n<span class=\"kb-takeaway__label\">What schema does and does not do<\/span><\/p>\n<p>It does not make a model rank you higher. What it does is remove ambiguity: the price, the author, the date, the organisation. A model that would otherwise guess from your prose gets told. Most of the value is in not being misdescribed.<\/p>\n<\/div>\n<h2>The types that earn their keep<\/h2>\n<p>There are hundreds of schema types. Four cover almost all of the useful cases for a product or documentation site.<\/p>\n<h3>Organization<\/h3>\n<p>Who you are, once, canonically. Name, URL, logo, and the social or reference profiles that describe the same entity elsewhere. This is the anchor for everything in <a href=\"\/kb\/entity-seo-for-wordpress\/\">entity SEO<\/a>, and if you add one thing, add this.<\/p>\n<h3>Article<\/h3>\n<p>For anything written: headline, author, publish date, modified date. The dates matter more than people expect, because a model handling a time-sensitive question has to choose between sources and will prefer one that states when it was written.<\/p>\n<h3>FAQPage<\/h3>\n<p>Question and answer pairs. The rule that trips people up: every question and answer must be visible on the page. Marking up a FAQ the reader cannot see is against the guidelines and is the fastest way to lose the enhancement.<\/p>\n<h3>Product \/ Offer<\/h3>\n<p>Price, currency, availability. If you sell something, this is where a model gets the number right rather than reading it off a comparison table it half-understood.<\/p>\n<h2>The rule that matters most<\/h2>\n<p>Schema must describe what is actually on the page. Not what you would like to be true, not a superset, not a rating you have not received.<\/p>\n<p>This is not only a guidelines question. A model that finds structured data contradicting the visible text has learned that your markup is unreliable, and it has no way to tell which half to trust. You are better off with no schema than with schema that disagrees with your own page.<\/p>\n<figure class=\"kb-figure\">\n<svg viewBox=\"0 0 640 200\" role=\"img\" aria-label=\"Schema that matches the page versus schema that contradicts it\">\n  <rect x=\"10\" y=\"30\" width=\"290\" height=\"130\" rx=\"10\" fill=\"#FFFFFF\" stroke=\"#A3E635\"\/>\n  <text x=\"26\" y=\"54\" font-size=\"12.5\" font-weight=\"600\">Agrees with the page<\/text>\n  <text class=\"fig-muted\" x=\"26\" y=\"78\" font-size=\"11\">Page: &#8220;$49.99 a month, 15 domains&#8221;<\/text>\n  <text class=\"fig-muted\" x=\"26\" y=\"96\" font-size=\"11\">Schema: price 49.99, USD<\/text>\n  <text x=\"26\" y=\"124\" font-size=\"11\">Model states it confidently,<\/text>\n  <text x=\"26\" y=\"140\" font-size=\"11\">and correctly.<\/text><\/p>\n<p>  <rect x=\"340\" y=\"30\" width=\"290\" height=\"130\" rx=\"10\" fill=\"#FFFFFF\" stroke=\"#FF6B35\"\/>\n  <text x=\"356\" y=\"54\" font-size=\"12.5\" font-weight=\"600\">Contradicts the page<\/text>\n  <text class=\"fig-muted\" x=\"356\" y=\"78\" font-size=\"11\">Page: &#8220;$49.99 a month, 15 domains&#8221;<\/text>\n  <text class=\"fig-muted\" x=\"356\" y=\"96\" font-size=\"11\">Schema: price 29.00, &#8220;unlimited&#8221;<\/text>\n  <text x=\"356\" y=\"124\" font-size=\"11\">Model picks one at random,<\/text>\n  <text x=\"356\" y=\"140\" font-size=\"11\">or trusts neither.<\/text>\n<\/svg><figcaption>The failure on the right is usually accidental: schema added once and never updated when the price changed.<\/figcaption><\/figure>\n<h2>Adding it in WordPress<\/h2>\n<p>Most SEO plugins emit Organization and Article schema already, and some emit FAQPage from a block. Check what you have before adding more, because two plugins each emitting an Organization block gives a parser two competing answers.<\/p>\n<p>For anything custom, a small <code>wp_head<\/code> hook is clearer than a plugin:<\/p>\n<pre><code>add_action('wp_head', function () {\n    if (! is_singular('post')) {\n        return;\n    }\n\n    $schema = [\n        '@context'      =&gt; 'https:\/\/schema.org',\n        '@type'         =&gt; 'Article',\n        'headline'      =&gt; get_the_title(),\n        'datePublished' =&gt; get_the_date('c'),\n        'dateModified'  =&gt; get_the_modified_date('c'),\n        'author'        =&gt; [\n            '@type' =&gt; 'Organization',\n            'name'  =&gt; get_bloginfo('name'),\n        ],\n    ];\n\n    echo '&lt;script type=\"application\/ld+json\"&gt;'\n        . wp_json_encode($schema)\n        . '&lt;\/script&gt;';\n});<\/code><\/pre>\n<p>Note what that does not do: it does not hardcode the headline or the dates. Every value is read from the post. A schema block with literals in it is a schema block that will eventually describe a different page than the one it is on.<\/p>\n<p>The knowledgebase you are reading takes this further for FAQs. Rather than accepting a JSON-LD block written by hand, the theme reads the rendered FAQ out of the article and generates the <code>FAQPage<\/code> schema from it. The two cannot disagree, because one is derived from the other.<\/p>\n<h2>Validating it<\/h2>\n<ul>\n<li>Google&#8217;s Rich Results Test, for whether an enhancement is eligible.<\/li>\n<li>Schema.org&#8217;s own validator, for whether the markup is structurally valid.<\/li>\n<li>Your own eyes, for whether it matches the page. No tool checks that, and it is the failure that actually happens.<\/li>\n<\/ul>\n<div class=\"kb-faq\">\n<h2>Common questions<\/h2>\n<details>\n<summary>Does schema markup improve AI search visibility?<\/summary>\n<p>Not as a ranking signal, as far as anyone outside these companies can tell. What it improves is accuracy: the facts a model states about you are more likely to be right. On a pricing or product page that is worth more than a small ranking nudge.<\/p>\n<\/details>\n<details>\n<summary>JSON-LD, microdata or RDFa?<\/summary>\n<p>JSON-LD. It sits in a script tag, separate from your markup, so a template change cannot break it and it does not clutter the HTML. Google recommends it and everything else reads it.<\/p>\n<\/details>\n<details>\n<summary>Can I mark up a FAQ that is collapsed behind a toggle?<\/summary>\n<p>Yes. Content inside a details element or an accordion counts as visible, because the reader can open it. Content hidden with display:none and no way to reveal it does not.<\/p>\n<\/details>\n<details>\n<summary>Will my SEO plugin conflict with hand-written schema?<\/summary>\n<p>It can. Two Organization blocks, or two Articles with different dates, leaves a parser choosing. Check your page source for existing JSON-LD before adding any, and prefer extending what the plugin emits over emitting a second copy.<\/p>\n<\/details>\n<details>\n<summary>Is aggregateRating worth adding?<\/summary>\n<p>Only if you genuinely have ratings, collected from real people, displayed on the page. Inventing them is both a guidelines violation and the kind of thing that is trivially checkable by anyone who cares to look.<\/p>\n<\/details>\n<\/div>\n<h2>Where to go next<\/h2>\n<p><a href=\"\/kb\/entity-seo-for-wordpress\/\">Entity SEO for WordPress<\/a> is what Organization schema is in service of.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Schema markup is structured data you add to a page so a machine can read its facts without inferring them from prose. It has been useful for search for a decade. For&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-29","post","type-post","status-publish","format-standard","hentry","category-technical"],"_links":{"self":[{"href":"https:\/\/wpcontentwriter.com\/kb\/wp-json\/wp\/v2\/posts\/29","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wpcontentwriter.com\/kb\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wpcontentwriter.com\/kb\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wpcontentwriter.com\/kb\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wpcontentwriter.com\/kb\/wp-json\/wp\/v2\/comments?post=29"}],"version-history":[{"count":0,"href":"https:\/\/wpcontentwriter.com\/kb\/wp-json\/wp\/v2\/posts\/29\/revisions"}],"wp:attachment":[{"href":"https:\/\/wpcontentwriter.com\/kb\/wp-json\/wp\/v2\/media?parent=29"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wpcontentwriter.com\/kb\/wp-json\/wp\/v2\/categories?post=29"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wpcontentwriter.com\/kb\/wp-json\/wp\/v2\/tags?post=29"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}