How to implement new dietary attributes in google business profile and menu schema in wordpress
Local search within the Google ecosystem keeps getting more specific. Smartphone users typing queries such as gluten-free restaurant near me, dairy-free catering, or kosher bakery do not want generic listings. They want dietary claims they can trust, quick access to ingredient lists, and clear statements about medical or religious requirements.
In October 2026 Google added four dietary attributes to restaurant menus in Google Business Profile (GBP): gluten-free, dairy-free, halal, and kosher. They join the vegetarian and vegan tags that already existed. Lisa Landsman of Google announced the change on LinkedIn, and Search Engine Roundtable reported it on 13 October 2026. Her explanation was short: “For millions of diners with specific dietary needs, dining out requires careful planning.” The tags sit on individual dishes, not on the business as a whole, so restaurants, bakeries, meal prep brands, and WooCommerce food stores need their menu data to agree across the profile and the WordPress site.
This technical guide explains where the badges live in GBP, how the Business Profile API exposes them, how to mark up the same dishes with Schema.org on WordPress, and how to describe dietary products in a Google Merchant Center feed.
What new dietary attributes are available in google business profile
Until this update, the dietary tags on a GBP menu covered vegetarian and vegan dishes. For people living with celiac disease, a milk allergy, or observing halal or kosher rules, that meant reading menu photos and reviews to find out what they could eat.
The new tags are set per menu item:
- Gluten-free: the dish is offered as gluten-free.
- Dairy-free: the dish contains no milk or milk products.
- Halal: the dish follows Islamic dietary law.
- Kosher: the dish follows Jewish dietary law (kashrut).
Google’s stated benefit is visibility of the dish itself. According to Landsman, when people search for a specific diet, “tagged dishes help your items stand out right on your profile.” Google has not published a statement that untagged restaurants are removed from filtered results, so treat the badges as a way to make the right dishes visible, not as a ranking switch.
The developer side moved at the same time. The Business Profile API changelog entry dated 9 October 2026 reads: “The DietaryRestriction enum now supports GLUTEN_FREE and DAIRY_FREE attributes for food menu items.” HALAL and KOSHER were already values of that enum, together with ORGANIC, VEGAN, and VEGETARIAN.
How to add dietary badges to menu items in google business profile
The badges are managed in the menu editor, which Google describes in its help article About the menu editor. The feature is available to food and drink businesses. The workflow:
- Open your Business Profile while signed in as an owner or manager.
- Select Edit menu.
- Choose an existing item, or add a new item with its name, description, and price. Items can be grouped into sections such as starters, mains, and desserts.
- Tick the dietary badges that apply to that dish and save.
Google’s help article lists a few constraints worth knowing before you start:
- Changes can take 24 to 48 hours to appear on Google Maps and Search.
- If your menu is supplied through the Business Profile API, the editor may not be available in Business Profile or Google Search. Pick one source of truth per location.
- You can upload a photo or PDF of a menu and have AI generate sections, items, descriptions, and prices. Google labels this feature experimental and asks you to review the result before publishing, so check every badge it suggests.
- When Google finds more than one menu source, you choose which one is public under the Full menu tab in Edit menu.
- Google may transcribe menu data from your website. Incorrect transcribed items can be fixed in the editor.
- The menu link itself lives under Edit profile, Business information, Contact, Menu link.
That transcription note is the practical reason the WordPress menu matters: if Google reads your site, the dish names, descriptions, and dietary statements on the page become input for the profile.
How dietary tags affect visibility in google maps and local search
Google’s own help page on local ranking names three factors: relevance, distance, and prominence. “Relevance is how well a Business Profile matches what someone is searching for.” A query such as gluten-free pizza near me is a relevance question, and a menu where the pizza is named, described, and tagged gluten-free gives Google something concrete to match. The same page states that “there’s no way to request or pay for a better local ranking on Google” and that more reviews and positive ratings can help.
Distance and prominence are outside the menu’s reach. What you control is whether the dishes a diner is looking for exist as structured items with the right tags, both in the profile and on the website Google may transcribe from. A profile with a photographed menu and no items gives the matching system much less to work with than a profile with tagged dishes.
Consistency also protects the diner. If a dish is tagged gluten-free in GBP while the WordPress menu says it is cooked in a shared fryer, one of the two statements is wrong, and the diner will find out at the table.
How to configure schema restaurant and menuitem with the suitablefordiet property
Publishing an online menu as a PDF or a static image hides the dishes from anything that reads text. To give Google individual dishes and their dietary classifications, mark the menu up as a Schema.org graph.
The primary types and properties include:
@type: RestaurantorFoodEstablishment: defines the physical business entity.hasMenu: links to the menu entity.hasMenuSection: organizes the menu into logical categories (appetizers, mains, desserts).hasMenuItem: represents an individual food item.suitableForDiet: declares diet compatibility using the standardizedRestrictedDietenumeration.
Schema.org RestrictedDiet has 11 members. The ones relevant to the new GBP badges are:
https://schema.org/GlutenFreeDiethttps://schema.org/HalalDiethttps://schema.org/KosherDiethttps://schema.org/VegetarianDiethttps://schema.org/VeganDiet
Here is a complete JSON-LD implementation designed for a WordPress restaurant site:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Restaurant",
"@id": "https://wppoland.com/location/#restaurant",
"name": "Pure Kitchen Bistro",
"image": "https://wppoland.com/images/content-governance-for-large-teams-scaling-wordpress.avif",
"url": "https://wppoland.com/location/",
"telephone": "+12025550143",
"priceRange": "$$",
"servesCuisine": [
"Modern American",
"Gluten-Free",
"Halal"
],
"address": {
"@type": "PostalAddress",
"streetAddress": "1200 K Street NW",
"addressLocality": "Washington",
"addressRegion": "DC",
"postalCode": "20005",
"addressCountry": "US"
},
"geo": {
"@type": "GeoCoordinates",
"latitude": 38.9026,
"longitude": -77.0284
},
"hasMenu": {
"@type": "Menu",
"@id": "https://wppoland.com/location/menu/#mainmenu",
"name": "Dietary Verified Menu",
"inLanguage": "en-US",
"hasMenuSection": [
{
"@type": "MenuSection",
"name": "Gluten-Free and Dairy-Free Entrees",
"hasMenuItem": [
{
"@type": "MenuItem",
"name": "Pan-Seared Atlantic Salmon",
"description": "Wild-caught salmon fillet served over roasted sweet potato puree without butter or dairy additives.",
"offers": {
"@type": "Offer",
"price": "32.00",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock"
},
"suitableForDiet": [
"https://schema.org/GlutenFreeDiet",
"https://schema.org/HalalDiet"
],
"nutrition": {
"@type": "NutritionInformation",
"calories": "520 calories"
}
},
{
"@type": "MenuItem",
"name": "Roasted Butternut Squash Bisque",
"description": "Velvety soup crafted with ginger and coconut milk, completely dairy-free and gluten-free.",
"offers": {
"@type": "Offer",
"price": "14.00",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock"
},
"suitableForDiet": [
"https://schema.org/GlutenFreeDiet",
"https://schema.org/VeganDiet"
]
}
]
}
]
}
}
]
}
</script>suitableForDiet is defined only for MenuItem and Recipe on schema.org/MenuItem, so put it on each dish, not on the Restaurant node. Google does not list a menu rich result in its search gallery, so this markup describes the dishes for machines that read it; it does not unlock a special search feature.
How google dietary restrictions map to schema.org restricted diets and eu allergens
The GBP badges, the Business Profile API, Schema.org, and EU food law each use their own vocabulary. Mapping them once, in one place in your code, prevents a dish from being dairy-free in one system and unlabelled in another.
GBP and API value (DietaryRestriction) | Schema.org RestrictedDiet | Notes |
|---|---|---|
GLUTEN_FREE | GlutenFreeDiet | Exact match |
DAIRY_FREE | none | LowLactoseDiet is not the same claim: low lactose still allows milk protein |
HALAL | HalalDiet | Exact match |
KOSHER | KosherDiet | Exact match |
VEGAN | VeganDiet | Exact match |
VEGETARIAN | VegetarianDiet | Exact match |
ORGANIC | none | Organic is a production method, not a diet in Schema.org |
The allergen side differs as well. The API’s Allergen enum, documented in the FoodMenus reference, has eight values: DAIRY, EGG, FISH, PEANUT, SHELLFISH, SOY, TREE_NUT, and WHEAT. Annex II of Regulation (EU) No 1169/2011 lists 14 groups: cereals containing gluten, crustaceans, eggs, fish, peanuts, soybeans, milk, nuts, celery, mustard, sesame, sulphur dioxide and sulphites, lupin, and molluscs. Celery, mustard, sesame, sulphites, lupin, and molluscs have no API value, so a European restaurant must state them on its own menu page even if the profile cannot carry them.
How to publish allergen information when schema.org has no allergen property
Schema.org has no allergen property for MenuItem. The type defines four properties of its own (menuAddOn, nutrition, offers, suitableForDiet), and additionalProperty is not among them, so markup that attaches allergen lists to a MenuItem through additionalProperty is invalid. The allergen statement belongs in the dish description and in the visible HTML next to the dish.
In the EU this is a legal requirement, not an SEO choice. Article 44(1)(a) of Regulation 1169/2011 makes allergen information mandatory for non-prepacked food, which covers restaurant meals. A valid MenuItem that carries both the diet and the allergen statement looks like this:
{
"@type": "MenuItem",
"name": "Buckwheat sourdough bread",
"description": "100% buckwheat loaf. Contains: none of the 14 EU allergens. Baked in a kitchen that does not handle wheat, rye, or barley.",
"suitableForDiet": [
"https://schema.org/GlutenFreeDiet",
"https://schema.org/VeganDiet"
],
"nutrition": {
"@type": "NutritionInformation",
"calories": "240 calories"
}
}If you claim gluten-free in the EU, the threshold is defined in law. Regulation (EU) No 828/2014 allows the statement “gluten-free” only where the food as sold to the final consumer contains no more than 20 mg/kg of gluten. A certification number from a celiac society can go in the visible text, but only a real one that you can show on request.
How to sync woocommerce dietary attributes with google merchant center
Many food businesses combine in-person dining with a WooCommerce shop: meal kits, frozen gluten-free bakery goods, or halal pantry items.
Google Merchant Center has no dedicated diet attribute. Its product data specification offers the product detail attribute (product_detail), which carries an optional section name, an attribute name, and an attribute value. Each detail is 1 to 150 characters, a product can have up to 100, and in a text feed the three parts are separated by exactly two colons, for example Dietary information:Gluten-free:Yes. Google asks for confirmed values only and says not to submit a default “False”, so send a detail only when the product really is gluten-free, halal, or kosher.
In WordPress, keep the diet in a global product attribute (pa_diet) and use it in two places: the feed plugin maps it to product_detail, and the product schema exposes it as additionalProperty, which Schema.org does allow on Product. Do not put suitableForDiet on a Product: that property belongs to MenuItem and Recipe.
<?php
/**
* Expose WooCommerce diet terms as additionalProperty on Product schema
*/
function wppoland_add_woocommerce_dietary_schema($markup, $product) {
$diet_terms = get_the_terms($product->get_id(), 'pa_diet');
if (empty($diet_terms) || is_wp_error($diet_terms)) {
return $markup;
}
foreach ($diet_terms as $term) {
$markup['additionalProperty'][] = [
'@type' => 'PropertyValue',
'name' => 'Dietary information',
'value' => $term->name,
];
}
return $markup;
}
add_filter('woocommerce_structured_data_product', 'wppoland_add_woocommerce_dietary_schema', 10, 2);Use the same term names in the feed, so the product page, the schema, and Merchant Center say the same thing.
How to update food menus through the google business profile api
For more than a handful of locations, editing menus by hand stops scaling. Google’s guide Update Food Menus describes the flow:
- Call
locations.getand read the location metadata. Only locations wherecanHaveFoodMenusistruecan receive menus. - Read the current menus with
GET https://mybusiness.googleapis.com/v4/accounts/{accountId}/locations/{locationId}/foodMenus. - Modify the menus and send them back with
PATCHto the same URL (accounts.locations.updateFoodMenus). - To attach a dish photo, get its
mediaKeyfromaccounts.locations.media.list. Cover and profile photos cannot be used.
The FoodMenus reference defines the structure as menus, sections, and items. Each FoodMenuItem has required labels and attributes. Inside FoodMenuItemAttributes, price is required; dietaryRestriction, allergen, and nutritionFacts are optional but recommended; spiciness, ingredients, servesNumPeople, preparationMethods, portionSize, and mediaKeys are optional. Display names should stay within 140 characters and descriptions within 1,000.
A minimal WordPress function that pushes a prepared menu payload:
<?php
/**
* Replace a location's food menus via the Business Profile API (v4)
*/
function wppoland_update_gbp_food_menus($account_id, $location_id, $token, array $menus) {
$url = sprintf(
'https://mybusiness.googleapis.com/v4/accounts/%s/locations/%s/foodMenus',
rawurlencode($account_id),
rawurlencode($location_id)
);
$response = wp_remote_request($url, [
'method' => 'PATCH',
'headers' => [
'Authorization' => "Bearer {$token}",
'Content-Type' => 'application/json',
],
'body' => wp_json_encode(['menus' => $menus]),
'timeout' => 15,
]);
return !is_wp_error($response) && wp_remote_retrieve_response_code($response) === 200;
}Each item in $menus carries its badges as 'dietaryRestriction' => ['GLUTEN_FREE', 'VEGAN'] inside attributes. Because the guide recommends reading the menus before writing them, build the payload from the GET response plus your changes, not from scratch.
How to manage dietary attributes across restaurant chains and wordpress multisite
For brands with several branches, dietary data needs one owner. A common mistake is tagging a dish as gluten-free on every profile when only some kitchens can prepare it safely.
In a WordPress Multisite or headless setup:
- Central recipe catalogue: keep dishes, ingredients, allergens, and diet tags in one custom post type shared by the network.
- Per-branch availability: store which branches can serve each dish, and render each branch page with its own
Restaurantschema and only the dishes that kitchen actually offers. - One mapping layer: convert internal diet terms to
DietaryRestrictionvalues for the API and toRestrictedDietURLs for Schema.org in a single function, using the table above, and call it from both outputs.
When a recipe changes, the change then flows to the website and to every profile in one deploy instead of being edited by hand in each place.
How to prepare menu content for voice search and ai assistants
Questions such as where can I get gluten-free burgers cooked on a separate grill near me need factual answers that a page states plainly.
What helps:
- Plain, specific statements on the menu page: say whether fries share a fryer with breaded food, whether gluten-free pasta is cooked in fresh water, and which days halal dishes are available.
- A short FAQ on food safety: written for the diner, answering the questions staff hear every week.
- Do not count on Speakable: Google’s speakable documentation states that the feature is in beta, works for users in the U.S. with Google Home devices set to English, and is aimed at news content. A restaurant menu outside that scope gains nothing from it.
How to get reviews that mention dietary safety without breaking google policy
Reviews from diners with allergies or religious requirements often describe exactly what others want to know: whether staff understood cross-contact, whether a separate prep area exists, whether a certificate is on display. Google’s local ranking page says more reviews and positive ratings can help.
The way you ask for them is regulated. Google’s policy on fake engagement prohibits offering payment, discounts, or free items for a review, selectively soliciting positive reviews, discouraging negative ones, and asking staff to obtain reviews with specific content. A QR code that asks guests to mention your gluten-free protocol is asking for specific content.
What stays within the rules:
- Ask every guest the same way: a neutral request on the receipt or the table card, without wording that steers the content.
- Reply factually as the owner: when a diner describes their experience, confirm what you actually do, for example that gluten-free dishes are prepared on a separate surface.
- Fix what reviews report: if a review describes a cross-contact incident, change the process and the menu text, then say so in the reply.
How to integrate online ordering and restaurant menus in wordpress without slowing down the site
Many hospitality websites slow down after embedding third-party ordering platforms through iframes or heavy JavaScript widgets. These embeds often hurt Core Web Vitals, especially Interaction to Next Paint (INP) and Largest Contentful Paint (LCP). Menu text that exists only inside a third-party iframe is also not part of your page.
Recommended architecture for WordPress:
- Server-rendered HTML for menu items: titles, descriptions, pricing, allergens, and diet tags should exist in the server-rendered HTML, readable by search bots and humans without scripts.
- On-demand ordering modal: load checkout scripts and delivery address pickers only after a customer clicks Order online.
- Optimized dish photography: serve menu images in AVIF or WebP with explicit
widthandheightattributes, so they do not cause layout shift.
The following WordPress snippet conditionally unloads heavy third-party ordering assets on informational pages:
<?php
/**
* Conditionally unload external ordering scripts to protect mobile INP
*/
function wppoland_unload_ordering_scripts_on_info_pages() {
if (!is_page('order-online') && !is_checkout()) {
wp_dequeue_script('third-party-ordering-sdk');
wp_dequeue_style('third-party-ordering-styles');
}
}
add_action('wp_enqueue_scripts', 'wppoland_unload_ordering_scripts_on_info_pages', 100);What allergen and dietary certification errors put a restaurant at risk
Dietary claims carry legal and medical responsibility. A mislabelled dish can cause anaphylaxis or intestinal damage in a celiac patient, and in the EU allergen information for restaurant food is mandatory under Article 44 of Regulation 1169/2011.
Errors to avoid:
- Loose gluten-free claims: labelling a dish gluten-free without meeting the 20 mg/kg limit of Regulation 828/2014, for example a pizza base that is simply yeast-free.
- Halal or kosher without a basis: claiming religious dietary status without documented supervision or certification misleads the diners who rely on it most.
- Unacknowledged cross-contact: gluten-free pasta boiled in the same water as wheat pasta is not gluten-free. State operational realities on your WordPress menu: Prepared in a kitchen that also handles wheat and nuts.
- Limited serving schedules: if halal or kosher dishes are only prepared on certain days, say so on the menu page and in the item description in GBP.
Accurate menus protect diners first and the business second.
How to track traffic from dietary searches in gbp performance and analytics
Measure the effect of the work in the profile’s own data and in your website analytics, not in a ranking guess.
1. Business Profile performance data
The Business Profile Performance API exposes the same numbers as the Performance view in the profile. Useful ones for a menu project:
BUSINESS_FOOD_MENU_CLICKS: clicks to view or interact with the menu, counted once per user per day.BUSINESS_DIRECTION_REQUESTSandWEBSITE_CLICKS: what diners did after seeing the profile.- Search keywords: the monthly search keywords endpoint returns the lowercased terms people used to find the business, with impressions per month. Low-volume terms come back as a threshold instead of an exact count, so filter for terms containing gluten-free, dairy-free, halal, or kosher and compare months, not days.
2. UTM tags in website analytics
Tag the website and menu links in the profile so visits from GBP are separated from other organic traffic:
https://wppoland.com/location/?utm_source=google&utm_medium=organic&utm_campaign=gbp_listing
https://wppoland.com/location/menu/?utm_source=google&utm_medium=organic&utm_campaign=gbp_menuThe campaign tags are read by your analytics tool (GA4, Umami, or similar), so segment the gbp_menu campaign there. Google Search Console reports search queries and pages, not UTM campaigns, so use it for the organic queries that reach the menu page itself.
Combining tagged dishes in Google Business Profile with a clean, schema-backed WordPress menu and honest allergen statements gives diners and Google the same answer in every place they look.






