Yoast SEO includes an incredibly powerful implementation of structured data, which is a tool search engines use to better understand your website.
They have extensive documentation for extending it, and many plugins already integrate with it. For instance, if you are using WP Recipe Maker for recipes on your site, it will add the appropriate recipe schema to your Yoast SEO schema.
Genesis already includes structured data, also known as schema markup. You don’t want duplicate schema on the page, so you should use one or the other.
If you’re using Genesis 3.1 or later, Genesis’ schema will automatically disable if Yoast SEO schema is active. If you’re using Genesis 3.0 or earlier, you can install my Disable Genesis Schema plugin.
Here are some ways you might customize your schema:
- Disable Genesis schema
- Disable Yoast SEO schema
- Use both Genesis and Yoast SEO schema
- How Genesis schema works
- How Yoast SEO schema works
Customization Options
Disable Genesis schema
Genesis will only disable its schema if Yoast SEO is active and Yoast schema is enabled.
If you’re using a different plugin to add schema data, you can disable Genesis schema by adding this to your child theme’s functions.php file:
add_filter( 'genesis_disable_microdata', '__return_true' );
Plugin developers: If your plugin is outputting schema data and you’d like Genesis to automatically disable its schema, you can use the filter genesis_is_wpseo_outputting_jsonld
. Here’s the relevant function from /genesis/lib/functions/seo.php.
Disable Yoast SEO schema
If you would prefer keeping Genesis’ schema data, you can disable Yoast SEO’s schema data using the following code in your child theme’s functions.php file:
add_filter( 'wpseo_json_ld_output', '__return_false' );
This is a good option if you’ve already made customizations to the Genesis schema on your site and aren’t ready to rebuild that code to support Yoast’s structured data.
But if you’re like 99% of Genesis sites that haven’t modified the default schema, you’ll be better served switching over to Yoast SEO for schema data.
Use both Genesis and Yoast SEO schema
As described below in more detail, the Genesis schema describes more elements on the page than Yoast SEO.
Yoast focuses on only the schema search engines currently care about (the primary article on the page), while Genesis tries to describe all the elements on the page, like the Header, Navigation, Sidebar, Article, and Footer.
The code below will enable Genesis schema even when Yoast SEO is active, then selectively remove the Genesis schema that relates to the main article on the page.
I don’t believe there is any SEO benefit to this approach, but I’m asked how to do it often enough that I wanted to document it.
Add this code to your theme’s functions.php file:
// Tell Genesis that WP SEO is not outputting schema
add_filter( 'genesis_is_wpseo_outputting_jsonld', '__return_false' );
/**
* Selectively Disable Genesis Schema elements
* @author Bill Erickson
* @see https://www.billerickson.net/yoast-schema-with-genesis/
*/
function be_selectively_disable_genesis_schema() {
$elements = array(
'entry',
'entry-image',
'entry-image-widget',
'entry-image-grid-loop',
'entry-author',
'entry-author-link',
'entry-author-name',
'entry-time',
'entry-modified-time',
'entry-title',
'entry-content',
);
foreach( $elements as $element ) {
add_filter( 'genesis_attr_' . $element, 'be_remove_schema_attributes', 20 );
}
}
add_action( 'init', 'be_selectively_disable_genesis_schema' );
/**
* Remove schema attributes
*
*/
function be_remove_schema_attributes( $attr ) {
unset( $attr['itemprop'], $attr['itemtype'], $attr['itemscope'] );
return $attr;
}
How Genesis Schema works
Genesis uses an approach called microdata, which are data attributes attached to elements already on the page to describe those elements to search engines. For instance, your post title has itemprop="headline"
to tell search engines that this is the headline of the current article.
You can run into issues if you remove elements from the page because you’re also removing the schema data that’s attached to those elements. For instance, if you remove the author name from the top of the post, you also lose the structured data saying you’re the author of this post.
You also end up with many unconnected blocks of schema. Here’s the results of the Structured Data Testing Tool on an article on my site before the code change:
How Yoast SEO Schema works
Yoast SEO uses JSON-LD which is a newer and better approach to structured data (more information).
JSON is a lightweight method to structure data to share with search engines and others. Rather than scattering your Schema data throughout the page and making the search engine assemble it (e.g. microdata), you prepare a small block of code that tells search engines exactly what they need to know in one place.
The -LD part stands for Linked Data, which means you’re able to link all of the individual schema components together. In the screenshot above you can see everything is a separate block with microdata, but with JSON-LD it would follow a hierarchical structure. The Article is part of a WebPage which is part of a WebSite.
Here’s my structured data after disabling Genesis schema and using the latest version of Yoast SEO:
Mostafa says
Hi Bill.
I Use Yasr Plugin WordPress for Rich Snippet in my Site. But now Google Deleted my Star Rating in Search Result.
if i disable Yoast Shchema in my site is it returned?
Can You Help me?
Bill Erickson says
I’ve never used that plugin before. I recommend you contact the plugin author to see if (a) they can integrate their schema with Yoast (preferred), or (b) if disabling Yoast schema will restore the star ratings.
Jhon says
Hi Bill.
I found the information in your articles very useful.
I use Genesis on a site in English, Spanish and French and I want to assign the language to the Yoast SEO scheme through code in the theme functions, but I have two questions.
1) I have a code like the following:
“@type”: “Person”,
“@id”: “URL1”,
“name”: “Myname”,
“image”: {
“@type”: “ImageObject”,
“@id”: “URL2”,
“inLanguage”: “en-US”,
“url”: “URL3”,
“caption”: “Description”
},
“inLanguage”: “en-US”
The filter works for me with wpseo_schema_person to change the value of the inLanguage field in the last line of code.
The filter with wpseo_schema_imageobject does not work for me to change the value of the inner inLanguage field (subordinate to the ImageObject type).
Which string should I use in the filter?
2) I have to assign the site languages to the inLanguage field of the type Website.
Is the following form correct?
“inLanguage”: “en,es,fr”