"position" property required for ItemList with Product list items?
Asked Answered
D

6

22

I have a problem: Google’s Structured Data Testing Tool gives me an error:

Tag position doesn't exist. It's required.

Tag position doesn't exist

I add it to the markup. Than I get this error:

Position property is not valid for an object of type Product

Position property is not valid for an object of type Product

Here is my markup:

<table id="sale_table" itemscope="" itemtype="http://schema.org/ItemList">
    <tbody>
            <tr itemprop="itemListElement" itemscope="" itemtype="http://schema.org/Product">
                <td class="sale_art_td" itemprop="productID">10496278</td>
                <td class="sale_brand_td" itemprop="brand"><span itemprop="name ">--</span></td>
                <td class="sale_name_td" itemprop="name">10496278 / Крышка трамблера Daewoo Nexia,Espero DD</td>
                <td class="sale_am_td">1.00</td>
                <td class="sale_price_td" itemprop="offers" itemscope="" itemtype="http://schema.org/Offer"><meta itemprop="priceCurrency" content="RUR"><span itemprop="price">341.50</span></td>
                <td class="sale_buy_td"><a href="javascript:void(0);" class="sale_buy_link" data-id="63455914" data-query="10496278">Купить</a><!--<img src="/upload/badge/sale_cart.png" />--></td>
                <td class="hidden">
                    <meta itemprop="url" content="/partsearch/?q=10496278">
                                        <span itemprop="description">Распродажа: 10496278 / Крышка трамблера Daewoo Nexia,Espero DD по цене 341.50</span>
                </td>
            </tr>
                    <tr itemprop="itemListElement" itemscope="" itemtype="http://schema.org/Product">
                <td class="sale_art_td" itemprop="productID">76202sx0a12</td>
                <td class="sale_brand_td" itemprop="brand"><span itemprop="name ">HONDA</span></td>
                <td class="sale_name_td" itemprop="name">76202SX0A12</td>
                <td class="sale_am_td">1.00</td>
                <td class="sale_price_td" itemprop="offers" itemscope="" itemtype="http://schema.org/Offer"><meta itemprop="priceCurrency" content="RUR"><span itemprop="price">704.00</span></td>
                <td class="sale_buy_td"><a href="javascript:void(0);" class="sale_buy_link" data-id="63456060" data-query="76202sx0a12">Купить</a><!--<img src="/upload/badge/sale_cart.png" />--></td>
                <td class="hidden">
                    <meta itemprop="url" content="/partsearch/?q=76202sx0a12">
                                        <span itemprop="description">Распродажа: 76202SX0A12 по цене 704.00</span>
                </td>
            </tr>
    </tbody>
 </table> 
Dropsical answered 14/9, 2015 at 9:3 Comment(1)
It's a been a year and we still don't know what it is.Timeserver
A
7

This is not an error with your code. It just means that Google won’t display a certain Rich Snippet (or a similar feature) unless you provide this property.

However, the position property is not defined for the Product type, so this does not make any sense.

It seems that this is a new structured data feature from Google, which is not documented yet, as it links to a 404 page: List Page Carousels. Maybe it’s a work in progress and they didn’t mean to publish the check in their Testing Tool yet.

So I’d simply ignore this for now.

Arnettaarnette answered 14/9, 2015 at 21:23 Comment(1)
Word "required", that's what confuses me =)Dropsical
I
5

From my testing malefique is onto the right solution.

This code fully validates using the Structured Data testing tool:

{
    "@context": "http://schema.org",
    "@type": "ItemList",
    "itemListOrder": "http://schema.org/ItemListOrderDescending",
    "itemListElement": [
        {
            "@type": "ListItem",
            "position": 1,
            "item": {
                "@type": "Product",
                "name": "My product",
                "url": "www.example.com",
                "offers": {
                    "@type": "Offer",
                    "availability": "http://schema.org/InStock",
                    "price": "100.00",
                    "priceCurrency": "AUD"
                }
            }
        }
    ]
}
Irita answered 30/8, 2017 at 1:41 Comment(2)
do you know if Google actually implements this structure of LD+JSON when it finds it in your page? I suspect it may be too far from what Googlebot is expecting.Brennabrennan
Except as far as I (mis?)understand after reading some decent amount of contradictory information on the subject, it's discouraged to have products and/or offers on a category page (developers.google.com/search/docs/data-types/carousel#summary)Bibliopegy
I
4

I guess this is an implementation error on Google's side caused by non explicit documentation:

https://schema.org/itemListElement clearly states

Existing entities are best for a simple, unordered list of existing things in your data. ListItem is used with ordered lists when you want to provide additional context about the element in that list or when the same item might be in different places in different lists.

Note: The order of elements in your mark-up is not sufficient for indicating the order or elements. Use ListItem with a 'position' property in such cases.

At the same time is says Values expected to be one of these types are:

  • ListItem
  • Text
  • Thing

=> This means implicitly, that the position element can only be required for sorted lists, which in turn demand that the Thing element is contained inside a ListItem element, which offers the itemprop position.

It also means implicitly that if the ItemListElement is Text or Thing, the list should be considered Unordered.

This is the only way the documentation makes sense. I assume that implicit connection was missed.

So I guess the appropriate action is to file a bug report for the Structured Data Testing Tool and live with the warnings for now or nest the Product inside a ListItem element as a workaround.

Ischium answered 17/11, 2015 at 9:15 Comment(4)
I tried the workaround myself, but it does not seem to work: - If I nest the Product inside a ListItem element, WMT complains about the wrong object Type - If I use Thing it complains The property xyz is not recognized by Google for an object of type Thing. - Same happens if I try additionalType: schema.org/Product with either the ListItem or the Thing element. ==> I can not find a valid encoding for a Product list.Ischium
I have the same issue. But not sure if its a bug in the testing tool or something else. If it is a bug then will google ever fix it ? I can see this post is more than a year old, but still the bug is there.Shoer
2019 and its still not fixedBrennabrennan
I'm using an array of SportEvent in my ItemList which also has no position prop so nothing else to do reallyUnlicensed
C
2

I found http://schema.org/itemListElement

you have to specify the position like so <meta itemprop="position" content="1" />

There is an example at the bottom of the page.

Cesura answered 5/5, 2018 at 18:35 Comment(0)
M
1

try this

'@type': 'ListItem',
'position': 1,
'item':{
   '@type': 'Product',
... product props
}
Marco answered 29/11, 2016 at 13:27 Comment(0)
B
0

The fix is to stuff your product into a ListItem's item property. The ListItem gets the position property. Once you do that, it passes Google's SDTT.

NOTE: It is invalid to have a product offer on more than 1 URL/URI.

Build out a page (unique URL) for each product offer and that's where you put your structured data / schema.org product offer data; OR, put all your product offers on a single page (URL/URI) - never both. Otherwise, you'll get error All values provided for url must point to the same page.

Blasien answered 17/4, 2019 at 1:44 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.