Install
This is the repository archive. It installs, but the folder name will carry the branch suffix and updates will not flow.
Install straight from GitHub with WP-CLI:
wp plugin install https://github.com/efraimray/presyo-menu-board/archive/refs/heads/main.zipA free WordPress plugin that turns a carinderia, café or bakery menu into a searchable, mobile-friendly price list, with peso prices, sizes and one-click "Sold out" tags.
Live demo: https://efraimray.github.io/presyo-menu-board/demo/
Screenshot: add
docs/screenshot.png(a capture of the demo) and reference it here.
New here? Read docs/BUILD-LOG.md for the languages used and how this was built.
Features
- Menu Items + Sections: a private custom post type with title, description, featured image and drag order, grouped by a Sections taxonomy.
- Prices that read right: ₱85, ₱92.50, ₱1,250; promo prices with the old price struck through; sizes such as
Solo | 85andGood for 3 | 240. - Today's Menu screen: every dish on one page with Available / Sold out / Hidden, plus "Mark everything available".
- Block and shortcode: the dynamic Presyo Menu Board block or
[presyo_menu], list or card layout, 1–3 columns. - Filter and search in the browser, no reload; the full menu still shows without JavaScript.
- schema.org Menu JSON-LD (
Menu→MenuSection→MenuItem→Offer), sold-out dishes markedOutOfStock. - Light: ~1.0 KB JS + ~1.6 KB CSS gzipped, loaded only where a menu appears. No jQuery, no CDN, no build step.
- Print styles, uninstall cleanup, translation template (79 strings).
Tech Stack
| Layer | Technology |
|---|---|
| Server | PHP 7.4+ on WordPress 6.3+ (post types, taxonomies, post meta, Settings API, admin-post, Block API v3) |
| Editor | Vanilla JS against wp.blocks, wp.element, wp.components, wp.serverSideRender (no JSX, no bundler) |
| Front end | Vanilla JS (filter/search), plain CSS with custom properties |
| SEO | schema.org Menu JSON-LD |
Folder Structure
presyo-menu-board/
├── presyo-menu-board.php # Plugin header, constants, boot, activation
├── uninstall.php # Removes options when the plugin is deleted
├── includes/
│ ├── class-presyo-format.php # Pure helpers: prices, sizes, schema (no WP calls)
│ ├── class-presyo-post-types.php # CPT, taxonomy, meta box, admin columns
│ ├── class-presyo-settings.php # Settings API page
│ ├── class-presyo-daily.php # Today's Menu screen + form handler
│ └── class-presyo-render.php # Shortcode, block render, assets, JSON-LD
├── blocks/menu-board/
│ ├── block.json
│ └── editor.js
├── assets/css/presyo-menu.css
├── assets/js/presyo-menu.js
├── languages/presyo-menu-board.pot
├── tests/ # php tests/run-tests.php, php tests/render-smoke.php
├── demo/index.html # Interactive preview (GitHub Pages)
├── docs/ # BUILD-LOG, TUTORIAL, DEPLOYMENT
├── readme.txt # WordPress.org format
├── CHANGELOG.md
├── publish-to-github.bat/.ps1 # One double-click GitHub publish (Windows)
└── LICENSE # GPL-2.0
Quick Start / Installation
- Download
presyo-menu-board.zipfrom Releases. - wp-admin → Plugins → Add New → Upload Plugin → choose the zip → Install Now → Activate.
- Presyo Menu → Sections: add
Ulam,Kakanin,Drinks(or your own). - Presyo Menu → Add New: add dishes with prices.
- Add the Presyo Menu Board block to a page (or paste
[presyo_menu]).
From source: git clone https://github.com/EfraimRay/presyo-menu-board.git into wp-content/plugins/.
Usage
[presyo_menu]
[presyo_menu sections="drinks,kakanin" layout="cards" columns="3"]
[presyo_menu filter="no" search="no" updated="no" heading="h2"]
| Attribute | Values | Default |
|---|---|---|
sections |
comma-separated section slugs (order is kept) | all |
layout |
list, cards |
Settings |
columns |
1–3 |
Settings |
filter, search, updated |
yes, no |
Settings |
heading |
h2, h3, h4 |
h3 |
Daily routine: Presyo Menu → Today's Menu, tap Sold out on what ran out, Save.
Configuration
Presyo Menu → Settings: menu name (used in schema), currency symbol and ISO code, centavos (auto / never / always), default layout, columns, accent colour, show sold-out items, filter buttons, search box, "Updated" time, JSON-LD on/off.
Developers can change the schema:
add_filter( 'presyo_menu_schema', function ( $data ) {
$data['inLanguage'] = 'fil';
return $data;
} );
Deployment
On Windows, double-click publish-to-github.bat to create the GitHub repo, release and Pages site in one go. See docs/DEPLOYMENT.md for everything else: local testing with LocalWP or wp-env, building the zip, publishing with GitHub Desktop or git, GitHub Pages for the demo, and tagging releases.
Customization
- Colours: set the accent in Settings, or override
--presyo-accentin your theme CSS. - Markup classes are prefixed
presyo-(for example.presyo-item.is-sold-out). - Add a badge: extend
Presyo_Format::BADGESandPresyo_Post_Types::labels(), then style.presyo-badge--yourbadge.
Roadmap
- v1.1: "Ulam of the day" scheduling (show dishes only on chosen weekdays) and a REST endpoint for chatbots.
- v1.2: QR code generator for table tents that links to the menu page.
- v1.3: Optional "Order on Messenger" button per item with a prefilled message.
Contributing
Issues and pull requests are welcome. Please run php -l on changed PHP files, php tests/run-tests.php and php tests/render-smoke.php before opening a PR, and follow the WordPress Coding Standards.
Requesting improvements
Open an issue and add the label claude-improve. The nightly showcase run picks up open claude-improve issues, implements them, bumps the version and publishes a release.
License
GPL-2.0-or-later. See LICENSE.
Author
Efraim Ray — web developer and AI automation specialist in Valencia City, Bukidnon, Philippines — https://www.efraimray.com/