Installation & Activation
Flavor – Restaurant Menu is a WordPress plugin. Install it like any other plugin — no build tools or FTP required.
Install from WordPress.org
Go to Plugins → Add New
In your WordPress admin dashboard, navigate to Plugins → Add New Plugin.
Search for "Flavor Menu"
Type Flavor Menu in the search field and press Enter.
Install & Activate
Click Install Now, then Activate. The plugin menu appears under Menü in your admin sidebar.
Install via ZIP (Pro)
After purchasing Pro, download the .zip file from your Freemius account. Then:
- Go to Plugins → Add New → Upload Plugin
- Choose the downloaded
flavor-restaurant-menu-premium.zip - Click Install Now → Activate
Quick Start Guide
Create your first restaurant menu in under 5 minutes.
Create a category
Go to Menu → Categories and add your first category (e.g. "Starters", "Main Courses").
Add your first dish
Go to Menu → Dishes and click Add dish. Enter the name, description, price and category.
Add the shortcode to a page
Create or edit a WordPress page and add [flavor_menu]. The menu appears automatically.
Preview & customize
Visit the page on the frontend. Adjust layout, theme and columns via shortcode parameters.
Free vs. Pro
Flavor is available in a free version on WordPress.org and a Pro version with all features unlocked.
| Feature | Free | Pro |
|---|---|---|
| Dishes | Unlimited | Unlimited |
| Categories | ✓ | ✓ |
| Card Grid layout | ✓ | ✓ |
| 6 additional layouts | – | ✓ |
| Theme: Elegant Dark | ✓ | ✓ |
| Themes: Light, Earth, Custom | – | ✓ |
| 40 Google Fonts | – | ✓ |
| Multiple prices per dish | – | ✓ |
| Badges | – | ✓ |
| Allergens & Nutrition | – | ✓ |
| Guest Ratings | – | ✓ |
| Multiple Locations | – | ✓ |
| QR Code Table Stand | – | ✓ |
| CSV Import / Export | – | ✓ |
| Gutenberg / Elementor / WPBakery | ✓ | ✓ |
Dishes & Categories
Adding a Dish
Open a dish under Menu → Dishes. Every dish has the following fields:
| Field | Description |
|---|---|
| Title | The dish name, displayed prominently in all layouts. |
| Description | Long description text (post content). Used in Card Grid, Horizontal and Featured layouts. |
| Subtitle | Short tagline shown below the title (e.g. "with truffle oil"). |
| Price(s) | One or more prices with optional labels (e.g. Small / Large). |
| Category | Assign to one or more menu categories. |
| Sort Order | Integer — dishes are sorted ascending. Lower number = appears first. |
| Featured Image | Dish photo — used in card layouts. |
| Badge | Optional badge (e.g. "Popular", "New", "Vegan"). Pro only. |
| Location | Assign to one or more restaurant locations. Pro only. |
| Allergens | Tick applicable EU allergens. Pro only. |
| Nutrition | Calories, fat, carbs, protein per 100g. Pro only. |
Categories
Go to Menu → Categories to manage categories. Categories are hierarchical — you can create parent categories (e.g. "Food") and subcategories (e.g. "Starters", "Main Courses").
Category Sort Order
The same screen has a Sort categories section underneath — drag the rows there to reorder them. The order set here controls the display sequence in all layouts.
Shortcode Reference
The [flavor_menu] shortcode renders the menu on any page or post. All parameters are optional.
[flavor_menu
title=""
description=""
category=""
location=""
layout="card-grid"
style="dark"
columns="3"
image_ratio="4-3"
show_filter="yes"
sticky_filter="no"
hide_all_btn=""
default_category=""
show_badges="yes"
currency="€"
currency_position="auto"
limit="150"
el_class=""
]
All Parameters
| Parameter | Description | Default |
|---|---|---|
| title | Menu heading displayed above the filter bar. | empty |
| description | Subtitle text below the heading. | empty |
| category | Slug of a category to show only that category (and its children). | all |
| location | Slug(s) of location(s), comma-separated. Filters dishes by location. Pro | all |
| layout | One of: card-grid, price-list, table, horizontal, featured, compact, sectioned. Pro except card-grid. | card-grid |
| style | Theme: dark, light, earth, custom-1, custom-2, custom-3. Pro except dark. | dark |
| columns | Number of columns: 2, 3 or 4. Applies to card-grid and horizontal layouts. Pro | 3 |
| image_ratio | Image aspect ratio: 4-3, 1-1 or 16-9. Pro | 4-3 |
| show_filter | Show category filter buttons: yes or no. | yes |
| sticky_filter | Keep the category filter bar pinned to the top while scrolling: yes or no. Applies to Card Grid and Horizontal layouts. | no |
| hide_all_btn | Hide the "All" filter button: yes or no. | no |
| default_category | Slug of the category pre-selected when the page loads. | all |
| show_badges | Show badges on dishes: yes or no. Pro | yes |
| currency | Currency symbol shown with each price (e.g. €, $, £, CHF). | € |
| currency_position | Which side of the amount the symbol sits on: auto, after or before. See Currency symbol & position below. | auto |
| limit | Maximum number of dishes to load. Max 999. | 150 |
| el_class | Extra CSS class added to the wrapper for custom styling. | empty |
Examples
[flavor_menu layout="price-list" style="light" title="Our Menu"]
[flavor_menu layout="card-grid" columns="2" category="drinks" currency="$"]
[flavor_menu layout="sectioned" style="earth" location="berlin" limit="50"]
Currency Symbol & Position
Set your currency with the currency parameter — any text works (€, $, £, CHF, kr, …). By default, Flavor places the symbol on the side that matches it: symbols that belong in front of the amount ($, £, ¥, ₹) are shown before the price, and everything else after it.
| currency | Result |
|---|---|
| € | 32.00 € |
| $ | $32.00 |
| £ | £32.00 |
| CHF | CHF 32.00 |
Need a different placement? Use currency_position to override the automatic choice:
| currency_position | Effect |
|---|---|
auto (default) | Chosen automatically from the symbol, as shown above. |
after | Always after the amount — e.g. 32.00 $. |
before | Always before the amount — e.g. €32.00. |
[flavor_menu currency="$" currency_position="before"]
In the Gutenberg, Elementor and WPBakery builders the same setting is available as a Currency Position dropdown next to the currency field.
All 7 Layouts
Flavor offers 7 distinct layouts to match any restaurant style. Card Grid is available in the Free version — all others require Pro.
Card Grid Free
The default layout. Dishes displayed as photo cards in a 2–4 column grid. Includes a category filter bar and subcategory scroll navigation.
- Category filter buttons at the top
- Subcategory scroll navigation (subnav)
- Allergen abbreviations shown as circled badges on the front of each card (bottom-left)
- Nutritional values revealed via a 180° card flip on click
- Guest ratings displayed as stars below the price
[flavor_menu layout="card-grid" columns="3"]
Price List Pro
A classic restaurant menu list. Each row shows dish name, dot leaders and price in a single line. Descriptions appear below the name.
- Dot leaders between name and price
- Allergen ⓘ button after dish name → floating popup
- Multiple prices stacked below the name
[flavor_menu layout="price-list" style="light"]
Table Pro
A structured table format. Ideal for menus with many dishes across categories. Allergens are shown as abbreviation chips with inline popovers.
[flavor_menu layout="table"]
Horizontal Card Pro
Each dish is displayed as a wide card with the photo on the left and content on the right. Allergens trigger a 180° flip showing allergen info and nutrition values.
[flavor_menu layout="horizontal" columns="2"]
Featured Pro
The dish with the lowest Sort Order in each category becomes the hero — displayed large at the top. Remaining dishes appear in a smaller grid below.
Sort Order value in its category.[flavor_menu layout="featured"]
Compact List Pro
A dense, text-only list ideal for large menus or drinks cards. Prices appear as chips. Clicking a row opens the allergen popup.
[flavor_menu layout="compact"]
Sectioned List Pro
Categories appear as large decorative headings. Dishes are listed beneath each category heading. Ideal for print-style menus.
[flavor_menu layout="sectioned" style="earth"]
Themes & Colors
Flavor ships with 3 built-in themes and 3 fully customizable custom theme slots.
| Theme | Shortcode value | Availability |
|---|---|---|
| Elegant Dark | dark | Free & Pro |
| Clean Light | light | Pro |
| Warm Earth | earth | Pro |
| Custom 1 | custom-1 | Pro |
| Custom 2 | custom-2 | Pro |
| Custom 3 | custom-3 | Pro |
Custom Themes
Go to Design → Themes to configure up to 3 custom color themes. Each theme has 7 color pickers:
- Card Background — surface color of dish cards
- Border Color — subtle separators and outlines
- Accent Color — prices, badges, highlights
- Heading Color — dish names and category titles
- Text Color — descriptions and body text
- Muted Text — subtitles and secondary info
- Dot Line Color — price list dot leaders
Typography & Fonts Pro
Go to Design → Typography to set a heading font and a body font for your menu. Choose from 40 curated Google Fonts across 3 groups.
Font Groups
- Serif — elegant, classic restaurant feel (e.g. Playfair Display, Cormorant Garamond)
- Sans-Serif — modern, clean (e.g. DM Sans, Inter)
- Display — decorative, unique (e.g. Josefin Sans, Abril Fatface)
Local Font Caching (GDPR)
Flavor can download font files to your server so no request is made to Google's CDN. Go to Design → Typography → Local Font Cache and click Download Fonts Locally.
- Font files are saved to
wp-content/uploads/flavor-fonts/ - Once cached, zero requests leave your domain
- You can clear the cache at any time to revert to Google CDN
Allergens & Nutrition Pro
Flavor supports all 14 EU mandatory allergens (Regulation 1169/2011) and optional nutritional values per dish.
Setting Up Allergens
In the dish edit screen, scroll to the Allergens & Nutrition meta box. Tick any applicable allergens:
The 14 EU Allergens
Gluten · Crustaceans · Eggs · Fish · Peanuts · Soybeans · Milk · Nuts · Celery · Mustard · Sesame · Sulphites · Lupin · Molluscs
Nutritional Values
Below the allergen checkboxes, enter optional values per 100g: Calories (kcal), Fat (g), Carbohydrates (g), Protein (g).
How Allergens Display per Layout
| Layout | Display method |
|---|---|
| Card Grid | Circled allergen abbreviations on the card front (bottom-left); if nutrition is set, an ⓘ badge appears and clicking the card flips to the nutrition table |
| Horizontal Card | Card flip → two-column layout (allergens left, nutrition right) |
| Featured | Click hero or mini card → flip |
| Price List | ⓘ button after dish name → centered floating popup |
| Compact List | ⓘ button after description → click row to open popup |
| Sectioned List | ⓘ button after dish name → centered floating popup |
| Table | Abbreviation chips below dish name → click chip → inline popover |
Guest Ratings Pro
Allow guests to rate dishes from 1 to 5 stars directly in the Card Grid layout.
Enable Ratings
Go to Add-ons → Guest ratings and toggle ratings on. The star widget appears on every dish card.
How it Works
- Guests click a star (1–5) on any dish card
- Rating is saved per IP address — one vote per dish per visitor
- Average rating and vote count are displayed below the price
- Clicking stars on a flippable card does not trigger the nutrition flip
Badges Pro
Badges are small colored labels (e.g. "Popular", "New", "Vegan") that appear on dish cards and in list layouts.
Create a Badge
Go to Add-ons → Badges. Enter a badge name, choose a background color and an optional emoji. Save.
Assign a Badge to a Dish
In the dish edit screen, select a badge from the Badge dropdown in the meta box. Each dish can have one badge.
show_badges="no".Multiple Locations Pro
If you run multiple restaurant branches, assign dishes to specific locations and show a location-specific menu per page.
Setup
Create locations
Go to Locations and add a location for each branch (e.g. "berlin", "munich").
Assign dishes
In each dish's edit screen, tick the applicable location(s) in the Locations meta box.
Use the shortcode
Add location="berlin" to your shortcode. Only dishes assigned to that location are shown.
[flavor_menu location="berlin" layout="price-list"]
Locations and reservations
A single location is cosmetic: with only one branch every view still runs as if there were none, so nothing changes for existing bookings. The second location is the moment branches become real — from then on every view has a concrete branch selected, and guests choose one when they book.
Because of that, creating the second location asks a question first: your existing reservations do not belong to a branch yet, and left that way they would disappear from the timeline and the room. Flavor tells you how many there are — split into upcoming and past — and lets you assign them to the branch that took them (usually the one you already had) or to the new one. The room you drew before goes to the branch that carried the business, so seated guests keep their tables.
QR Code & Table Stand Pro
Generate a print-ready table stand card with a QR code linking to your menu page — directly from the WordPress admin.
Steps
Go to Tools → QR / Table Stand
Enter the URL of your menu page (the page with the [flavor_menu] shortcode).
Customize the design
Choose a style (Minimal / Elegant / Branded), paper size (A5 / A6), colors, logo and background image.
Save as PDF
Click Save as PDF. The design is rendered at high resolution (~267 DPI for A6) and opens in a new browser tab ready to print.
CSV Import / Export Pro
Go to Tools → CSV Import / Export to bulk-import dishes from a CSV file or export your entire menu.
CSV Column Format
| Column | Required | Description |
|---|---|---|
| title | ✓ | Dish name |
| description | Long description text | |
| subtitle | Short tagline | |
| category | Category name or path using > for subcategories (e.g. Food > Starters) | |
| sort_order | Integer sort order | |
| price_1 | First price value | |
| price_1_label | Label for first price (e.g. "Small") | |
| price_2 | Second price value | |
| price_2_label | Label for second price | |
| price_3 | Third price value | |
| price_3_label | Label for third price | |
| badge | Badge slug | |
| location | Location slug(s), comma-separated | |
| allergens | Allergen slugs, comma-separated (e.g. gluten,milk) | |
| calories | Calories per 100g | |
| fat | Fat in grams per 100g | |
| carbs | Carbohydrates in grams per 100g | |
| protein | Protein in grams per 100g |
Import Behavior
- Update existing — a dish with the same title is updated, not duplicated
- Auto-create categories — categories that don't exist are created automatically
- Preview — the first 5 rows are shown before the actual import runs
- Result report — each row shows ✓ Created / ↻ Updated / ✗ Error
- Encoding — UTF-8 (with or without BOM)
- Separator — comma
,or semicolon;(configurable) - Max file size — 2 MB
SEO & Schema Markup Pro
With Flavor Pro, every menu automatically outputs Schema.org structured data as JSON-LD. This helps search engines and AI assistants understand your menu — your dishes, categories, prices and nutritional values — without any configuration.
What gets generated
The plugin mirrors your rendered menu as a Menu → MenuSection → MenuItem graph, embedded in a <script type="application/ld+json"> tag inside the menu. It includes:
- Categories & subcategories as nested
MenuSectionentries - Each dish as a
MenuItemwith its name, description and image - Prices as
Offerentries — one per price variant, with the variant label and an ISO 4217 currency code (€ → EUR, $ → USD, …) - Nutrition as
NutritionInformation(calories, fat, carbs, protein) when entered
Example output
{
"@context": "https://schema.org",
"@type": "Menu",
"name": "Our Menu",
"hasMenuSection": [
{
"@type": "MenuSection",
"name": "Starters",
"hasMenuItem": [
{
"@type": "MenuItem",
"name": "Bruschetta",
"description": "Toasted sourdough, vine tomato, basil",
"offers": { "@type": "Offer", "price": "8.50", "priceCurrency": "EUR" },
"nutrition": {
"@type": "NutritionInformation",
"calories": "320 kcal",
"proteinContent": "9 g"
}
}
]
}
]
}
Verify it
Paste your published menu URL into Google's Rich Results Test or the Schema.org Validator to confirm the menu data is detected.
12,90 € becomes 12.90). If your currency symbol can't be mapped to an ISO 4217 code, the price is still included without a currency.Table Reservations Free Pro
Let guests request a table online. Each booking is a request that you approve or decline — there is no automatic confirmation, so you stay in control. Capacity-based booking is free; the visual room, per-location settings, seating and analytics are Pro.
Add the reservation form to any page with the shortcode, or use the native Reservation Form element under the Flavor Restaurant category in Gutenberg, Elementor or WPBakery.
[flavor_reservation]
Everything on the operator side lives in the Flavor admin panel under Reservations, split into four screens:
| Screen | What it is for |
|---|---|
| Service | One day at a time: approve requests, seat guests, take walk-ins. Three views of the same day — List, Timeline and Room. |
| Set up room Pro | Master data: draw the room, check seats against capacity. You build here, you work on Service. |
| Analytics Pro | Covers, no-show rate and busiest times over the last 7 / 30 / 90 days. |
| Settings | How guests may book: capacity, hours, closed days, contact and privacy. |
| Capability | Free | Pro |
|---|---|---|
| Capacity-based booking requests | ✓ | ✓ |
| Email approval (approve / decline, no login) | ✓ | ✓ |
| Opening hours, slots, closed days | ✓ | ✓ |
| Day list + GDPR auto-deletion | ✓ | ✓ |
| Edit a booking (move, resize, correct) | ✓ | ✓ |
| Search by name, phone or email | ✓ | ✓ |
| Turn time staggered by party size | ✓ | ✓ |
| Per-location capacity & hours | – | ✓ |
| Visual room + guest-first seating | – | ✓ |
| Timeline (one lane per table) | – | ✓ |
| Walk-ins (seat guests on the spot) | – | ✓ |
| Analytics | – | ✓ |
Setup & Settings
Open Reservations → Settings. The settings are grouped into three cards.
Bookable
The rules a guest's booking has to satisfy.
| Setting | Description |
|---|---|
| Slot interval | Spacing between bookable times (15 / 30 / 60 min). |
| Minimum lead time | Earliest a guest can book, in hours from now. |
| Maximum advance | Furthest a guest can book, in days ahead. |
| Party size cap | Larger groups are asked to call instead of booking online. |
Capacity & hours
| Setting | Description |
|---|---|
| Total capacity (seats) | Maximum guests seated at the same time. A guide for the availability read-out, never a hard limit — you can always overbook deliberately. |
| Turn time | How long a table is held per booking. Drives overlap, the timeline and the seating suggestions. |
| Longer for larger parties | Turn time covers parties up to a given size; every further group of that size adds extra minutes. Leave the minutes at 0 to hold every table for the same time. See below. |
| Opening hours | Per weekday open/close; the bookable slots are derived from these. A closing time at or before the opening time means service runs past midnight (e.g. 18:00–02:00) and is handled as one business day. |
| Closed days | Block-out dates, added as chips with a date picker. |
Turn time by party size
A party of eight does not leave as quickly as a two-top, and treating them alike skews availability, the timeline and the seating suggestions. With a base of 120 minutes covering up to 4 guests and 30 extra minutes per further group of four, you get:
1–4 guests: 120 min · 5–8: 150 min · 9–12: 180 min
The ladder is printed under the fields so you can see what you just described. The extra minutes default to 0, which behaves exactly like a single flat turn time — nothing changes until you opt in.
Contact & privacy
| Setting | Description |
|---|---|
| Contact phone | Shown after a guest submits and in the confirmation email, so they can call if they don't hear back. |
| Notification e-mail | Where new requests are sent. Empty = the site admin address. |
| Auto-delete after (days) | Past reservations are deleted automatically after this many days (GDPR). 0 = keep. Always account-wide, never per location. |
Several locations Pro
With more than one location, Settings shows a pill per location. Each location holds its own full settings — capacity, turn time, opening hours and closed days. There is no shared "global default" that branches inherit from, so changing one branch never moves another.
Each location can also have its own notification e-mail, set on the same screen. A request is routed to the location address first, then the account address, then the site admin.
The same applies to the room: every location draws its own — see Room & Seating.
Shortcode parameters
| Parameter | Description | Default |
|---|---|---|
| title | Heading above the form. | Reserve a table |
| intro | Short text under the heading. | — |
| style | light or dark. | light |
| location | Pro Lock the form to one location slug (e.g. a per-branch page). | — |
| el_class | Extra CSS class on the wrapper. | — |
Booking Flow
For the guest
Fill in the form
Date, time, party size, name and email are required; phone and note are optional. Times are limited to your opening hours; oversized parties are asked to call.
Get an instant on-page confirmation
The guest sees "request received" with your phone number, and gets a confirmation email — even if they mistype their address, the phone fallback catches it.
Receive the decision
Once you approve, the guest gets a confirmation email with a calendar (.ics) file and a one-click cancellation link.
For you (the operator)
Everything below happens on Reservations → Service. A context bar at the top fixes what you are looking at — which day, which location — and stays put while you switch between List, Timeline and Room. It also shows the day's covers and the peak against your capacity.
Approve from your inbox
Every request emails you the details plus an availability hint. Two buttons — Confirm / Decline — work without logging in (secure per-reservation links, safe against email prefetch).
Or clear the approval strip
A strip above the day's list collects everything waiting for you: open requests of any date (an overdue request still needs an answer) and, on Pro, today's confirmed guests who have no table yet. Each request shows what approving it would do to the room — "→ 38/50" — so a party of eight is never waved through blind.
Work the day's list
Each row is one line — time, guest, party, status, table — with a single primary action and a "⋯" menu for the rest (Decline, Arrived, No-show, Cancel, Edit, E-mail guest, Delete). Click the row to open contact details, note and timestamps.
Change a booking when a guest calls
"⋯" → Edit opens the booking in a dialog: time, party size, name, phone, email, note, and the location. The status is untouched — approving, declining and cancelling stay with the row actions. Tick the box and the guest is sent the new details with a fresh calendar entry; their cancellation link keeps working even when you move the booking to another day.
Find a booking
The search box takes a name, phone number or email and looks across every date, so "I booked for Saturday, Müller" does not mean guessing the day. Phone numbers match regardless of spaces, dashes or slashes. Cancelled bookings show up too — usually they are exactly the one being asked about.
Add phone bookings yourself
+ Add reservation opens a dialog for a booking you took by phone. It is saved as confirmed straight away; email is optional, and you choose whether to send a confirmation. A live availability hint shows the load as you type.
Seat them & take walk-ins Pro
Give each confirmed guest a table with one click, or seat a walk-in on the spot — see Room & Seating.
Two nudges that keep the numbers honest
- Overdue arrivals. A confirmed booking whose time passed more than 20 minutes ago without anyone marking the guest as arrived is flagged Overdue. The timeline has a "now" line; the list did not, so a 19:00 booking still untouched at 19:25 looked exactly like one at 22:00.
- "Did they turn up?" Confirmed bookings from days already over that were never closed out are collected in the approval strip, with Arrived and No-show next to them. Nothing is decided for you: marking them automatically would count absent guests as present, and the no-show rate in Analytics would measure button-pressing rather than reality.
Which emails go out
Every message is sent by your own site — there is no external service in between.
| When | Who gets it | What is in it |
|---|---|---|
| A guest submits a request | The guest | "Request received", with your phone number so they can call if they hear nothing back. |
| A guest submits a request | You | The booking, how full that slot already is, and Confirm / Decline buttons that work without logging in. |
| You approve | The guest | Confirmation with a calendar file (.ics) and a one-click cancellation link. |
| You decline | The guest | A short note that the booking could not be taken, with your phone number. |
| You edit a booking and tick the box | The guest | The new details under their own subject line, with a fresh .ics. The old cancellation link keeps working. |
| The booking is cancelled | The guest | Confirmation that it is cancelled. |
| The guest cancels via their link | You | A heads-up, so a table freeing up does not go unnoticed. Cancelling from the list yourself does not email you — you already know. |
Your copy goes to the notification address in Settings → Contact & privacy; with several branches, a location's own address wins, and the site admin address is the fallback. Adding a booking yourself is the one case you control per booking: the confirmation is only sent if you leave the box ticked and gave an address.
requested → confirmed | rejected → (cancelled | arrived | no_show). The guest is emailed on every operator decision.Room & Seating Pro
Draw your room once, then seat guests on it during service. The two are separate on purpose: you build the room on Reservations → Set up room, and you run service on Reservations → Service.
Set up the room
Add tables
Round, rectangular, square or bar-seat shapes. A table's size follows its seat count.
Arrange the room
Drag to move, rotate a table or resize a zone with the handle. Group tables into named zones (Indoor, Terrace, Bar). Then Save floor plan.
Check the seats against your capacity
The same screen lists every table with its seat count and compares the total to the capacity in Settings — an easy way to catch a room that no longer matches what you accept online.
Three views of the same day
On Service, the day and location stay fixed while you switch view:
- List — the scannable day, one line per booking.
- Timeline — one lane per table across the service, from opening to closing (past midnight included), with a "now" marker. Good for spotting a gap you could still sell. A booking whose table has since been removed from the plan shows up under Unassigned rather than disappearing.
- Room — the live plan. Scrub the time slider (it starts at the current time) and tables colour live: green free, amber reserved, red seated. Chairs are drawn around each table, one per seat.
Seat guests — two ways
- Guest first. Each confirmed booking has a Seat button. A dialog suggests the best-fit free table, already selected, so it is usually one click. Tables that are too small or already taken are shown but cannot be picked; the time comes from the booking.
- Table first. In the Room view, unseated guests wait in a "to seat" queue: pick one and click a highlighted table, or drag them onto it. Click a seated table to see who is there or to free it.
How long a table stays blocked follows the booking's own turn time, so a large party holds its table longer than a two-top if you staggered it in Settings.
Walk-ins
Seat someone who just walked in — no prior booking:
- + Walk-in in the context bar — enter party size (name optional), pick a free table, done.
- Or, in the Room view, click a free table and seat the walk-in right there.
Walk-ins carry a Walk-in label and count towards capacity like any seated guest.
Analytics Pro
Reservations → Analytics summarises the last 7, 30 or 90 days. With several locations you can look at one branch or at all of them together.
- KPIs — covers (guests), confirmed bookings, no-show rate, average party size.
- Covers over time — guests per day across the range.
- Busiest times — covers by hour of day, so you can staff the peaks.
- Status breakdown — the split across requested / confirmed / arrived / no-show / cancelled / rejected.
Page Builders
Flavor integrates natively with Gutenberg, Elementor and WPBakery. All page builders use the same renderer — the output is always identical.
In every builder, Flavor's elements are grouped under a dedicated Flavor Restaurant category. You'll find the Menu Card element there — plus the Reservation Form element if you use table reservations.
Gutenberg Block
Open the block inserter and look under the Flavor Restaurant category to add the menu block. It provides dropdowns for all shortcode options — no shortcode knowledge needed.
- Layout, Theme, Columns, Image Ratio — all configurable in the sidebar panel
- Category and Location dropdowns are populated from your existing data
- Preview renders server-side in the editor
Elementor Widget
In the Elementor editor, open the Flavor Restaurant category in the widget panel — or search for "Menu Card" — and drag it onto the canvas.
- All options available in the Elementor Content tab
- Live preview in the Elementor canvas
- Works with Elementor Free and Elementor Pro
WPBakery
In the WPBakery editor, click Add Element and open the Flavor Restaurant category — or search for "Menu Card".
- All shortcode parameters available as form fields
- Works in both Classic and Grid modes
FAQ
Do I need a page builder?
No. Flavor works with the standard WordPress shortcode [flavor_menu] — paste it into any page or post. Page builder integrations (Gutenberg, Elementor, WPBakery) are available but not required.
Will my data be lost when I update the plugin?
No. All dishes, categories, images and settings are stored in the WordPress database. Plugin updates only replace code files — your content remains untouched.
Does it work with my theme?
Yes. Flavor uses fully encapsulated CSS scoped to its own wrapper class .flavor-menu. It does not interfere with your theme's styles.
Can I show different menus for different locations?
Yes. Create locations under Locations, assign dishes to them, then use the location="slug" shortcode parameter on each page. See the Locations section for full details.
How do I control which dish appears first?
Set the Sort Order field on each dish. Dishes are sorted ascending — a dish with Sort Order 1 appears before one with 10. In the Featured layout, the dish with the lowest sort order becomes the hero.
Can I use multiple menus on one page?
Yes. Place multiple [flavor_menu] shortcodes on a single page — each with different category, layout or location parameters. Each instance is fully independent.
Is the menu responsive?
Yes. All 7 layouts are fully responsive and tested on mobile, tablet and desktop. The column count is automatically reduced on small screens.
How do I translate the plugin?
Flavor uses the WordPress standard translation system (Text Domain: flavor-restaurant-menu). Use a plugin like Loco Translate or WPML to translate admin strings and frontend labels.
The menu doesn't show — what should I check?
- Is the plugin activated? Go to Plugins and verify.
- Have you added at least one dish and assigned it to a category?
- Is the shortcode
[flavor_menu]on the page (not just in a widget)? - Check the
limitparameter — the default is150, up to a maximum of999. Increase it if you have more dishes than that.