我可以在schema.org

时间:2016-05-17 15:52:15

标签: html5 filtering schema.org microdata

我正在使用在地图上显示酒店的网站。用户登陆与某个地点相关联的页面,我们会显示该地点所有酒店的地图(例如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)。

2 个答案:

答案 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),PlaceItemList

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,例如PlaceItemList

您可以在Google结构数据测试工具(GSDTT)上测试结构:https://search.google.com/structured-data/testing-tool

但是,您需要在顶部示例中修复HTML,因为您有一个悬空<div>

复制上面完成的结构并将其粘贴到GSDTT上。 HTML页面不是必需的;只有微观数据结构。