AggregateRating Schema: Mixed Validation Results - validation

We use schema.org to markup a number of different data types. I have typically relied on the Google testing tool to confirm that my schema is correct, but I've found that I get mixed results when testing with Bing, Yandex, Linter and MOZ.
Currently my 'aggregaterating' schema appears valid in Google's tester, but I get no results on Bing (can't find the markup) and Yandex/Linter both show errors. This makes me wonder if my schema is actually correct.
This was my original version which was OK on Google but got no results (no data found) on any of the other testers.
<div itemprop="aggregateRating" itemscope itemtype="https://schema.org/AggregateRating">
<meta itemprop="itemReviewed" content="https://schema.org/LocalBusiness">
<meta itemprop="ratingValue" content="4.6">
<meta itemprop="reviewCount" content="3,950">
</div>
This is my updated version that now, at least partially, is seen by Linter and Yandex. I still get nothing from MOZ and Bing.
<div itemscope="" itemtype="https://schema.org/Organization">
<meta itemprop="name" content="Company">
<div itemprop="aggregateRating" itemscope itemtype="https://schema.org/AggregateRating">
<meta itemprop="itemReviewed" content="https://schema.org/LocalBusiness">
<meta itemprop="ratingValue" content="4.6">
<meta itemprop="reviewCount" content="3,950">
</div></div>
Any feedback on the format? Something I am missing? Also, has anyone else had the mixed validation issue with other testers? I find that really odd.

Related

Google Structured Testing Tool is not showing image from my domain

When I click on "Preview", the Google Structured Testing Tool don't show the image from my domain. But it shows the image of any other link, from Google images. Why?
<main itemscope itemtype="http://schema.org/NewsArticle">
<meta itemprop="mainEntityOfPage" content="https://isMyDomain.net/?p=one-page">
<span itemprop="author publisher" itemscope itemtype="https://pending.schema.org/NewsMediaOrganization">
<meta itemprop="url" content="https://isMyDomain.net">
<meta itemprop="name" content="siteName">
<link itemprop="sameAs" href="https://www.facebook.com/mypage" />
<link itemprop="sameAs" href="https://twitter.com/mypage" />
<link itemprop="sameAs" href="https://www.instagram.com/mypage" />
<span itemprop="logo" itemscope itemtype="https://schema.org/ImageObject">
<meta itemprop="url" content="https://isMyDomain.net/img/myLogo.png">
<meta itemprop="width" content="488">
<meta itemprop="height" content="60">
</span>
</span>
<span itemprop="image" itemscope itemtype="https://schema.org/ImageObject">
<meta itemprop="url" content="https://isMyDomain.net/img/posts/d40N.jpg">
<meta itemprop="width" content="634">
<meta itemprop="height" content="342">
</span>
<article>
<header>
<h1 itemprop="headline">Title</h1>
<time itemprop="datePublished" datetime="2018-10-11T09:45:00-03:00">
11/10/2018 09h45</time>
<meta itemprop="dateModified" content="2018-10-11T09:45:00-03:00">
</header>
<div itemprop="articleBody">
<p>article body</p>
</div>
</article>
</main>
You can see the preview button when testing a link from BBC news articles.
Getting the 'Preview' button
It seems that the 'Preview' button appears if you include a link element that points to an actual AMP page (it doesn’t seem to work with a fake/example URL), e.g.:
<link rel="amphtml" href="https://www.bbc.com/news/amp/world-europe-4582284">
In the preview, the snippets will be linked to this AMP URL.
Displaying images in the preview
The preview tool only displays images if they are already indexed by Google Search. If they are not yet indexed, a placeholder image will be displayed. See The Google Search Preview Tool:
Rich card placeholder images and title
If you are testing rich card markup, you can see your actual image in the preview if we confirm, or verify, that the image URL is in our index. However, the preview displays a placeholder image if our systems cannot verify the image URL. Even so, when your rich card markup reaches our systems, the image you provide should be shown correctly in the actual Google Search results.

Datalogic Skorpio scanner javascript

We have a browser-based solution that we want to integrate with Datalogic scanners.
We will be using the locked down browser as our primary interface.
We've got as far as configuring the scanner and can confirm that it is decoding our Code 39 barcodes.
We've set up a test page that is supposed to take the scanned code and dump it in a text area.
The test page is
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>TEST</title>
<meta http-equiv="DL_Code_39" content="Enable">
<meta http-equiv="DL_Scan" content="Javascript:ValidateInput()">
<script language="javascript" type="text/javascript">
function ValidateInput(n){
document.getElementById("sku").value+=";"+n;
};
</script>
</head>
<body>
<form method="post" name="fTest">
<textarea rows="5" cols="15" name="sku" id="sku"></textarea><br>
<input type="submit" value="go">
</form>
</body>
</html>
When we scan, the javascript call is firing, but returning undefined.
If we give the javascript function call a variable (something not done in the documentation) it does not fire
We must be missing something simple but there is no sample code in the DL documentation and google can find nothing else either.
Any help would be greatly appreciated.
I have always found javascript support to be flaky on Windows CE. I assume this is what the data logic scanner is running on?
I would normally configure the scanner to act as a keyboard, that way you can use standard html forms and handle the logic server side. I haven't got a Scorpio to test with but the Falcons have this ability under encoding options.
You can also set a prefix and suffix that the scanner will append to the scanned barcode. In your case it looks like this might be ';\n'
I have solved this on my own
The problem in this case is one of the reasons why developers drink too much.
The problem is the name of the example javascript function described in the documentation
This code works perfectly
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>TEST</title>
<meta http-equiv="DL_Triggers" content="Enable">
<meta http-equiv="DL_Code_39" content="Enable">
<meta http-equiv="DL_Scan" content="Javascript:PassSKU">
<script type="text/javascript">
function PassSKU(n){
if (n === undefined) {
n = 0;
}
document.getElementById("sku").value+=";"+n;
};
</script>
</head>
<body>
<form method="post" name="fTest">
<textarea rows="5" cols="20" name="sku" id="sku"></textarea><br>
<input type="submit" value="go">
</form>
</body>
</html>
The only thing I changed was to rename my function call from ValidateInput() (the function name given in the documentation which I copied and pasted) to PassSKU
So
<meta http-equiv="DL_Scan" content="Javascript:ValidateInput">
This does not work
<meta http-equiv="DL_Scan" content="Javascript:AnyOtherFunctionName">
This works fine
WHY this fixed the problem is a topic for another time.
In case someone comes across this question while searching for information on getting a Datalogic scanner to work with a web form, I've posted a working solution here: stackoverflow: "Datalogic Falcon X3 - Barcode Scanner"

How to remove "Empty String passed to getElementById()" warning with jQuery Mobile?

While using Firefox (23.0.1) and jQuery Mobile (1.3.2), I get the following warning from my code: Empty string passed to getElementById(). The message appears in the console (Tools > Web Developer > Web Console). I would like to eliminate this warning.
I have seen a number of people ask similar questions, most notably: Best way to locate source of Warning: Empty string passed to getElementById() The answers seems to fairly consistently point to the use of '#', implying the user is at fault.
I have tried to produce what I feel is the bare minimum of valid code, and I've found this warning is still exhibited. I assume, from the other posts, that it is my code that is at fault. Can anyone show me how to fix this issue?
As per other users' comments, this warning does not appear in Chrome (version 29.0.1547.57)
Thanks in advance!
Minimum valid code that reproduces this issue:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<title>Test</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="css/jquery.mobile-1.3.2.css" />
<script src="js/jquery-1.9.1.js"></script>
<script src="js/jquery.mobile-1.3.2.js"></script>
</head>
<body>
<div data-role="page" id="TestPage">
<div data-role="content" id="TestContent">
<p>This is a test</p>
</div>
</div>
</body>
</html>
In my case it was caused because I forgot to specify a value for the 'for' attribute of a label:
Missing id
<label for="">Stuff:</label>
fixed
<label for="someID">Stuff:</label>
EDIT: Removing the for attribute also prevents that warning
<label>Stuff:</label>
As indicated in a deleted answer and in the comments, this was a bug in Mobile jQuery and it's now fixed. Compare the behavior of 1.3.2 vs 1.4.5 (the current version):
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<title>Test</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!--link rel="stylesheet" href="https://code.jquery.com/mobile/1.3.2/jquery.mobile-1.3.2.min.css" /-->
<link rel="stylesheet" href="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.min.css" />
<script src="https://code.jquery.com/jquery-1.9.1.js"></script>
<script src="https://code.jquery.com/mobile/1.4.5/jquery.mobile-1.4.5.js"></script>
<!--script src="https://code.jquery.com/mobile/1.3.2/jquery.mobile-1.3.2.js"></script-->
</head>
<body>
<div data-role="page" id="TestPage">
<div data-role="content" id="TestContent">
<p>This is a test</p>
</div>
</div>
</body>
</html>
After going through your jsfiddle I still didn't get where the the function document.getElementById() is being called. I used to also face this problem, but since you are using jquery-mobile its better to use $(#id) as selector just check whether this reference document.getElementById() or $('#id') is being called before the DOM is ready..

Offer (with priceSpecification) nested within Product throws Warning

Nesting an Offer that has a priceSpecification inside a Product throws up an Incomplete microdata warning in Google Rich Snippets testing tool.
This
<div itemscope itemtype="http://schema.org/Product">
<h1 itemprop="name">1984 Vintage Selection Cabernet Sauvignon</h1>
<p itemprop="description">Cabernet Sauvignon.</p>
<div itemprop="offers" itemscope itemtype="http://schema.org/Offer">
<p itemprop="priceSpecification" itemscope itemtype="http://schema.org/priceSpecification">Prices start at
<meta itemprop="priceCurrency" content="GBP" />£<span itemprop="price">0.71</span> (per bottle)</p>
<meta itemprop="validThrough" content="2013-09-01" />
</div>
</div>
throws the following warning in google rich snippets testing tool:
Warning: Incomplete microdata with schema.org.
If I move Offer outside Product:
<div itemscope itemtype="http://schema.org/Product">
<h1 itemprop="name">1984 Vintage Selection Cabernet Sauvignon</h1>
<p itemprop="description">Cabernet Sauvignon.</p>
</div>
<div itemprop="offers" itemscope itemtype="http://schema.org/Offer">
<p itemprop="priceSpecification" itemscope itemtype="http://schema.org/priceSpecification">Prices start at
<meta itemprop="priceCurrency" content="GBP" />£<span itemprop="price">0.71</span> (per bottle)</p>
<meta itemprop="validThrough" content="2013-09-01" />
</div>
then the warning is no longer thrown up, but this doesn't appear to make sense, as the Offer is not linked to the Product it's applicable to.
All the examples at schema.org nest Offer within Product, however, none of them use priceSpecification. I could only find one blog post where Offer is not nested within Product: http://seolobster.de/richsnippets-schema-org-products-update. This does not fill me with confidence to use in a live environment.
Which is correct? Especially if you throw in more than one Offer?
I have the same problem and I just figured it out though painstaking trial-and-error: The problem is that, even though price is part of the priceSpecification schema, it still needs to be defined outside the priceSpecification metatag in the regular offer, too!
I needed priceSpecification because we show prices including and excluding VAT, and now I have no frickin' idea on how to implement this! If I HAVE to define the price in offer, how do I tell it it's with or without VAT? valueAddedTaxIncluded is not part of the offer schema! An empty div just including valueAddedTaxIncluded=true? Okay, so how do I implement the other price without the VAT then? That would define the price twice in the offer, and that's not possible!
Also, why is schema.org and getschema.org so damn effing useless when it comes to samplecode and how to properly implement any given schema? If you want people to adopt some fancy new technology - TELL THEM HOW TO DO IT!!
Based on your example I don't think you need to use a separate priceSpecification property. Instead you can directly add the price and priceCurrency property to the Offer like the example below.
<div itemscope itemtype="http://schema.org/Product">
<h1 itemprop="name">1984 Vintage Selection Cabernet Sauvignon</h1>
<p itemprop="description">Cabernet Sauvignon.</p>
<div itemprop="offers" itemscope itemtype="http://schema.org/Offer">
Prices start at <meta itemprop="priceCurrency" content="GBP" />£
<span itemprop="price">0.71</span> (per bottle)
</div>
</div>
As stated before, the offer also needs the price-tag. One solution that the tag-tester allows is adding the data as a meta-tag like this:
<meta itemprop="price" content="79" />
I'm not sure if google will parse and show this however.

Can I add Microdata from HTML5 to a XHTML Strict site and still be compliant?

I've got a site coded in XHTML 1.0 Strict. I want to use the new Microdata to add breadcrumbs to my site (so Google will understand them).
My old non-microdata marked-up breadcrumbs look like this:
<ul>
<li>Level 1</li>
<li>Level 2</li>
<li>Level 3</li>
</ul>
According to Google, to markup breadcrumbs using Microdata, you extend the above code like this:
<ul>
<li itemscope itemtype="http://data-vocabulary.org/Breadcrumb">
<a href="..." itemprop="url">
<span itemprop="title">Level 1</span>
</a>
</li>
...
</ul>
But this is not valid XHTML 1.0 Strict.
What should I do?
Should I ignore the validation conflicts?
Should I write itemscope="itemscope" instead of just itemscope (this would be valid XML, but still not valid XHTML)?
Should I change the Doctype to be HTML5 instead of XHTML 1.0 Strict?
I want this to work all the way back to IE6!
Please advice :)
Yes, if you wanted to use itemscope in XHTML, you would need to write itemscope="itemscope" and use XHTML5 (same DOCTYPE as HTML5, but XML syntax).
itemscope is not included in W3 HTML5, but present in WHATWG's version, so validation may continue to be a difficulty. There seems to be quite some political argument on this issue, which I haven't been following as it looks fairly tedious.
For the moment, if you want to use breadcrumb annotations in a finalised, validatable document format, you could use RDFa instead: the alternative (but older) proposal, which the argument is all about, and use the existing doctype:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">
Since the major search engines have decided on schema.org last June (2011) as the way to do rich snippets, this question has become much more important seeing XHTML5 does not yet have a working DTD (BTW, http://www.html5dtd.org/ is working on a XHTML5 DTD and may well be ready when you read this, if so disregard what I'm about to say). And what I am about to say summarises a page I placed at http://www.nedprod.com/programs/portable/XHTMLwithHTML5microdata/ a few weeks ago, and there has more detail including a rich snippets demo if you want it.
I had need of extending XHTML 1.x Strict with schema.org/HTML5 microdata and getting it all to validate properly for updating nedprod, and Microsoft Expression Web has the occasional tendency to eat bits of HTML it edits, so validation is handy for catching when it borks. Hence I have created these DTDs which extend the standard XHTML 1.0 ones:
http://www.nedprod.com/xhtml1-strict-with-html5-microdata.dtd
http://www.nedprod.com/xhtml1-transitional-with-html5-microdata.dtd
To use, take a copy of your desired DTD (don't use the original from nedprod, I can't afford the bandwidth) and use as follows:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict with HTML5 microdata//EN" "xhtml1-strict-with-html5-microdata.dtd">
or ...
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional with HTML5 microdata//EN" "xhtml1-transitional-with-html5-microdata.dtd">
... or more likely, override the DTD used for validation by your particular XML validating setup.
BTW, here's something interesting, and I only include this as it's useful to know when answering the question. I honest to God thought that using the above doctypes would invoke quirks mode when rendering. Turns out, much to my great surprise, that IE8, Chrome 14, Firefox 5 and Opera 11.50 all render such a doctype in Standards mode. Who would have thought! So you could, if you wanted to, upload your XHTML pages onto the public internet with the custom doctype and the newer browsers at least would do the right thing.
Hope this helps someone,
Niall
Valid HTML 5 example
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Example page</title>
</head>
<body>
<div itemscope="" itemtype="http://schema.org/MediaObject">
<div itemprop="video" itemscope="" itemtype="http://schema.org/VideoObject">
<meta itemprop="name" content="Breast Augmentation Video Diary">
<meta itemprop="duration" content="PT12M54S">
<meta itemprop="thumbnailUrl" content="http://www.plastic-surgery-estonia.com/new-assets/images/thumbnails/breast-augmentation.jpg">
<meta itemprop="contentURL" content="http://www.youtube.com/watch?v=BwPN6eCpxTk">
<meta itemprop="embedURL" content="http://www.youtube.com/watch?feature=player_embedded&v=BwPN6eCpxTk">
<meta itemprop="uploadDate" content="2010-11-09">
<iframe src="http://www.youtube.com/embed/BwPN6eCpxTk?rel=0&autohide=1&modestbranding=1&showinfo=0"></iframe>
<span itemprop="description">Video Diary</span>
</div>
</div>
</body>
</html>
Found these links helpful:
- http://support.google.com/webmasters/bin/answer.py?hl=en&answer=2413309&topic=1088474&ctx=topic
- http://www.reelseo.com/embedded-youtube-indexed-google/
Use the application/ld+json MIME type and a microdata generator to transform the markup into data:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>microdata.xhtml</title>
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/>
</head>
<body>
<div>
<script type="application/ld+json">
{"items": [{
"type": ["https://schema.org/breadcrumb"],
"properties":{
"url": ["..."],
"title": ["Level 1"]
}
}]
}
</script>
</div>
</body>
</html>
or a data:uri in an object tag:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>microdata.xhtml</title>
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/>
</head>
<body>
<div>
<object data="data:text/html;charset=utf-8;base64,PHVsPiA8bGkgaXRlbXNjb3BlIGl0ZW10eXBlPSJodHRwOi8vZGF0YS12b2NhYnVsYXJ5Lm9yZy9CcmVhZGNydW1iIj4gICAgICAgICA8YSBocmVmPSIuLi4iIGl0ZW1wcm9wPSJ1cmwiPiAgICAgICAgICAgPHNwYW4gaXRlbXByb3A9InRpdGxlIj5MZXZlbCAxPC9zcGFuPiAgICAgICAgIDwvYT4gICAgICAgICA8L2xpPiAgICAgICA8L3VsPg==">
<?microdata
<ul>
<li itemscope itemtype="http://data-vocabulary.org/Breadcrumb">
<a href="..." itemprop="url">
<span itemprop="title">Level 1</span>
</a>
</li>
</ul>
?>
</object>
<!--[if lt IE 8]>
<object data="mhtml://#foo">
<?microdata
<ul>
<li itemscope itemtype="http://data-vocabulary.org/Breadcrumb">
<a href="..." itemprop="url">
<span itemprop="title">Level 1</span>
</a>
</li>
</ul>
?>
<div id="foo">
PHVsPiA8bGkgaXRlbXNjb3BlIGl0ZW10eXBlPSJodHRwOi8vZGF0YS12b2NhYnVsYXJ5Lm9yZy9CcmVhZGNydW1iIj4gICAgICAgICA8YSBocmVmPSIuLi4iIGl0ZW1wcm9wPSJ1cmwiPiAgICAgICAgICAgPHNwYW4gaXRlbXByb3A9InRpdGxlIj5MZXZlbCAxPC9zcGFuPiAgICAgICAgIDwvYT4gICAgICAgICA8L2xpPiAgICAgICA8L3VsPg==
</div>
</object>
<![endif]-->
</div>
</body>
</html>
I want this to work all the way back to IE6!
Use the application/xhtml+xml XSLT shim to support IE6 and extend it to get a copy of the markup.
References
MDN: Base64 Encoding and Decoding
Images in a Web Page
MIME E-mail Encapsulation of Aggregate Documents, such as HTML (MHTML)
Mapping Microdata to RDF
data:URI Tests
Examining, implementing and testing of RFC2557 (MHTML)
MHTML URIs
HTML5: Differences from HTML4
try and validate some of google's pages...they don't validate.
validation is a tool, an awesome one, but nothing more, although i do applaud your determination. if you're that worried about validation i would switch to HTML5 .

Resources