我正在使用在地图上显示酒店的网站。用户登陆与某个地点相关联的页面,我们会显示该地点所有酒店的地图(例如Key West)。
我正在尝试改进我们使用的schema.org标记。目前,该网页的大部分标记为place。然后,我们在该标记中包含map。然后在我们所有的个人hotels中。所以我们的标记看起来像 -
<div id="mainwrap" itemscope itemtype="http://schema.org/Place">
<div id="map_canvas" style="height:100%;" itemprop="hasMap" itemscope itemtype="https://schema.org/Map"></div>
<div itemscope itemtype="http://schema.org/Hotel">...</div>
<div itemscope itemtype="http://schema.org/Hotel">...</div>
<div itemscope itemtype="http://schema.org/Hotel">...</div>
</div>
</div>
我认为将所有内容标记为使用itemList的酒店列表会更有意义。然后我们可以告知列表中有多少酒店,它们如何排序,甚至标记filter controls中的一些。
是否可以重叠架构?例如,我可以做这样的事情......
<div id="mainwrap" itemscope itemtype="http://schema.org/ItemList">
<div itemProp="PotentialAction" class="filterWidget">...</div>
<div itemProp="PotentialAction" class="sortWidget">...</div>
<div itemscope itemtype="http://schema.org/Place">
<div id="map_canvas" style="height:100%;" itemprop="hasMap" itemscope itemtype="https://schema.org/Map"></div>
<div itemProp="itemListElement" itemtype="http://schema.org/ListItem" itemscope itemtype="http://schema.org/Hotel">...</div>
<div itemProp="itemListElement" itemtype="http://schema.org/ListItem" itemscope itemtype="http://schema.org/Hotel">...</div>
<div itemProp="itemListElement" itemtype="http://schema.org/ListItem" itemscope itemtype="http://schema.org/Hotel">...</div>
</div>
</div>
</div>
还有一种很好的方法来测试其中一些吗?问题是它是一个单页面应用程序,测试工具需要原始的html(而谷歌机器人将运行js并渲染dom)。
答案 0 :(得分:2)
我会说Map
并不真正有用,因为&#34;父母&#34; Hotel
项的类型,这对于Schema.org来说是不可能的,因为Map
没有定义可以引用地图中包含的Place
项的属性。
最基本的结构是Place
项(页面的主要主题)和与containsPlace
property相关联的多个Hotel
项。另外指定Map
。
<body itemscope itemtype="http://schema.org/WebPage">
<section itemprop="mainEntity" itemscope itemtype="http://schema.org/Place">
<div itemprop="hasMap" itemscope itemtype="http://schema.org/Map">
…
</div>
<ul>
<li itemprop="containsPlace" itemscope itemtype="http://schema.org/Hotel">…</li>
<li itemprop="containsPlace" itemscope itemtype="http://schema.org/Hotel">…</li>
<li itemprop="containsPlace" itemscope itemtype="http://schema.org/Hotel">…</li>
</ul>
</section>
</body>
如果您想对ItemList
项使用Hotel
,则会变得更复杂。
然后再使用containsPlace
不再可能,因为ItemList
不能拥有此属性(嗯,实际上它可以,但它不是预期的)。您可以使用反向属性containedInPlace
并引用Place
项,但在我的示例中,不可能为此目的使用Microdata的itemref
属性(因为{{1} }属性也会添加到mainEntity
,这不是预期的属性。)
使用Microdata的Hotel
属性,功能越强大(但可能支持度越低)。它用于指定项目的URI(这些URI不一定必须指向页面,它们仅用作标识符;但强烈建议它为包含微数据的页面提供服务)。您的每个项目都可以获取一个URI,然后您可以将此URI用作通常期望另一个项目作为值的属性的值。
以上面的示例为例,但现在使用itemid
(适用于itemid
),Place
和ItemList
:
containedInPlace
<body itemscope itemtype="http://schema.org/WebPage">
<section itemprop="mainEntity" itemscope itemtype="http://schema.org/Place" itemid="#thing">
<div itemprop="hasMap" itemscope itemtype="http://schema.org/Map">
…
</div>
<!-- note that this list doesn’t have to be a child of the <section> element -->
<ul itemscope itemtype="http://schema.org/ItemList">
<li itemprop="itemListElement" itemscope itemtype="http://schema.org/Hotel">
<link itemprop="containedInPlace" href="#thing" />
</li>
<li itemprop="itemListElement" itemscope itemtype="http://schema.org/Hotel">
<link itemprop="containedInPlace" href="#thing" />
</li>
<li itemprop="itemListElement" itemscope itemtype="http://schema.org/Hotel">
<link itemprop="containedInPlace" href="#thing" />
</li>
</ul>
</section>
</body>
和URI值假设有关此itemid
的网页包含网址Place
。由于http://example.com/places/amsterdam
值为itemid
,因此完整的URI将为#thing
。
每当您在其他页面上引用此http://example.com/places/amsterdam#thing
时,您都可以使用Place
(如果您在同一页面上引用它,您也可以使用完整的URI,或者再次http://example.com/places/amsterdam#thing
#thing
1}})。这样做的好处是您不必重复数据(您可以参考它的&#34;规范&#34;指定所有内容的位置),但它的缺点是消费者必须访问另一个页面(但是,嘿,这是他们的工作)。
要区分/places/amsterdam
(对于该页面)和/places/amsterdam#thing
,对于该地点,在语义Web /关联数据世界中可能很重要 - more details in my answer to the question Best practices for adding semantics to a website。
答案 1 :(得分:1)
通过使用ID
作为标识符,您可以在这里完成任务。
例如,如果您为酒店分配唯一的ID
,则可以在不同的结构中使用该ID,例如Place
或ItemList
。
您可以在Google结构数据测试工具(GSDTT)上测试结构:https://search.google.com/structured-data/testing-tool。
但是,您需要在顶部示例中修复HTML,因为您有一个悬空<div>
。
复制上面完成的结构并将其粘贴到GSDTT上。 HTML页面不是必需的;只有微观数据结构。