RDFa OfferCatalog Syntax - schema.org

I have been trying to find the best way to link two items together using RDFa, specifically linking a Person to multiple SoftwareApplication entries.
The way I currently do this on the author page is:
<div class="container text-center" vocab="http://schema.org/" typeof="Person">
...
<span property="hasOfferCatalog" typeof="OfferCatalog">
<meta property="numberOfItems" content="10" />
<span property="itemListElement" typeof="CreativeWork">
<meta property="name" content="Project Name" />
<meta property="url" content="https://www.my-domain.tld/ProjectName/" />
</span>
...
As above the project is actually a SoftwareApplication, and the URL has a complete RDFa/Schema.org definition of it, but if i put:
typeof="SoftwareApplication"
on the author's page then, kind of expectedly, Google's Structured Markup validator throws errors about required values not being present for it, CreativeWork throws no errors but is less specific. I don't really want to repeat the entire SoftwareApplication metadata everywhere the project is referenced, I'd rather just say "go look at this URL".
What is the correct/best way to cross reference the SoftwareApplication pages from the author page? in the project the reverse reference is easy as there is an Author attribute, which can be of type Person, which is acceptable with just name and URL.
Once I know the correct RDFa way of referencing I'll apply the tags to content in the page rather than using meta tags.

To link items together, you need a suitable property. Like author (to state which Person is the creator of the SoftwareApplication), or like hasOfferCatalog (to state which SoftwareApplication is offered by the Person).
Inverse properties
In most cases, Schema.org defines its properties only for one direction. So there is only author, and no authorOf. If you need the property for the other direction, you can use RDFa’s rev attribute.
Linking instead of repeating
If you don’t want to repeat your data (i.e., only define it once and link/refer to this definition instead), you can provide a URL value. Schema.org allows this for all properties, even if URL is not listed as expected type. If you want to follow Semantic Web best practices, give your entities URLs (as identifiers) with RDFa’s resource attribute, and use these URLs as property values to refer to the entities.
For this, simply use one of the linking elements (e.g., elements with href or src attribute).
Example
Using the author case as example:
<!-- on the page about the software: /software/5 -->
<div typeof="schema:SoftwareApplication" resource="/software/5#this">
Author:
<a property="schema:author" typeof="schema:Person" href="/persons/alice#i">Alice</a>
</div>
<!-- on the page about the person: /persons/alice -->
<div typeof="schema:Person" resource="/persons/alice#i">
Authored by:
<a rev="schema:author" typeof="schema:SoftwareApplication" href="/software/5#this">Software 5</a>
</div>
Errors in Google’s SDTT
If the Structured Data Testing Tool gives errors about missing properties, note that it doesn’t mean that something is wrong with your markup. Schema.org never requires a property.
It just means that these properties are required for getting a certain Google search feature. So ignore these errors if you don’t want to get the feature (or if you can’t provide all required properties).

Thank you for the other response, I'll have a read over the linked resources, I have also found a solution to the specific case in my question.
Google Search Console has a page on Carousels which shows that you can use ListItem, which only "needs" URL, to populate the hasOfferCatalog property. E.g.
<span property="itemListElement" typeof="ListItem">
<meta property="position" content="1" />
<meta property="url" content="https://www.my-domain.tld/ProjectName/" />
</span>

Related

Need Schema Microdata example of how to list 'required documention' of a organization or business?

Hello and thank you for the opportunity to post a question. I have searched the Internet, Schema.org and Stackoverflow for an answer to my question. Maybe I am not asking my question correctly... I have a directory website that lists various organizations and businesses. Almost all the Organizations are Government funded and require documentation from a client in order to receive services.
For example: 'Name of Food Bank, Address, Telephone, Description, Documentation required: Photo ID, Birth Certificate, Utility Bill, EBT card.' The same would be for a Hospital, Substance Use Program, Medical, Dental, etc.
I cannot find any schema for how to list the documentation that the organization requires from a client in order to be eligible for services. I'm sure it's got to be somewhere!
Most likely, there is a way, but for just one specific entity type. I need a way to use for any entity type.
My question is how would I use Microdata to list the (any) organizations/business 'Required Documentation' of a client?
I don't think there's such an option. You might start from what's it about.
From what you're saying, some companies offer some services. So we could use Service and LocalBusiness entities.
Customers need to provide documentation, which means it's an application, so we can use ApplyAction as the top/main entity, because that seems to be the point.
As for "required documentation", can't think of anything other than just list it in the description, as is.
Here's how it might look (ApplyAction that has a Service as an object, offered by one of the companies, with requirements listed in the description):
<div>
<div itemtype="http://schema.org/ApplyAction" itemscope>
<div itemprop="object" itemtype="http://schema.org/Service" itemscope>
<meta itemprop="serviceType" content="Hospital, Substance Use Program, Medical, Dental, etc." />
<meta itemprop="description" content="Documentation required: Photo ID, Birth Certificate, Utility Bill, EBT card" />
<div itemprop="provider" itemtype="http://schema.org/LocalBusiness" itemscope>
<meta itemprop="name" content="One of various organizations and businesses" />
</div>
</div>
</div>
</div>

Schema dot org and alternate languages

I have schema dot org markup on my website. But I also have an alternate language; each of my pages has a French version in a different page with proper hreflang tags.
Google's instructions don't really mention different languages, neither does schema dot org. For example, I have an "Organization" schema set up on the homepage. Do I need to translate it on the French homepage or leave it in English, and if so, do I change the URL to point to the French homepage as well? Wouldn't this cause Google to think there are two different organizations? Same question would apply to schemas like "Product".
hreflang not directly related to schema.org (That's why you didn't find any references on google/schema.org).
Schema.org is a set of extensible schemas that enables webmasters to
embed structured data on their web pages for use by search engines and
other applications. https://schema.org/
VS
Hreflang specifies the language and optional geographic restrictions
for a document. Hreflang - Google Support. The hreflang attribute on each page should include a reference to itself as well as to all the pages that serve as alternates for it https://moz.com/learn/seo/hreflang-tag.
Two pages example
**microdata (Same idea for JSON-LD). And the same idea to any schema.
Your English version
/en/about
<div itemscope itemtype="http://schema.org/LocalBusiness">
<h1><span itemprop="name">Hello World</span></h1>
<p itemprop="description">A superb collection of fine gifts and clothing
</div>
hreflang:
<link rel="alternate" href="http://example.com/en/about" hreflang="en" />
<link rel="alternate" href="http://example.com/fr/about" hreflang="fr-fr" />
Your French version
/fr/about
<div itemscope itemtype="http://schema.org/LocalBusiness">
<h1><span itemprop="name">Bonjour le monde</span></h1>
<p itemprop="description">Une superbe collection de beaux cadeaux et vêtements
</div>
hreflang:
<link rel="alternate" href="http://example.com/en/about" hreflang="en" />
<link rel="alternate" href="http://example.com/fr/about" hreflang="fr-fr" />
itemprop="name" above give extra semantic data about your LocalBusiness - each page use another language (Specify by Hreflang).
One of google guideline is:
Don't mark up content that is not visible to readers of the page. For
example, if the JSON-LD markup describes a performer, the HTML body
should describe that same performer. https://developers.google.com/search/docs/guides/sd-policies
Not official google answer about this topic - but its better to translate the JSON-LD data as well. By Wordpress or other CMS, it should be easy to pull the data.
Anyway, JSON-LD not related to site indexing (like hreflang -or- canonical). There is no need to change a URL because of a schema. You find reports (status/errors/rich results) about your schema under google search console - docs her.
Live example (From nike site):
English schema (rich card preview):
Data Testing tool
French schema (rich card preview):
Data testing tool
Follow the structured data guidelines of Google requires:
Relevance
Your structured data should be a true representation of the
page content.
as well as further
Location
Put the structured data on the page that it describes, unless
specified otherwise by the documentation. If you have duplicate pages
for the same content, we recommend placing the same structured data on
all page duplicates, not just on the canonical page.
Thus, if the information on your home page has a separate web page with duplicate content in French, then using structured data, you MUST set the content for data in French.
This is completely justified in terms of semantics. Google uses structured data to search for entities with API Google Knowledge Graph, for rich search results, for voice search, for machine learning. It is obvious that users using French in a web search is willing and will receive search results in French.

Why does Google Testing Tool use the "id" attribute to generate a URL for the Microdata item?

I'm using some Microdata to describe a blog post, and I'm surprised by the value return for Schema.org’s BlogPosting by the Google Developers Testing Tool.
I would have expected it to be the itemprop url, not a merge of the website URL and the item id.
Am I doing something wrong, or is it only a Google display issue?
<div itemscope="itemscope"
itemprop="blogPost"
itemtype="http://schema.org/BlogPosting"
id="foobar">
<a itemprop="url" href="/realone">real</a>
</div>
Value returned by https://developers.google.com/structured-data/testing-tool/:
BlogPosting: http://www.example.com/foobar
url: http://www.example.com/realone
This is strange.
It’s definitely not conforming to the Microdata Note. Apart from Microdata’s itemref attribute, HTML5’s id attribute has no special meaning in Microdata.
If Google wants to use the id value anyway, they should at least generate the URL with a fragment identifier, i.e., http://www.example.com/#foobar.
My guess is that they are (probably unintentionally) handling HTML5’s id attribute the same way as Microdata’s itemid attribute. If using itemid instead of id in your example, Google’s Testing Tool output is the same, but this time correct.

Using Schema.org’s "url" property on a Product page without adding a visual link

After a bit of research I found recommendations as in:
<div itemscope itemtype="http://schema.org/Product">
<a itemprop="url" href="URLOFPRODUCT">Link</a>
</div>
But I am trying to avoid linking to the product, on the product page.
Another approach I've noticed is the use of meta tags but outside the head, which is a big 'no no'.
Any suggestions?
For providing a URL in Microdata, you must use "a URL property element". Currently these are:
a, area, audio, embed, iframe, img, link, object, source, track, and video.
a and link are the only "generic" elements from this set.
If you don’t want to provide a visual link (by using a), go with link (which is typically hidden in browser default stylesheets). This is not "a big 'no no'", as link elements are allowed in the body if used for Microdata.

Google Rich Snippets .... for a recipe

I'm having a bit of a problem getting rich snippets shown properly on the testing tool for my site (I understand that Google can take some time / decisions as to if a result shows up on the actual site).
Here's an example Google Rich Snippets Result for one of my pages:
http://www.google.com/webmasters/tools/richsnippets?url=http%3A%2F%2Fwww.makemeacocktail.com%2Fcocktail%2F6741%2Fcosmopolitan%2F
Which is for this url:
http://www.makemeacocktail.com/cocktail/6741/cosmopolitan/
Everything looks good - but for some reason no image is shown with the example result. I'm a bit confused here. I have the correct meta tag in place:
<meta itemprop="image" content="http://images.makemeacocktail.com/cocktails/6741/cosmo_4.jpg" class="photo" />
But no image shown in the testing tool result?
As a side - is there anything else that needs including? It does seem to have everything that is required, but can't seem to get the image shown properly.
Not entirely true ... but it did lead me to the solution. For completeness here and if anyone wants to know a little more .....
I was using:
itemscope itemtype="http://schema.org/Recipe"
Where as google in their example pages:
http://support.google.com/webmasters/bin/answer.py?hl=en&answer=173379
Uses:
itemscope itemtype="http://data-vocabulary.org/Recipe"
Note the different itemtypes. Image was the correct itemtype for schema.org (not for data-vocabulary.org). If I changed my meta tag from:
<meta itemprop="image" content="http://images.makemeacocktail.com/cocktails/6741/cosmo_4.jpg" class="photo" />
to
<meta itemprop="photo" content="http://images.makemeacocktail.com/cocktails/6741/cosmo_4.jpg" class="photo" />
Google threw up errors that itemprop="photo" wasn't recognised in the schema.org.
The actual reason my page wasn't showing up a photo in the search results was because I had also used Microdata (I was using the Microdata hrecipe. Schema.org is a Microformat by the way).
My Microdata for the page was correct, but the class="photo" that is needed for Microdata was on a meta tag, where as it turns out you actually need the class="photo" on an actual 'img' tag for google to recognise it.
This also leads on to show that Google actually reads Microdata before Microformat - and gets me wondering whether having both on one page is useful at all. Ie Google was not recognising my correct schema.org image meta tag if hrecipe was present and the photo class not applied properly. So I wonder if Google use the Microformat information at all if Microdata is present.
A couple of open ended questions, but also the answer to the initial question. Hope that helps someone else in the future.
The image property in the recipe markup is called photo and not image:
http://support.google.com/webmasters/bin/answer.py?hl=en&answer=173379
Try replacing itemprop="image" with itemprop="photo" and you should be all set.