WordPress schema markup: structured data with Yoast, Rank Math, AIOSEO and WooCommerce, without duplicates
Published 7 October 20268 min readBy the SmoothSeen editorial team
Schema markup on WordPress is nearly always generated by your SEO plugin and, on shops, by WooCommerce, which outputs Product markup out of the box. Use a single generator per type, make the markup say the same as the page, and focus on what Google still uses: Organization or LocalBusiness, Article, Product and BreadcrumbList.
Key points
- Yoast SEO outputs a graph on every page with the organisation or person, the website and the web page; Rank Math and All in One SEO assign a default type to posts and pages.
- WooCommerce outputs Product markup on every product page out of the box, with price, availability and ratings, plus BreadcrumbList if the theme shows breadcrumbs.
- Google stopped showing the FAQ rich result on 7 May 2026; HowTo had been retired since 2023, and in 2025 it retired Course Info, ClaimReview and Vehicle Listing, among others.
- The types that still pay off for a business are Organization or LocalBusiness, Article, Product and BreadcrumbList, the last one on desktop only.
- Google requires markup to be a true representation of the page: nothing marked up that visitors cannot see.
To check it on your own site: SEO audit
On this page
Structured data is a block of code, usually JSON-LD, that describes unambiguously what a page contains: who publishes it, which product it sells, where the business is. It uses the schema.org vocabulary. On WordPress it is rarely written by hand: the SEO plugin, WooCommerce and sometimes the theme generate it. The usual problem is not that it is missing, but that two sources say different things. This guide explains what each piece marks up, which types are still worth having according to Google, and how to check it.
What structured data does your WordPress site already output?
Before adding anything, look at what is already there. This table summarises what each project documents:
- Who
- Yoast SEO
- What it marks up
- A graph on every page with Organization (or Person), WebSite and WebPage, plus Article on posts, BreadcrumbList and ImageObject1
- Where to adjust it
- Settings > General > Site representation sets whether the site represents an organisation or a person2
- Who
- Rank Math
- What it marks up
- Article by default on posts and pages, plus whatever type you pick in each post's schema generator3
- Where to adjust it
- Rank Math SEO > Titles & Meta, per content type; the business itself in the Local SEO module3
- Who
- All in One SEO
- What it marks up
- The Knowledge Graph (organisation or person), Article on posts and WebPage on pages4
- Where to adjust it
- All in One SEO > Search Appearance > Global Settings4
- Who
- WooCommerce
- What it marks up
- Product on every product page (name, description, image, SKU, offer with price and availability, ratings and reviews), BreadcrumbList, and WebSite when the shop is the home page5
- Where to adjust it
- Filters such as
woocommerce_structured_data_product5
- Who
- The theme
- What it marks up
- Depends on the theme: some add their own microdata or JSON-LD
- Where to adjust it
- Its documentation or the page source
The risk of duplicate markup
The classic case: Yoast marks up the organisation, a "schema" plugin marks it up again with a different name and logo, and the theme adds a third version in microdata. Or, on a shop: WooCommerce publishes a Product with the sale price and a reviews plugin publishes another Product with the old price and its own stars.
Google does not ban multiple blocks, but it requires structured data to be a true representation of the page content6. Two blocks that say different things about the same entity cannot both be true. The rules that prevent almost every problem:
- One generator per type. If Yoast already marks up Organization, do not switch on the same feature in another plugin.
- Integrate rather than add. Yoast documents an API for adding pieces to its graph (
wpseo_schema_graph_pieces) and a filter to switch off its output altogether (wpseo_json_ld_output)7. WooCommerce has a filter for each type5. - Look at the real output. Open the source of a page and search for
application/ld+json. Count the blocks and note which type each declares.
Which schema types are still worth it according to Google?
Google has been retiring rich results. What remains in its gallery and makes sense for a typical WordPress site is this8:
- Type
- Organization
- What Google uses it for
- Organisation details such as the logo; it has no required properties, and Google recommends placing it on the home page or the "about us" page9
- Who generates it on WordPress
- The SEO plugin
- Type
- LocalBusiness (or a subtype such as
Dentist) - What Google uses it for
- Business details: address and name are required; phone, opening hours, coordinates and price range are recommended10
- Who generates it on WordPress
- The plugins' local business modules, or a hook
- Type
- Article
- What Google uses it for
- Understanding a post's headline, images, dates and author
- Who generates it on WordPress
- The SEO plugin
- Type
- Product and merchant listings
- What Google uses it for
- Price, availability and ratings in results and shopping experiences
- Who generates it on WordPress
- WooCommerce
- Type
- BreadcrumbList
- What Google uses it for
- The page's position in the site, shown in the result; desktop only since January 202511
- Who generates it on WordPress
- The SEO plugin or WooCommerce
And what no longer earns a rich result:
- HowTo: retired in September 2023; Google stopped showing it on desktop and mobile11.
- FAQ: Google restricted it in 2023 to well-known government and health sites and, according to its changelog, the FAQ rich result stopped appearing in Search on 7 May 2026; its documentation was removed in June11.
- The 2025 retirements: in June Google announced it was phasing out Book Actions, Course Info, ClaimReview, Estimated Salary, Learning Video, Special Announcement and Vehicle Listing, and said the change would not affect rankings12. Book Actions was later reprieved because a feature still uses that markup, and in November Practice Problem was added to the list, with Dataset now used only by Dataset Search11.
A rich result disappearing does not mean you have to delete the markup: Google says use of those types outside Search is unaffected12. But expect nothing from it in Google. On AI, Google is just as clear: no special markup is needed to appear in its generative AI features13.
A LocalBusiness JSON-LD added with a hook
If your SEO plugin has a local business module, use it: it keeps the data in one place. If not, this mu-plugin adds the markup for a fictitious dental practice on the home page via the wp_head hook. Save it as wp-content/mu-plugins/local-business.php and replace the details with your own:
<?php
/**
* Plugin Name: Business details (LocalBusiness)
* Description: Marks up the business on the home page with JSON-LD.
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
add_action( 'wp_head', function () {
if ( ! is_front_page() ) {
return;
}
$business = array(
'@context' => 'https://schema.org',
'@type' => 'Dentist',
'@id' => home_url( '/#business' ),
'name' => 'Example Dental Practice',
'url' => home_url( '/' ),
'image' => 'https://www.example.com/img/frontage.jpg',
'telephone' => '+44 20 7946 0000',
'priceRange' => '££',
'address' => array(
'@type' => 'PostalAddress',
'streetAddress' => '1 High Street',
'addressLocality' => 'London',
'postalCode' => 'SW1A 1AA',
'addressCountry' => 'GB',
),
'geo' => array(
'@type' => 'GeoCoordinates',
'latitude' => 51.501364,
'longitude' => -0.141890,
),
'openingHoursSpecification' => array(
array(
'@type' => 'OpeningHoursSpecification',
'dayOfWeek' => array( 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday' ),
'opens' => '09:00',
'closes' => '18:00',
),
),
);
echo '<script type="application/ld+json">'
. wp_json_encode( $business, JSON_UNESCAPED_UNICODE )
. "</script>\n";
} );Why it is written this way, property by property, against Google's documentation10:
@type: the most specific LocalBusiness subtype. If your business fits several, Google accepts a list:["Electrician", "Plumber"].nameandaddress: the only two required properties.geo: Google asks for at least five decimal places of latitude and longitude.priceRange: under 100 characters, or Google will not show it.openingHoursSpecification: days of the week plus opening and closing times. For holidays or seasonal closures, Google documentsvalidFromandvalidThrough.
And the rule that is broken most often: everything you mark up must be visible on the page. Google is blunt about it: do not mark up content that is not visible to readers6. If your opening hours only exist in the JSON-LD, write them on the home page or the contact page too. If your SEO plugin already outputs Organization, bear in mind this code adds a separate entity; the clean alternative is to set up the business in the plugin itself.
How to check it
- Google's Rich Results Test: tells you which rich results the page can generate and lists errors and warnings14.
- The Schema Markup Validator: checks all the markup against the vocabulary, including types Google does not use15.
- Search Console: the rich result reports show errors across the whole site, grouped by type.
- The page source: search for
application/ld+jsonand count the blocks. Two Organization or two Product blocks on the same page means a duplicate.
What SmoothSeen does with this
SmoothSeen reads the structured data on the page you analyse, identifies the page type and checks whether the markup matches it: Product on a product page, LocalBusiness on a business site, Article on a post. It also reviews local business details. The findings feed into both scores, search visibility and AI visibility, and turn into specific tasks in the action plan.
What to do this week
Open the source of your home page and of one post, search for application/ld+json and note which tool generates each block. If there are duplicates, switch one off; if the business is missing, set it up in your plugin or with the hook in this guide, then run it through the Rich Results Test. To review the markup alongside the rest of your technical SEO, run an SEO audit with SmoothSeen.
Frequently asked questions
Can I run Yoast SEO and Rank Math at the same time?
We would not recommend it. Both generate titles, meta descriptions, sitemaps and structured data, so you would end up with two schema graphs and two versions of the same tags. If you are migrating from one to the other, finish the migration, deactivate the old plugin and check the source of several templates to make sure only one structured data generator is left.
Is my plugin's FAQ block still worth using?
As content, yes: a good set of questions and answers deals with real doubts and helps readers. As a way to earn the FAQ rich result in Google, no, because it stopped appearing in May 2026. If the block adds FAQPage markup you can leave it in place; it does no harm, but it will not give you a special result in Google either.
Does schema help you appear in ChatGPT or AI Overviews?
Google says no special markup is needed for its AI features, although it recommends that structured data matches the visible text. OpenAI explains that ChatGPT takes structured product metadata, such as price and description, into account. Neither promises extra visibility for having schema: treat it as a way of making your data readable without ambiguity.
Why are my review stars not showing in Google?
Google sets conditions for stars: marked-up reviews must be visible on the page and come directly from users. On top of that, a business's own pages cannot show stars if the business controls the reviews about itself. Even when you meet every condition, Google decides whether to show the rich result; the markup only makes you eligible.
Sources
- 1Yoast SEO for WordPress: Schema output, Yoast Developer Portal, accessed 7 October 2026.
- 2Configuration guide for Yoast SEO, Yoast, accessed 7 October 2026.
- 3Configuring Schema Markup in Rank Math for rich snippets, Rank Math, accessed 7 October 2026.
- 4Configuring the Schema Settings in All in One SEO, AIOSEO, updated 14 August 2026.
- 5class-wc-structured-data.php, WooCommerce (official repository), accessed 7 October 2026.
- 6General structured data guidelines, Google Search Central, updated 10 July 2026.
- 7Schema: API documentation, Yoast Developer Portal, accessed 7 October 2026.
- 8Structured data markup that Google Search supports, Google Search Central, updated 15 June 2026.
- 9Organization structured data, Google Search Central, updated 8 September 2026.
- 10Local business (LocalBusiness) structured data, Google Search Central, updated 8 September 2026.
- 11Latest Google Search documentation updates, Google Search Central, updated 1 October 2026.
- 12Simplifying the search results page, Google Search Central Blog, 12 June 2025.
- 13AI optimization guide, Google Search Central, updated 10 July 2026.
- 14Rich Results Test, Google, accessed 7 October 2026.
- 15Schema Markup Validator, Schema.org, accessed 7 October 2026.
How to cite this article
SmoothSeen. (2026, October 7). WordPress schema markup: structured data with Yoast, Rank Math, AIOSEO and WooCommerce, without duplicates. https://smoothseen.com/en/blog/wordpress-schema-markup/
Keep reading
What is SEO? How search engine optimisation works and how to improve it in 2026
What SEO is, how Google decides which pages to show and a prioritised checklist to improve your rankings with free tools.
.htaccess force HTTPS: redirect to https, enable HSTS and add security headers in Apache
How to force HTTPS in .htaccess or an Apache VirtualHost, roll out HSTS safely and add security headers. Every snippet tested on Apache 2.4.69.
.htaccess gzip and Brotli: browser caching and blocking AI bots in Apache
How to enable gzip and Brotli, set browser caching and block AI training bots in Apache .htaccess without dropping out of ChatGPT search. Tested.