Content types and fields
Seven kinds of record, all of them owned by the companion plugin. They are data the theme renders, not pages to crawl: none of them has a public archive or a single-post URL, and none of them is indexed by a search engine on its own.
Every field is exposed over the REST API with a schema, a sanitiser and a capability check, which is what makes the agent abilities and a multilingual plugin both work.
Dishes — tat_menu_item
The rows of the card. The demo has 52, twelve of them photographed.
| Field | Type | Required | Notes |
|---|---|---|---|
| Title | text | yes | The dish's name, as the card prints it. |
| Excerpt | text | no | The line under the name. Leave it empty when a slip supplies it daily. |
| Featured image | media | no | The 96px plate on the row. 40 of the demo's 52 dishes have none, on purpose. |
| Price | int, cents (stored and over REST); the Dish details panel takes the site's currency, 14 or 4.25 |
yes | 1400 prints as $14; 425 as $4.25. |
| Dietary | V VG GF DF N |
no | Letters, never icons. N means contains nuts — an allergen, never a diet, never a filter button. |
| Dayparts | list of service slugs | yes | Which services this dish is served at. |
| Sections | taxonomy term | yes | The division it prints under. |
| Add-ons | list of {label, price} |
no | What can be added, and for how much. |
| Focal point | {x, y} 0–1 |
no | The point the 96px crop keeps. |
| Name language | BCP 47 tag | no | Defaults from the site fact. See Translation. |
| Availability | on / off |
no | off takes the dish off every card without deleting it. |
| Order | int | no | Where it falls inside its section. |
The admin list can be filtered by service and by section, and carries price, marks and services as columns.
Sections — tat_menu_section
The divisions the card is printed in: Tartines, Salades, Desserts. A taxonomy, so a dish can be in more than one.
| Field | Notes |
|---|---|
| Name | The heading on the card. |
| Order | Where the division falls. |
| Note | An optional line under the heading. |
| Kind | food or drinks. A drinks section is left out of the service bands and printed once at the end of the card — nine drinks served at five services is nine rows, not forty-five. |
Services — tat_daypart
The times of day the kitchen serves. The demo has five: Petit-déjeuner, Brunch, Midi, Goûter, Souper.
| Field | Required | Notes |
|---|---|---|
| Label | yes | The name used in the site chrome: Lunch. |
| Card label | yes | The name as printed on the card: Le midi. |
| Days | yes | Which weekdays it runs, Monday to Sunday. |
| Start / End | yes | HH:MM, 24-hour. |
| Last order | no | HH:MM, printed on the card's foot. |
| Bookable | yes | Whether this service takes a table. |
| Laptops | no | Whether laptops are welcome during it. |
| Position | yes | Where the service falls in the day. |
| Featured image + focal point | no | The counter plate for this service's band and for the hero. |
Everything derived on the site is read from this record and never typed: the open status, the hero's clause, the "served now" stamp, the laptop rule, which services show a booking action.
Hours rows — tat_hours_row
| Field | Required | Notes |
|---|---|---|
| Row key | yes | mon … sun, terrace, or a key of your own — a kitchen, a bakery counter. These are the keys an Hours slip may name. |
| Value | no | What the row says. Empty means closed. |
| Order | yes | Where it sits in the record. |
The seven weekday rows are created once, with your site's own weekday names, when the plugin is first activated. Delete one and nothing puts it back: you decided something.
A value is parsed by finding the times, not by matching a separator, so 08:00 – 17:00, a plain
hyphen, a non-breaking space and 07:30 – 11:00, 11:30 – 17:00 all read the same. A value that is
not a pair of times — a sentence, a season — makes the header say "See our hours" rather than
guess.
Slips — tat_slip
Covered in full on Slips. Fields: Kind, Clipped to, Dish it replaces, Row it strikes, Showing from, Until, Lines — plus the author and post date, which are WordPress's own and print as "Posted 07:52 by Élise".
Booking rows — tat_booking_row
One row per service that takes a table.
| Field | Required | Notes |
|---|---|---|
| Service | yes | A bookable service's slug. These are the keys a Booking slip may name. |
| Value | yes | The policy sentence — "Book online, up to 6". |
| Order | no | Where the row sits on the card. |
A service that takes no bookings is refused, and the refusal names the ones that do. With the menu part of the plugin switched off nothing can check it, so any slug is accepted and the notice says the check could not run.
Site facts — Settings › Site details
One record, edited on one screen, holding everything about the business that is not a list.

| Group | Fields |
|---|---|
| Address | Street, City, Region, Postal code, Country |
| Coordinates | Latitude, Longitude — what the directions link and the geo: handoff use |
| Contact | Phone, Email |
| The room | Seats; Terrace seats, season start, season end |
| Arrival | Bus, metro, parking, bikes, door, washroom, room, terrace — eight sentences, each a measurement somebody took |
| Transit and access | The one-clause summary each |
| Currency | Symbol, which side it goes, the decimal separator |
| Tax and service note | The line under every price |
| Language of product names | Default BCP 47 tag for dish names — fr in the demo |
| Coffee | Espresso and filter: roaster, origin, process, on since; and the square plate |
| Bakes | Per bake: the item, its batch times, when it is usually gone |
| House rules | Dogs, laptops note, terrace, children, allergens |
| Hiring | Open, role, where to write |
| Elsewhere | Instagram handle — a plain link, no feed, no script |
| Privacy | The responsible person, their role, an address, the retention window in months, the date it was reviewed |
| Booking | Mode, provider, URL, party max, group min, group email, hold minutes, vouchers, keep a copy of enquiries |
| Order | Mode, URL, partner, the collection sentence, the direct sentence |
| Clock | live, or fixture for a demo install that has to photograph the same way twice. Set it back to live before you launch. |
The screen is generated from the record's own schema, so a group of fields arrives as a named section with no admin code behind it — and there is exactly one place to edit any given fact.