schema.org 餐厅菜单 - 描述一道菜

schema.org restaurant menu - describing an individual dish

有没有办法描述餐厅菜单中每道菜的属性?

特别是这些字段:名称、描述、价格

或者当您在餐厅属性中指明 url 菜单时,是否必须祈祷 google 正确解释数据?

有几个选项,具体取决于(某种程度上)个人喜好:

  • 留着看Google看得懂

    menu 将值定义为文本或 URL,因此提供其中任何一个就足够了。由于未遵循规范,执行任何其他操作可能会混淆 Google 或其他解析器。

    Here's an article which shows a URL providing a menu to Google without any schema,所以系统 确实 工作。

  • 在 URL

    的目的地提供架构

    ItemList is the most generic kind of list and allows you to add itemListElements 到列表中。这并没有指定该列表是一个菜单,但是提供 URL 的菜单 属性 应该足够了。

    另外,Offer allows you to specify name, description and price which satisfies your requirements. Product 不允许您指定价格,因此此处最好提供报价。由于 itemListElement 可以是事物,因此您可以在 ItemList 中组合商品。

词汇表 Schema.org(还)没有提供表示餐厅菜单或单个菜单项的类型。

他们的 menu property 期望文本或 URL 作为值。如果菜单应该有一个类型,它将成为另一个期望值。

问题Extension Proposal: FoodProduct and Restaurant Menu with FoodProducts. asked for this. It got closed, referencing the broader issue Create a new Food type (help further with foodWarning and recipeIngredient)。还在讨论中

如果您现在需要一些东西,您可以使用hasOfferCatalog property that references an OfferCatalog type (representing the menu, or grouped parts of the menu) and the Offer type(代表单个菜单项,带有价格)。

例如:

<div vocab="http://schema.org/" typeof="Restaurant">
  <section property="hasOfferCatalog" typeof="OfferCatalog">
    <h1 property="name">Menu</h1>
    <ul>

      <li property="itemListElement" typeof="Offer">
        <b property="name">Bread</b> – 
        <span property="price">1.50</span>
        <meta property="priceCurrency" content="EUR" />
      </li>

      <li property="itemListElement" typeof="Offer">
        <b property="name">Water</b> – 
        <span property="price">1.00</span>
        <meta property="priceCurrency" content="EUR" />
      </li>

    </ul>
  </section>
</div>

如果您也想使用 menu 属性,您可以添加一个 div 来包围 OfferCatalogmenu 的值将是文本内容。

<div vocab="http://schema.org/" typeof="Restaurant">
  <div property="menu">
    <section property="hasOfferCatalog" typeof="OfferCatalog">
      <!-- … -->
    </section>
  </div>
</div>

Schema.org 发布了新的餐厅菜单标记!

真是个好消息!所以,在这里我要分享一些我自己一直在等待的东西。

如果您一直梦想有一种适当的方法允许标记多个餐厅菜单以及菜单部分甚至提供差异化​​,您会对更新的架构感到惊讶。org/restaurant 构建标记的可能性.

当您访问 schema.org/Restaurant 页面时,您首先会注意到 菜单 属性 已被 hasMenu 属性,它现在取代了仍然有效的 menu

那么,开门见山:

如何使用 Schema.org

标记餐厅菜单

在网站的每一页上,建议将搜索引擎指向正确的方向,以便找到菜单。这是一个 nice article,涵盖了我在这里整理的大部分内容。

Google 的指南指出,我们应该只标记页面上可见的内容,我们不能将整个菜单完全包含在我们的主页标记中,除非整个菜单都发布在那里。相反,我们将简单地使用主页上的 hasMenu 属性 指向菜单页面,如下所示:

<script type="application/ld+json">
{
 "@context": "http://schema.org",
 "@type": "WebSite",
 "name": "Your Restaurant's Name",
 "url": "http://your-restaurant.com/",
 "publisher": {
     "@type": "Restaurant",
     "name": "Your Restaurant's Name",
     "hasMenu": "http://your-restaurant.com/menu/",
     "logo": "http://.....

事实上,在您网站的任何包含模式标记的页面上,您都可以使用 hasMenu 属性 指向菜单页面的 URL。

当您有多个菜单时:

“hasMenu”: [
{
“@type”: “Menu”,
“name”: “Breakfast”,
“url”: “http://your-restaurant.com/breakfast-menu/”
},
{
“@type”: “Menu”,
“name”: “Lunch”,
“url”: “http://your-restaurant.com/lunch-menu/”
},
{
“@type”: “Menu”,
“name”: “Dinner”,
“url”: “http://your-restaurant.com/dinner-menu/”
}
],
...

启动菜单页面标记:

将注意力转移到实际的菜单页面,假设菜单仅在 5:00pm 和 11:00pm 之间提供。因此,在菜单页面上,我们的标记将像这样开始:

<script type=”application/ld+json”>
{
“@context”: “http://schema.org”,
“@type”: “Menu”,
“name”: “Our Menu”,
“mainEntityOfPage”: “http://your-restaurant.com/menu/”,
“inLanguage”: “English”,
“offers”: {
“@type”: “Offer”,
“availabilityStarts”: “T17:00”,
“availabilityEnds”: “T23:00”
},

标记菜单部分:

接下来,我们可以开始标记菜单的各个部分和各个菜单项。首先,我们将从开胃菜开始。对于第一个开胃菜,我们将在我们的标记中包含名称、简短描述和价格,这应该是任何菜单项的最低价格。在我们的第二个开胃菜标记示例中,我们还将包括一张图片、营养信息以及它不含麸质的事实:

“hasMenuSection”: [
{
“@type”: “MenuSection”,
“name”: “Appetizers”,
“hasMenuItem”: [
{
“@type”: “MenuItem”,
“name”: “Fried Eggplant”,
“description”: “Served with Italian red gravy.”,
“offers”: {
“@type”: “Offer”,
“price”: “7.95”,
“priceCurrency”: “USD”
}
},
{
“@type”: “MenuItem”,
“name”: “Fried Calamari”,
“description”: “Served with Italian red gravy or honey mustard.”,
“image”: “http://your-restaurant.com/images/fried-calamari.jpg”,
“suitableForDiet”: “http://schema.org/GlutenFreeDiet”,
“nutrition”: {
“@type”: “NutritionInformation”,
“calories”: “573 calories”,
“fatContent”: “25 grams”,
“carbohydrateContent”: “26 grams”,
“proteinContent”: “61 grams”
},
“offers”: {
“@type”: “Offer”,
“price”: “7.95”,
“priceCurrency”: “USD”
}
}
]
},

标记菜单项:

假设我们已经标记了所有的开胃菜,我们准备开始标记下一个菜单部分,在我们的例子中是汤。有时,诸如汤之类的菜单项有两种或更多种尺寸可供选择。我们可以通过为每个选项使用单独的报价标记以及符合条件的数量 属性 来标记可用选项,如下所示:

{
“@type”: “MenuSection”,
“name”: “Soups”,
“hasMenuItem”: [
{
“@type”: “MenuItem”,
“name”: “Lobster Bisque”,
“offers”: [
{
“@type”: “Offer”,
“price”: “6.75”,
“priceCurrency”: “USD”,
“eligibleQuantity”: {
“@type”: “QuantitativeValue”,
“name”: “Cup”
}
},
{
“@type”: “Offer”,
“price”: “9.95”,
“priceCurrency”: “USD”,
“eligibleQuantity” : {
“@type”: “QuantitativeValue”,
“name”: “Bowl”
}
}
]
},
{
“@type”: “MenuItem”,
“name”: “Creole Seafood Gumbo”,
“offers”: [
{
“@type”: “Offer”,
“price”: “6.75”,
“priceCurrency”: “USD”,
“eligibleQuantity”: {
“@type”: “QuantitativeValue”,
“name”: “Cup”
}
},
{
“@type”: “Offer”,
“name”: “Bowl”,
“price”: “9.95”,
“priceCurrency”: “USD”,
“eligibleQuantity” : {
“@type”: “QuantitativeValue”,
“name”: “Bowl”
}
}
]
}
]
},

综合起来:

在我们标记完所有汤品后,我们可以继续使用相同的格式标记其他菜单部分和项目。就是这样。把它们放在一起,我们的 JSON-LD 菜单标记看起来像这样:

<script type=”application/ld+json”>
{
“@context”:”http://schema.org”,
“@type”:”Menu”,
“name”: “Our Menu”,
“url”: “http://your-restaurant.com/menu/”,
“mainEntityOfPage”: “http://your-restaurant.com/menu/”,
“inLanguage”:”English”,
“offers”: {
“@type”: “Offer”,
“availabilityStarts”: “T17:00”,
“availabilityEnds”: “T23:00”
},
“hasMenuSection”: [
{
“@type”: “MenuSection”,
“name”: “Appetizers”,
“hasMenuItem”: [
{
“@type”: “MenuItem”,
“name”: “Fried Eggplant”,
“description”: “Served with Italian red gravy.”,
“offers”: {
“@type”: “Offer”,
“price”: “7.95”,
“priceCurrency”: “USD”
}
},
{
“@type”: “MenuItem”,
“name”: “Fried Calamari”,
“description”: “Served with Italian red gravy or honey mustard.”,
“image”: “http://your-restaurant.com/images/fried-calamari.jpg”,
“suitableForDiet”: “http://schema.org/GlutenFreeDiet”,
“nutrition”: {
“@type”: “NutritionInformation”,
“calories”: “573 calories”,
“fatContent”: “25 grams”,
“carbohydrateContent”: “26 grams”,
“proteinContent”: “61 grams”
},
“offers”: {
“@type”: “Offer”,
“price”: “7.95”,
“priceCurrency”: “USD”
}
}
]
},
{
“@type”: “MenuSection”,
“name”: “Soups”,
“hasMenuItem”: [
{
“@type”: “MenuItem”,
“name”: “Lobster Bisque”,
“offers”: [
{
“@type”: “Offer”,
“price”: “6.75”,
“priceCurrency”: “USD”,
“eligibleQuantity”: {
“@type”: “QuantitativeValue”,
“name”: “Cup”
}
},
{
“@type”: “Offer”,
“price”: “9.95”,
“priceCurrency”: “USD”,
“eligibleQuantity” : {
“@type”: “QuantitativeValue”,
“name”: “Bowl”
}
}
]
},
{
“@type”: “MenuItem”,
“name”: “Creole Seafood Gumbo”,
“offers”: [
{
“@type”: “Offer”,
“price”: “6.75”,
“priceCurrency”: “USD”,
“eligibleQuantity”: {
“@type”: “QuantitativeValue”,
“name”: “Cup”
}
},
{
“@type”: “Offer”,
“name”: “Bowl”,
“price”: “9.95”,
“priceCurrency”: “USD”,
“eligibleQuantity” : {
“@type”: “QuantitativeValue”,
“name”: “Bowl”
}
}
]
}
]
},
{
“@type”: “MenuSection”,
“name”: “Pastas”,
“description”: “Entrées served with dinner salad or a cup of soup of the day.”,
“hasMenuItem”: [
{
“@type”: “MenuItem”,
“name”: “Veal Parmigiana”,
“description”: “Tender cuts of paneed veal crowned with golden fried eggplant, Italian red gravy, mozzarella, and parmesan; served with spaghetti.”,
“offers”: {
“@type”: “Offer”,
“price”: “17.95”,
“priceCurrency”: “USD”
}
},
{
“@type”: “MenuItem”,
“name”: “Eggplant Parmigiana”,
“description”: “Pan fried eggplant layered and topped with Italian red gravy, mozzarella, and parmesan baked until bubbly; served with spaghetti.”,
“offers”: {
“@type”: “Offer”,
“price”: “14.95”,
“priceCurrency”: “USD”
}
}
]
}
]
}
</script>

餐厅菜单标记的未来

我知道并非每个餐厅菜单场景都完全包含这些新的菜单属性和类型,但希望您现在至少有很多东西可以开始使用。还要记住,Schema.org 词汇表在不断发展,模式的这个特定领域也会继续发展。欢迎您通过 Github 的讨论参与 Schema.org 的发展。如果您认为自己有很好的建议,欢迎加入讨论。