Google 合作伙伴可以通过预订等候名单集成功能向 Google 提供结构化菜单数据,以便在餐馆的 Google 商家资料的菜单部分以及 Google 消费者平台上的其他入口点中使用这些数据。
菜单数据使用通用 Feed 进行提取。开始前须知:
- 请确保您已完成账号设置
- 了解通用 Feed 上传流程
- 了解如何配置账号以进行通用 Feed 上传
创建和上传菜单 Feed
创建和上传菜单 Feed 时,请遵循以下准则和惯例:-
如需提供餐厅详细信息,请遵循商家 Feed 中描述的数据规范。
如需查看 JSON 文件示例,请参阅示例 JSON。
每次上传的数据文件名应保持唯一。建议在文件名中添加时间戳,例如
menu1_1633621547.json -
在菜单 Feed 的文件集描述符中,将
name字段设置为google.food_menu。 如需查看描述符文件内容示例,请参阅描述符文件 JSON 示例。 描述符文件的名称在不同上传之间应保持唯一。建议在文件名中添加时间戳,例如descriptor_1633621547.filesetdesc.json。 描述符文件必须作为菜单 Feed 的一部分上传到通用 SFTP 服务器。 - 必须每天以完全刷新的方式将 Feed 上传到通用的 SFTP 服务器。
- 将 Feed 限制为最多 1000 个分片(文件),如使用通用 Feed sftp 中所述
您可以在合作伙伴门户网站的提取 > 历史记录部分中查看 Feed 提取状态。您可以在合作伙伴门户的配置 > Feed 部分找到 Feed SFTP 服务器信息。
您可以在合作伙伴门户网站的提取 > 历史记录部分中查看 Feed 提取状态。您可在合作伙伴门户的配置 > Feed 部分中找到 Feed SFTP 服务器信息。
使用菜单项选项
可以使用 MenuItemOption proto 指定菜单项选项。
如果合作伙伴的单个菜单项有多个必需的选项集(例如,拿铁有尺寸选项和牛奶选项),则必须决定如何在 Google 中以最佳方式显示这些选项。Google 建议您采取以下措施:
- 菜单 Feed 应与合作伙伴的点餐网站(或餐厅的堂食菜单,如果您没有该营业地点的点餐网站)保持一致。如果商品在订购网站上显示了单价,则应使用
MenuItem。如果商品显示有基本价格和多个选项,则应使用MenuItemOption。 - 避免包含过长的选项列表,例如:
- 鸡肉卷饼
- 含奶酪的鸡肉卷饼
- 鸡肉卷饼配萨尔萨酱
- 鸡肉卷饼,搭配萨尔萨酱和奶酪
- 鸡肉卷饼配鳄梨酱
- 鸡肉卷饼,搭配鳄梨酱和萨尔萨酱
- 仅当菜品需要选择某个选项时,才支持菜单项选项。例如,在订购披萨时,尺寸是必选选项。不支持用于加购项(例如“添加鳄梨的选项”)的菜单项选项,并且不应将其纳入 Feed 中。
菜单项选项价格应为选择相应选项后商品的完整价格。应为菜单项或其选项设置价格,但不能同时为两者设置价格。
提供多种菜单的餐厅
一家餐厅(实体)只能有一个菜单。对于有多个菜单(即单独的午餐和晚餐菜单)的餐厅,您可以将所有菜单合并为一个菜单,并使用 MenuSections(即一个菜单包含午餐部分和晚餐部分)。生成的菜单将具有以下结构:
- 菜单
- “午餐”部分
- 汤
- 汤 1
- 汤 2
- 三明治
- 三明治 1
- 三明治 2
- “晚餐”部分
- 首发阵容
- Starter 1
- Starter 2
- 主赛
- 主菜 1
- 主菜 2
跨餐厅共享菜单
通过在菜单的 merchant_ids 列表中包含所有餐厅,可以在多个餐厅之间共享单个菜单。请注意,此列表接受使用 Entity Feed 的合作伙伴的实体 ID。
最佳做法
以下是开发菜单 Feed 时应遵循的最佳实践。
- 只能将一个菜单与一家餐厅相关联。
- 在 TextField 中,将首选语言作为第一种语言提供。如果您发送多个 LocalizedText 对象,系统会向用户显示文本列表中的第一个对象。
- 所有菜单项都必须添加到菜单版块中。 请勿直接向菜单对象添加菜单项。
- 使用 UTF-8 编码提供内容。无需转义非 ASCII 字符。
- 如果您要在多个地区发布,请确保在单位和 nanos 字段中使用正确的币种代码和面额 - 请特别注意 nanos 字段,该字段是单位的 10^-9。使用商品目录查看器中的菜单可视化工具确认您已正确设置价格。
- 为用户提供视觉效果丰富、内容全面且新鲜的菜单,是打造实用且引人入胜的用户体验的关键。价格、说明、照片和饮食信息都是促成决策的关键要素,我们鼓励合作伙伴尽可能多地提供这些数据,以提供最佳的用户和商家体验。
- 如需不显示价格,请在 Offer proto 中添加空的 Price proto。
开发和测试工具
菜单 Feed 发布后,您的菜单 Feed 数据将可以在发现体验中显示,并且可能会显示在餐厅地点信息页的“菜单”标签页中。Google 搜索(移动版和桌面版)支持“菜单”标签页,并且该功能将扩展到更多平台,包括 Google 地图。呈现的体验可能会因界面而异。
为确保菜单结构正确,请使用商品目录查看器中的菜单可视化工具预览菜单。
餐厅菜单可能来自多种来源,包括餐厅本身通过其 Google 商家资料、食品订购和预订合作伙伴、用户拍摄的菜单照片等。如果多个来源为同一餐厅提供菜单,商家可以在 Google 商家资料菜单编辑器中选择首选提供商。
架构
如需查看完整的菜单架构,请点击此处。
FoodMenuFeed
| 字段名称 | 类型 | 要求 | 说明 |
|---|---|---|---|
data | 对象数组(MenuComponent) |
MenuComponent
| 字段名称 | 类型 | 要求 | 说明 |
|---|---|---|---|
| oneOf(type) | 只能设置相应 oneOf 中的一个字段。 |
| 字段名称 | 类型 | 要求 | 说明 |
|---|---|---|---|
menu_id | 字符串 | 必需 | 合作伙伴提供的不透明字符串,用于唯一标识合作伙伴 Feed 中的菜单。 必填。 |
merchant_ids | 字符串数组 | 必需 | 菜单所适用的商家。 注意:此字段会重复出现,以便连锁餐厅可以在多个位置(每个位置都是单独的商家)共享同一份菜单。必填。 |
display_name | 对象(TextField) | 用户浏览菜单时可用于标识菜单的名称。 可选。 | |
language | 字符串 | 与菜单中包含的文本标签关联的默认语言代码。需要 BCP-47 语言代码,例如“en-US”或“sr-Latn”。 如需了解详情,请参阅 http://www.unicode.org/reports/tr35/#Unicode_locale_identifier。 可选。 |
| 字段名称 | 类型 | 要求 | 说明 |
|---|---|---|---|
text | 对象数组(LocalizedText) | 必需 | 每个语言区域的文本值。 如果只需要支持一种语言区域,则无需在每个文本中设置 language_code,系统会根据菜单的默认语言推断出语言。 如果不同语言区域设置了多个文本,则必须为每个文本设置 language_code。列表中的第一个文本被视为首选表示形式。 必填。 |
LocalizedText
特定语言的本地化文本变体。
| 字段名称 | 类型 | 要求 | 说明 |
|---|---|---|---|
text | 字符串 | 与下方的 [language_code][google.type.LocalizedText.language_code] 对应的语言的本地化字符串。 | |
language_code | 字符串 | 文本的 BCP-47 语言代码,例如“en-US”或“sr-Latn”。 如需了解详情,请参阅 http://www.unicode.org/reports/tr35/#Unicode_locale_identifier。 |
| 字段名称 | 类型 | 要求 | 说明 |
|---|---|---|---|
menu_section_id | 字符串 | 必需 | 合作伙伴提供的不透明字符串,用于在合作伙伴 Feed 中唯一标识 MenuSection。 必填。 |
display_name | 对象(TextField) | 必需 | 用户浏览菜单时可用于标识 MenuSection 的名称。 必填。 |
description | 对象(TextField) | 菜单部分的说明。 可选。 | |
images | 对象数组(Image) | 菜单部分的图片。 可选。 |
| 字段名称 | 类型 | 要求 | 说明 |
|---|---|---|---|
uri | 字符串 | 必需 | 包含图片原始像素的网址。 必填。 |
| 字段名称 | 类型 | 要求 | 说明 |
|---|---|---|---|
menu_item_id | 字符串 | 必需 | 合作伙伴提供的不透明字符串,用于在合作伙伴 Feed 中唯一标识 MenuItem。 必填。 |
display_name | 对象(TextField) | 必需 | 用户浏览菜单时可用于标识 MenuItem 的名称。 必填。 |
description | 对象(TextField) | 菜单项的说明。 可选。 | |
images | 对象数组(Image) | 菜单项的图片。 可选。 | |
| oneOf(pricing) | 必需 | 只能设置相应 oneOf 中的一个字段。 |
item_attributes | 对象(MenuItemAttributes) | 有关相应菜单项的属性。 可选。 |
| 字段名称 | 类型 | 要求 | 说明 |
|---|---|---|---|
offers | 对象数组(Offer) | 必需 | 可能优惠的列表。 必填。 |
| 字段名称 | 类型 | 要求 | 说明 |
|---|---|---|---|
price | 对象(Money) | 以下情况无效,会导致菜单项被舍弃: 价格没有币种代码,但有单位或纳诺或两者都有: price {units: 100, nanos: 1000000} price {units: 100} price {nanos: 1000000} 价格的币种代码无效,但有单位或纳诺或两者都有: price {currency_code: 'gXYZ', units: 100, nanos: 1000000} price {currency_code: 'gXYZ', units: 100} price {currency_code: 'gXYZ', nanos: 1000000} 价格有币种代码,但单位或纳诺无效 price {currency_code: 'USD', units: 100, nanos: -100} price {currency_code: 'USD', units: -100, nanos: 100} |
Money
表示含有货币类型的金额。
| 字段名称 | 类型 | 要求 | 说明 |
|---|---|---|---|
currency_code | 字符串 | 采用 ISO 4217 标准定义的三位字母货币代码。 | |
units | 字符串 | 金额的整数单位。
例如,如果 currencyCode 是 "USD",则 1 单位就是一美元。 | |
nanos | 数值 | 以纳单位 (10^-9) 表示的金额数量。
取值范围必须在 -999,999,999 至 +999,999,999 之间(含边界值)。
如果 units 是正数,nanos 必须是正数或零。
如果 units 是零,nanos 可以是正数、零或负数。
如果 units 是负数,nanos 必须是负数或零。
例如,$-1.75 表示为 units=-1 和 nanos=-750,000,000。 |
| 字段名称 | 类型 | 要求 | 说明 |
|---|---|---|---|
menu_item_option_ids | 字符串数组 | 必需 | 适用于相应菜单项的菜单项选项的 ID。 必填。 |
| 字段名称 | 类型 | 要求 | 说明 |
|---|---|---|---|
number_of_servings | 数值 | 指定菜单项中可提供的份数。 可选。 | |
nutrition_information | 对象(NutritionInformation) | 描述商品的所有营养信息,例如卡路里、脂肪含量。可选。 | |
suitable_diets | 枚举(DietaryRestriction)的数组 | 相应菜单项所符合的饮食禁忌。 可选。 | |
additive | 对象数组(Additive) | 相应菜单项的添加剂。 可选。 | |
allergen | 对象数组(Allergen) | 相应菜单项的过敏原。 可选。 | |
packaging_deposit_info | 对象(DepositInfo) | 相应菜单项的包装和回收信息。可选。 |
| 字段名称 | 类型 | 要求 | 说明 |
|---|---|---|---|
energy | 对象(NutritionValue) | 一份食物的营养能量。可以按卡路里或千焦耳定义。 可选。 | |
sodium_content | 对象(NutritionValue) | 钠含量,以克或毫克为单位。 可选。 | |
serving_size | 数值 | 营养价值所适用的份数。 可选。 | |
description | 对象(TextField) | 自由文本格式的营养信息。例如“含有防腐剂”。 可选。 |
| 字段名称 | 类型 | 要求 | 说明 |
|---|---|---|---|
| oneOf(value) | 只能设置相应 oneOf 中的一个字段。 | |
unit | 枚举(NutritionValueUnit) | 必需 | 与金额关联的单位,由合作伙伴指定。我们将验证 Feed,确保每种营养价值的单位与该营养价值的类型相符。例如,在 NutritionalInformation 的能量属性中,仅应包含 ENERGY_CALORIES 和 ENERGY_KILOJOULES。必填。 |
| 字段名称 | 类型 | 要求 | 说明 |
|---|---|---|---|
min | 数值 | 必需 | 最低营养价值。 必填。 |
max | 数值 | 必需 | 营养价值的最大值。 必填。 |
| 字段名称 | 类型 | 要求 | 说明 |
|---|---|---|---|
name | 对象(TextField) | 必需 | 添加剂的描述性文字,例如“防腐剂”。 必填。 |
containment_level_code | 枚举(ContainmentLevelCode) | 相应 MenuItem 是否包含、可能包含或不包含相应添加剂。 默认值为 contains。 可选。 |
| 字段名称 | 类型 | 要求 | 说明 |
|---|---|---|---|
allergen_type_code | 枚举(AllergenTypeCode) | 必需 | 过敏原类型。 必填。 |
containment_level_code | 枚举(ContainmentLevelCode) | 相应 MenuItem 是否包含、可能包含或不包含相应过敏原。 默认值为 contains。 可选。 |
| 字段名称 | 类型 | 要求 | 说明 |
|---|---|---|---|
deposit_code | 枚举(DepositCode) | 要采用的押金策略,例如“可重复使用”。 可选。 | |
deposit_value | 对象(Money) | 因正确存放商品而退还的金额。可选。 |
| 字段名称 | 类型 | 要求 | 说明 |
|---|---|---|---|
menu_item_option_id | 字符串 | 必需 | 合作伙伴提供的不透明字符串,用于在合作伙伴 Feed 中唯一标识 MenuItemOption。 必填。 |
value | 对象(MenuItemOptionProperty) | 必需 | 选项属性和值,例如“尺寸:小”。 必填。 |
| 字段名称 | 类型 | 要求 | 说明 |
|---|---|---|---|
property_type | 枚举(PropertyType) | 必需 | 相应选项属性的类型。 必填。 |
| oneOf(value) | 必需 | 只能设置相应 oneOf 中的一个字段。 |
NutritionValueUnit
| 名称 | 说明 |
|---|---|
NUTRITION_VALUE_UNIT_UNSPECIFIED | 请勿使用。未明确设置营养价值单位。 |
ENERGY_CALORIES | 用于表示菜单项中能量含量的单位。 |
ENERGY_KILOJOULES | |
WEIGHT_MILLIGRAMS | 用于表示菜单项中某种物质的重量的单位。 |
WEIGHT_GRAMS |
DietaryRestriction
表示在食物准备过程中遵守的饮食限制或指南。
| 名称 | 说明 |
|---|---|
DIET_UNSPECIFIED | 请勿使用。未明确指定饮食禁忌。 |
DIET_DIABETIC | |
DIET_GLUTEN_FREE | |
DIET_HALAL | |
DIET_HINDU | |
DIET_KOSHER | |
DIET_LOW_CALORIE | |
DIET_LOW_FAT | |
DIET_LOW_LACTOSE | |
DIET_LOW_SALT | |
DIET_VEGAN | |
DIET_VEGETARIAN |
ContainmentLevelCode
指明食品中某种属性(例如过敏原或添加剂)的含量水平。
| 名称 | 说明 |
|---|---|
CONTAINMENT_LEVEL_CODE_UNSPECIFIED | 请勿使用。未明确指定包含级别代码。 |
CONTAINMENT_LEVEL_CODE_CONTAINS | |
CONTAINMENT_LEVEL_CODE_DOES_NOT_CONTAIN | |
CONTAINMENT_LEVEL_CODE_MAY_CONTAIN |
AllergenTypeCode
从 GS1 派生的过敏原类型:http://gs1.org/voc/AllergenTypeCode
| 名称 | 说明 |
|---|---|
ALLERGEN_TYPE_CODE_UNSPECIFIED | 请勿使用。未明确指定过敏原类型代码。 |
ALLERGEN_TYPE_CODE_ALMONDS | |
ALLERGEN_TYPE_CODE_ALPHA_ISOMETHYL_IONONE | |
ALLERGEN_TYPE_CODE_ALCOHOL | |
ALLERGEN_TYPE_CODE_AMYL_CINNAMAL | |
ALLERGEN_TYPE_CODE_ANISE_ALCOHOL | |
ALLERGEN_TYPE_CODE_BARLEY | |
ALLERGEN_TYPE_CODE_BENZYL_ALCOHOL | |
ALLERGEN_TYPE_CODE_BENZYL_BENZOATE | |
ALLERGEN_TYPE_CODE_BENZYL_CINNAMATE | |
ALLERGEN_TYPE_CODE_BENZYL_SALICYLATE | |
ALLERGEN_TYPE_CODE_BRAZIL_NUTS | |
ALLERGEN_TYPE_CODE_BUTYLPHENYL_METHYLPROPIONATE | |
ALLERGEN_TYPE_CODE_CARROTS | |
ALLERGEN_TYPE_CODE_CASHEW_NUTS | |
ALLERGEN_TYPE_CODE_CELERY | |
ALLERGEN_TYPE_CODE_CEREALS_CONTAINING_GLUTEN | |
ALLERGEN_TYPE_CODE_CINNAMAL | |
ALLERGEN_TYPE_CODE_CINNAMYL_ALCOHOL | |
ALLERGEN_TYPE_CODE_CITRAL | |
ALLERGEN_TYPE_CODE_CITRONELLOL | |
ALLERGEN_TYPE_CODE_COCOA | |
ALLERGEN_TYPE_CODE_CORIANDER | |
ALLERGEN_TYPE_CODE_CORN | |
ALLERGEN_TYPE_CODE_COUMARIN | |
ALLERGEN_TYPE_CODE_CRUSTACEANS | |
ALLERGEN_TYPE_CODE_EGGS | |
ALLERGEN_TYPE_CODE_EUGENOL | |
ALLERGEN_TYPE_CODE_EVERNIA_FURFURACEA | |
ALLERGEN_TYPE_CODE_EVERNIA_PRUNASTRI | |
ALLERGEN_TYPE_CODE_FARNESOL | |
ALLERGEN_TYPE_CODE_FISH | |
ALLERGEN_TYPE_CODE_GERANIOL | |
ALLERGEN_TYPE_CODE_GLUTEN | |
ALLERGEN_TYPE_CODE_HAZELNUTS | |
ALLERGEN_TYPE_CODE_HEXYL_CINNAMAL | |
ALLERGEN_TYPE_CODE_HYDROXYCITRONELLAL | |
ALLERGEN_TYPE_CODE_HYDROXYISOHEXYL_3_CYCLOHEXENE_CARBOXALDEHYDE_ISOEUGENOL_LIMONENE_LINAL | |
ALLERGEN_TYPE_CODE_KAMUT | |
ALLERGEN_TYPE_CODE_LACTOSE | |
ALLERGEN_TYPE_CODE_LUPINE | |
ALLERGEN_TYPE_CODE_MACADAMIA_NUTS | |
ALLERGEN_TYPE_CODE_METHYL_2_OCTYNOATE | |
ALLERGEN_TYPE_CODE_MILK | |
ALLERGEN_TYPE_CODE_MOLLUSCS | |
ALLERGEN_TYPE_CODE_MUSTARD | |
ALLERGEN_TYPE_CODE_NO_DECLARED_ALLERGENS | |
ALLERGEN_TYPE_CODE_OAT | |
ALLERGEN_TYPE_CODE_PEANUTS | |
ALLERGEN_TYPE_CODE_PEAS | |
ALLERGEN_TYPE_CODE_PECAN_NUTS | |
ALLERGEN_TYPE_CODE_PISTACHIOS | |
ALLERGEN_TYPE_CODE_POD_FRUITS | |
ALLERGEN_TYPE_CODE_QUEENSLAND_NUTS | |
ALLERGEN_TYPE_CODE_RYE | |
ALLERGEN_TYPE_CODE_SESAME_SEEDS | |
ALLERGEN_TYPE_CODE_SOYBEANS | |
ALLERGEN_TYPE_CODE_SPELT | |
ALLERGEN_TYPE_CODE_SULPHUR_DIOXIDE | |
ALLERGEN_TYPE_CODE_TREE_NUTS | |
ALLERGEN_TYPE_CODE_TREE_NUT_TRACES | |
ALLERGEN_TYPE_CODE_WALNUTS | |
ALLERGEN_TYPE_CODE_WHEAT |
DepositCode
指明如何正确存放食品或瓶子。
| 名称 | 说明 |
|---|---|
DEPOSIT_CODE_UNSPECIFIED | 请勿使用。未明确指定存款代码。 |
DEPOSIT_CODE_REUSABLE | |
DEPOSIT_CODE_RECYCLABLE |
PropertyType
相应选项所适用的媒体资源类型。
| 名称 | 说明 |
|---|---|
UNKNOWN_PROPERTY_TYPE | 请勿使用。未明确指定房源类型。 |
OPTION | 一种通用的菜单项选项属性,不属于以下任何更具体的类型。如果相应属性不是 SIZE 或 PIZZA_SIDE 类型,请使用此属性。 |
SIZE | 表示尺寸的菜单项选项属性(例如小号、中号或大号)。 |
PIZZA_SIDE | 披萨专属的媒体资源。例如:此 MenuItemOption 仅适用于部分/整个披萨,例如左侧、右侧或整个披萨上的蘑菇配料。 |
PropertyValue
选项属性的明确定义的值。
| 名称 | 说明 |
|---|---|
UNKNOWN_PROPERTY_VALUE | 请勿使用。未明确指定属性值。 |
PIZZA_SIDE_LEFT | MenuItemOption 仅适用于披萨的左半份。 |
PIZZA_SIDE_RIGHT | MenuItemOption 仅适用于披萨的右半部分。 |
PIZZA_SIDE_WHOLE | MenuItemOption 适用于整个披萨。 |
类型
| 字段名称 | 类型 | 要求 | 说明 |
|---|---|---|---|
menu | 对象(Menu) | 与 | |
section | 对象(MenuSection) | 与 | |
item | 对象(MenuItem) | 与 | |
option | 对象(MenuItemOption) | 与 |
| 字段名称 | 类型 | 要求 | 说明 |
|---|---|---|---|
offer_set | 对象(OfferSet) | 与 | 可用于购买此食品的优惠。 |
menu_item_option_set | 对象(MenuItemOptionSet) | 与 | 相应菜单项的可用选项。 |
| 字段名称 | 类型 | 要求 | 说明 |
|---|---|---|---|
amount | 数值 | 与 | 表示营养价值的单个数字。 |
range | 对象(Range) | 与 | 表示营养价值的范围。 |
| 字段名称 | 类型 | 要求 | 说明 |
|---|---|---|---|
property_val | 枚举(PropertyValue) | 与 | 选项属性的明确定义的值。目前仅当 property_type 为 PIZZA_SIDE 时才需要。 |
text_val | 对象(TextField) | 与 | 属性值的自由格式文本。对于 property_type OPTION 和 SIZE,这是预期值。 |