Schema Markup in WordPress: What's Worth Adding
Which structured data types actually earn you something in search, how to add them to WordPress without duplicating, and the mistakes that trigger warnings.

Structured data is a machine-readable description of what a page contains, written in a vocabulary search engines agree on. On WordPress it's usually output as JSON-LD in a script tag, either by your SEO plugin or by your theme.
There's a lot of advice suggesting you should mark up everything. You shouldn't. Here's the subset that earns its keep, and how to add it without creating a mess.
What schema actually does for you
It does two things. First, it can change the appearance of your search result — star ratings, FAQ dropdowns, breadcrumbs above the title, prices and availability on products. That affects click-through, which is worth real traffic.
Second, and less visibly, it removes ambiguity. It tells a search engine that this string is an author and that one is a publication date, rather than leaving it to infer from markup. For entity-heavy content — people, organisations, products, events — that clarity compounds.
What it doesn't do is improve your ranking directly. A page with perfect markup and thin content still loses to a better page without any.
The types worth having on a WordPress site
- Organization or Person for the site itself, with a logo, contact details and sameAs links to real profiles. This is the foundation everything else references.
- WebSite, which is what enables a sitelinks search box and ties the site together as an entity.
- BreadcrumbList matching the breadcrumbs you actually display. This is one of the most reliably rendered enhancements.
- Article or BlogPosting on posts, with headline, author, datePublished, dateModified and an image.
- FAQPage where a page genuinely contains questions and answers visible to the reader.
- Product with offers and aggregateRating for ecommerce, which drives the price and availability shown in results.
- LocalBusiness for a business with a real address or service area, including opening hours and geographic coverage.
Types that usually aren't worth the effort
HowTo and several other rich result types have had their search appearance reduced or removed over time, so marking them up now buys you the semantic clarity and not much else. Review snippets on self-serving reviews — a business reviewing its own products or services — are explicitly against the guidelines and can earn a manual action.
Speakable, Course, and the long tail of niche types are worth adding only if you have a concrete reason. Marking up everything the vocabulary allows produces a large JSON blob that nobody reads and that you now have to keep accurate.
The golden rule: mark up what's visible
Structured data must describe content that a visitor can actually see on the page. FAQ markup for questions that aren't displayed, a rating you invented, an author who doesn't appear — these are all violations, and Google acts on them.
The penalty isn't subtle: rich results get removed for the site, sometimes with a manual action in Search Console. The upside from faking it is small and the downside is large.
This also means the markup has to stay in sync with the page. If your FAQ block is generated from the same data as the schema, it can't drift. If someone hand-writes both, it will.
Avoiding duplicate and conflicting schema
This is the single most common WordPress schema problem. An SEO plugin outputs Article markup, the theme outputs its own Article markup, and a third plugin adds breadcrumbs — so the page has three overlapping graphs with different values.
Search engines will generally pick one, but you have no control over which, and the conflicting values can produce warnings in testing tools that mask real issues.
- Decide on one source of schema for the site: the SEO plugin, the theme, or your own code. Then disable the others.
- Most SEO plugins have a schema settings panel where you can turn types off. Most themes that emit schema have a filter or setting to disable it.
- Use @id references to connect nodes rather than repeating the same organisation details in five places.
- Test after every plugin change — a new plugin adding its own markup is a common cause of schema suddenly breaking.
Adding your own markup
If you're writing schema yourself, output JSON-LD in a script tag rather than using microdata attributes in the HTML. It's separate from your markup, so a design change doesn't break it, and it's far easier to read and debug.
Generate it from the same data the page renders. In a WordPress theme that means building the JSON from the post object, the ACF fields, the product data — not from a hard-coded template with placeholders. Generated markup can't contradict the page; hand-written markup eventually will.
Escape it properly. A less-than character inside a JSON string can close the script tag early and break the page, which is a genuinely confusing bug to track down.
Testing and monitoring
- Google's Rich Results Test tells you which enhancements a page is eligible for, which is the question that actually matters.
- The Schema Markup Validator checks the vocabulary more broadly, including types Google doesn't use.
- Search Console's Enhancements reports show errors and warnings across the whole site over time — that's where you'll notice a plugin update breaking things.
- Test a representative page of each template, not just the homepage. Product, article, category and contact pages all differ.
- Re-test after plugin updates and theme changes. Schema breaks silently.
Errors versus warnings
Testing tools distinguish between the two, and it's worth taking seriously. An error means the markup isn't valid for that type and the enhancement won't be shown. A warning means a recommended property is missing — the markup still works, but it may be eligible for less.
Fix errors promptly. Treat warnings as a to-do list rather than an emergency; adding a recommended property is often trivial, but not every warning is worth chasing on every page.
A sensible setup
For most WordPress sites: let one SEO plugin handle Organization, WebSite, BreadcrumbList and Article, configured with real values rather than defaults. Add Product schema through WooCommerce if it's a store, and LocalBusiness if there's a physical presence. Add FAQPage only on pages that display an FAQ.
Then leave it alone and check Search Console's enhancement reports occasionally. Schema is a set-up-once job that people spend far more time on than it repays.
Frequently asked questions
Does schema markup improve rankings?
Not directly. It can change how your result appears — breadcrumbs, FAQ dropdowns, prices, ratings — which affects click-through rate, and it helps search engines understand entities on the page. But a well-marked-up thin page still loses to a better page with no markup at all.
Can I add FAQ schema to any page?
Only to pages that visibly display those questions and answers to readers. Adding FAQ markup for content that isn't on the page is a guidelines violation and can cost you rich results across the whole site. If you want the markup, put a real FAQ section on the page.
Why does my page have two sets of schema?
Almost always an SEO plugin and the theme both emitting it, sometimes with a third plugin adding breadcrumbs. Pick one source, disable the others in their settings, and re-test. Conflicting values also generate warnings that hide genuine problems.
JSON-LD or microdata?
JSON-LD, which is what Google recommends. It sits in a script tag separate from your markup, so a design change can't break it, and it's far easier to read and debug than attributes scattered through the HTML. Microdata still works but there's no reason to choose it now.
How do I know if my structured data is working?
The Rich Results Test tells you which enhancements a specific page qualifies for. Search Console's Enhancements reports show errors and warnings across the site over time, which is where you'll spot a plugin update silently breaking things. Test one page per template, not just the homepage.
Topics
- WordPress schema markup
- structured data WordPress
- JSON-LD WordPress
- rich results