Up until recently Schema.org’s support for structured data in website design and implementation has lacked any sophisticated functionality for restaurant websites to markup their menus. It was never intended as a comprehensive vocabulary for every specialized business function, but in the latest release webmasters for restaurant websites will now have the ability to do more with schema.
Before this update, restaurants could do little more than mark up their basic info such as name, address, phone number, hours of operation, (etc.).
In terms of structuring the data in their menus, all restaurant business websites had before was a basic menu property that could mark up their entire menu as a string of text, or point to the URL where their menu can be found. There was no way of actually marking up individual menu items and their associated information, such as prices or what type of menu they are on (breakfast, lunch, dinner).
Now restaurant owners and those who optimize restaurant websites for search engines now have the ability to use several new properties and types to actually structure the data rich information contained in a restaurant menu. These properties will also be of use to websites for other businesses that have menus, like coffee shops, bakeries, bars, and so forth.
So, to get started you’ll want to visit the schema.org/Restaurant page, where you’ll notice the old menu property has been replaced with a hasMenu property. Menus are now actual entities in schema.org with their own properties and subtypes. Objects of the type Menu now also have a hasMenuItem property, which can point to the new MenuItem entities, used to markup individual menu items.
Now for each MenuItem you will be able to mark up its name, a description, its price, and even its nutritional values. Another feature related to nutrition is the suitableForDiet property to categorize menu items that are low calorie, paleo, vegan, gluten free, or friendly to some other specialize dietary requirements.
Most restaurants have more than one menu, such as a lunch and dinner menu, so schema has built in a hasMenuSection property to cover this, and a MenuSection type that can be used to mark up the different menus. It can also be used to markup categories within these menu sections, such as appetizers, soups and salads, entrees, beverages, and desserts within the dinner menu.
First, use the hasMenu property on the home page to point to the menu like this:
<script type=”application/ld+json”>
{
“@context”: “http://schema.org”,
“@type”: “WebSite”,
“name”: “Your Restaurant’s Name”,
“url”: “http://YourRestaurantsURLHere.com/”,
“publisher”: {
“@type”: “Restaurant”,
“name”: “Your Restaurant’s Name Here”,
“hasMenu”: “http://YourRestaurantsURLHere.com/yourrestaurantsmenupage/”,
“logo”: “http://…..
If your restaurant has multiple menus, implement like this:
“hasMenu”: [
{
“@type”: “Menu”,
“name”: “Beverage”,
“url”: “http://YourRestaurantsURLHere.com/beverage-menu/”
},
{
“@type”: “Menu”,
“name”: “Lunch”,
“url”: “http://YourRestaurantsURLHere.com/lunch-menu/”
},
{
“@type”: “Menu”,
“name”: “Dinner”,
“url”: “http://YourRestaurantsURLHere.com/dinner-menu/”
}
],
On the menu page itself, if lunch is served between 11am and 4pm, the markup should begin like this:
<script type=”application/ld+json”>
{
“@context”: “http://schema.org”,
“@type”: “Menu”,
“name”: “Our Menu”,
“mainEntityOfPage”: “http://YourRestaurantsURLHere.com/menu/”,
“inLanguage”: “English”,
“offers”: {
“@type”: “Offer”,
“availabilityStarts”: “T11:00”,
“availabilityEnds”: “T16:00”
},
Next you can start marking up individual sections of the menu and menu items like so:
“hasMenuSection”: [
{
“@type”: “MenuSection”,
“name”: “Appetizers”,
“hasMenuItem”: [
{
“@type”: “MenuItem”,
“name”: “Fried Macaroni”,
“description”: “Try our delicious Southern fried macaroni fritters.”,
“offers”: {
“@type”: “Offer”,
“price”: “7.95”,
“priceCurrency”: “USD”
}
},
{
“@type”: “MenuItem”,
“name”: “Fried Pickles”,
“description”: “Served with ranch dressing.”,
“image”: “http://your-restaurant.com/images/fried-pickles-picture.jpg”,
“suitableForDiet”: “http://schema.org/KosherDiet”,
“nutrition”: {
“@type”: “NutritionInformation”,
“calories”: “573 calories”,
“fatContent”: “25 grams”,
“carbohydrateContent”: “26 grams”,
“proteinContent”: “61 grams”
},
“offers”: {
“@type”: “Offer”,
“price”: “7.95”,
“priceCurrency”: “USD”
}
}
]
},
The new restaurant menu functionalities don’t cover everything a restaurant menu might need to be completely structured, but they do cover a lot and now make schema incredibly robust for restaurant websites. If you have any questions, don’t hesitate to leave them in the comments below.