Skip to content

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:

  1. One generator per type. If Yoast already marks up Organization, do not switch on the same feature in another plugin.
  2. 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.
  3. 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"].
  • name and address: 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 documents validFrom and validThrough.

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

  1. Google's Rich Results Test: tells you which rich results the page can generate and lists errors and warnings14.
  2. The Schema Markup Validator: checks all the markup against the vocabulary, including types Google does not use15.
  3. Search Console: the rich result reports show errors across the whole site, grouped by type.
  4. The page source: search for application/ld+json and 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

  1. 1Yoast SEO for WordPress: Schema output, Yoast Developer Portal, accessed 7 October 2026.
  2. 2Configuration guide for Yoast SEO, Yoast, accessed 7 October 2026.
  3. 3Configuring Schema Markup in Rank Math for rich snippets, Rank Math, accessed 7 October 2026.
  4. 4Configuring the Schema Settings in All in One SEO, AIOSEO, updated 14 August 2026.
  5. 5class-wc-structured-data.php, WooCommerce (official repository), accessed 7 October 2026.
  6. 6General structured data guidelines, Google Search Central, updated 10 July 2026.
  7. 7Schema: API documentation, Yoast Developer Portal, accessed 7 October 2026.
  8. 8Structured data markup that Google Search supports, Google Search Central, updated 15 June 2026.
  9. 9Organization structured data, Google Search Central, updated 8 September 2026.
  10. 10Local business (LocalBusiness) structured data, Google Search Central, updated 8 September 2026.
  11. 11Latest Google Search documentation updates, Google Search Central, updated 1 October 2026.
  12. 12Simplifying the search results page, Google Search Central Blog, 12 June 2025.
  13. 13AI optimization guide, Google Search Central, updated 10 July 2026.
  14. 14Rich Results Test, Google, accessed 7 October 2026.
  15. 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/

Who writes this

SmoothSeen is a website audit tool that measures visibility in search engines and AI assistants and delivers reports under the agency's own brand.

This blog belongs to SmoothSeen: when an article discusses the product, it does so knowing the product is ours. Third-party figures link to their original source.

Change history

  • First version.

Keep reading

WordPress schema markup without duplicates