-
Notifications
You must be signed in to change notification settings - Fork 894
Yoast SEO product sheet
Below you will find a draft containing a product specification for Yoast SEO. It starts with a general specification, describing the functionality a Yoast SEO module should always guarantee, regardless of the platform for which it has been built. Further down you will find more platform specific requirements.
- Yoast SEO: general specification
- Magento SEO
Some things need to work out of the box when the module is enabled.
- The site needs to have pretty permalinks. System permalinks should refer to their human readable equivalents through canonicals.
- Every page needs to have a rel="canonical" that defaults to its generated pretty url. See rel=canonical: the ultimate guide on Yoast.com.
- The site needs to handle paginated content well. Paginated content should have
rel="next"
and/orrel="prev"
tags. See Google's documentation on paginated content. - Searchresults and archive pages that should be public should have meta robots tags
noindex, follow
. - Category pages which are paginated should index all pages in the series (previous advice suggested that only the first page should be indexed).
For onpage SEO two sides should be covered:
- On the technical side, SEO metadata needs to be included in the head of every page. This also includes social metadata like OpenGraph and Twitter metadata.
- On the content side, the user should be able to optimize content for SEO. For this we have built a fully client side content analysis tool.
For each page, a user needs to be able to set the following metadata:
<title>
-
content
: SEO title field in Yoast Snippet editor. -
if empty,
content
: Title of the page. <meta name="description">
-
content
: The meta description field in the Yoast Google Snippet editor - exclude if empty.
<meta property="og:locale" />
-
content
: Locale of the content. - exclude if empty
<meta property="og:type" />
-
if homepage,
content
: website -
if singular content (post, page or equivalent),
content
: article -
if archive or portal,
content
: object <meta property="og:title" />
-
content
: Facebook title field. -
if empty,
content
: SEO title field in Yoast Snippet editor -
if empty,
content
: Title of the page. <meta property="og:description" />
-
content
: Facebook description field. -
if empty,
content
: Metadescription field in Yoast Snippet editor -
if empty,
content
: Excerpt of the content - exclude if empty
<meta property="og:url" />
-
content
: The canonical url of the page <meta property="og:image" />
-
content
: The Facebook image field. - if empty, Main or featured image for the content.
- if empty, Images present in the content.
<meta name="twitter:description" />
-
content
: Twitter description field. -
if empty,
content
: Facebook description field. -
if empty,
content
: Metadescription field in Yoast Snippet editor -
if empty,
content
: Excerpt of the content - exclude if empty
<meta name="twitter:title" />
-
content
: Twitter title input field. -
if empty,
content
: Facebook title input field. -
if empty,
content
: SEO title field in Yoast Snippet editor -
if empty,
content
: Title of the page. <meta name="twitter:image" />
-
content
: The Twitter image field. -
if empty,
content
: The Facebook image field. -
if empty,
content
: Main or featured image for the content. -
if empty,
content
: Images present in the content.
As a site owner, I want to be able to set the following metadata globally:
<meta property="og:site_name" />
-
content
: The sitename <meta property="fb:admins" />
-
content
: List of the website's Facebook page admin ids (comma separated). <meta property="fb:pages" />
-
content
: Facebook page id. <meta name="twitter:card" />
-
content
: The selected twitter card type. - Supported types:
-
summary
(Summary) -
summary_large_image
(Summary with large image) - See Twitter docs on card types
<meta name="twitter:site" />
-
content
: The Twitter handle of the Twitter profile associated with the site (also used forPeople
andOrganization
structured metadata).
Optionally, we might also want to include a few options for setting the robots meta.
- As an advanced user, I want to be able to set the following
<meta name="robots">
tags for every page: -
index
/noindex
-
follow
/nofollow
noodp
noimageindex
noarchive
nosnippet
- As an advanced user, I need to be able to set the
canonical
url for every page.
For content & readability analysis, we've built a tool called YoastSEO.js. It's able to analyze content for a whole range of SEO, accessibility and readability checks.
Example of the SEO & accessibility checks
Example of the readability checks
YoastSEO.js also contains a Google snippet editor which contains a preview of how the page will (probably) be displayed in Google desktop or mobile search and an editor in which users can edit the title, slug and meta description intuitively.
Snippet editor (desktop)
Snippet editor (mobile)
These UI elements should be integrated into the content editing experience and should update in a realtime or semi-realtime manner. For inspiration, implementors are recommended to take a look at how these elements are integrated in Yoast SEO for WordPress.
- An
ld+json
script should be output in the head of the home page (possibly also about page?) containing structuredWebsite
metadata. - As a site owner, I should be able to set a
name
(Sitename) and analternateName
(Alternate name) for my site. - If my site has public search functionality, a
SearchAction
should be automatically added giving Google the possibility to put a searchbox in its searchresults, allowing people to search on my site straight from Google. See Google's Sitelinks Searchbox documentation.
{
"@context":"http:\/\/schema.org",
"@type":"WebSite",
"url":"https:\/\/yoast.com\/",
"name":"Yoast",
"alternateName":"Yoast.com",
"potentialAction":{
"@type":"SearchAction",
"target":"https:\/\/yoast.com\/?s={search_term_string}",
"query-input":"required name=search_term_string"
}
}
- An
ld+json
script should be output in the head of the home page (possibly also about page?) containing structuredPerson
orOrganization
metadata. - As a site owner, I should be able to tell Yoast SEO if my site represents a
Person
(Person) or anOrganization
(Company). - For a
Person
, I need to be able to set a name. - For an
Organization
, I need to be able to set a name and upload a logo. - For both a
Person
orOrganization
, I need to be able to set the social profiles associated with it, which will be output in thesameAs
property of the structured metadata. The following social profiles should be included (none are required): - Youtube
- Myspace
- Google+
{
"@context":"http:\/\/schema.org",
"@type":"Person",
"url":"http:\/\/person.example.org\/",
"sameAs":[
"https:\/\/www.facebook.com\/examplePerson",
"https:\/\/instagram.com\/examplePerson\/",
"https:\/\/www.linkedin.com\/company\/person.example.com",
"https:\/\/plus.google.com\/+ examplePerson\/posts",
"https:\/\/myspace.com\/examplePerson",
"https:\/\/www.youtube.com\/examplePerson",
"https:\/\/www.pinterest.com\/examplePerson",
"https:\/\/twitter.com\/examplePerson"
],
"name":"John Doe",
}
{
"@context":"http:\/\/schema.org",
"@type":"Organization",
"url":"https:\/\/yoast.com\/",
"sameAs":[
"https:\/\/www.facebook.com\/yoast",
"https:\/\/instagram.com\/yoast\/",
"https:\/\/www.linkedin.com\/company\/yoast.com",
"https:\/\/plus.google.com\/+Yoastcom\/posts",
"https:\/\/myspace.com\/yoast",
"https:\/\/www.youtube.com\/yoast",
"https:\/\/www.pinterest.com\/yoast",
"https:\/\/twitter.com\/yoast"
],
"name":"Yoast",
"logo":"https:\/\/yoast-mercury.s3.amazonaws.com\/uploads\/2013\/02\/Yoast_Icon_Large_RGB.png"
}
- Magento's standard CMS functionality can be somewhat compared to WordPress in terms of content management because content is edited in one field only. Therefore the Yoast content analysis will be easy to integrate in the standard CMS functionality.
- Nice to have: there are a lot of modules that extend Magento's basic CMS functionality. Some add custom fields to the content editing experience. It would be nice to integrate with the most used amongst these modules.
- Products are not part of Magento's CMS functionality. These are in fact built up out of a pretty much endless set of fields. To integrate the content analysis for product detail pages, the approach that was chosen is to create a template for analysis in which we load a standard set of fields in logical positions. The template is then fed to the content analysis and analyzed for SEO and readability.
- Product category pages can be content only, product only (often with content widgets) or contain both content and a list of products. We should probably only integrate our content analysis for product category pages that contain content.
- Every variant to a product can have its own page or only be visible through a product page of a configurable product (a product with many variants i.e. different sizes and colors) or a bundle. One could think of a red XL shirt which is a separate product but is only shown on the product page for "shirt" as a variant.
- In case a product that is a variant to a configurable product does have its own page, should it canonicalize to the configurable product's page?
- It would probably be a good idea to add structured metadata for
Product
. The idea is to only add properties that Google actually looks at.offers
andreview
seem like good candidates. What else? - Magento is licensed under OSL. We should check if there are any compatibility issues with GPLv3 that might bite us.