JoinFava Resturant icon
Full Stack2026

JoinFava Resturant

Fava is a full-stack restaurant membership platform built on WordPress — two custom plugins engineered from scratch that power both sides of the marketplace: a SaaS-style restaurant owner dashboard for managing profiles, offers, reviews, and analytics, and a member-facing application for discovering exclusive dining deals, claiming offers, and managing a personalized restaurant favourites list.

CategoryFull Stack
Year2026
Stack1 technology
Screens13 screenshots
Highlights10 noted

Preview

13 screenshots

Click any screenshot to open the viewer — scroll the strip for more.

About this project

Fava is a members-only restaurant offer platform that connects diners with exclusive deals from local restaurants. The entire product was engineered as two tightly integrated custom WordPress plugins built from scratch, layered on top of Directorist (a directory plugin) while completely overriding its templates and extending its data model with a proprietary offer system, role management, and member state machine.

The Restaurant Dashboard (fava-restaurant-dashboard) gives verified restaurant owners a full SaaS-style control panel accessible through a custom-routed WordPress frontend — no wp-admin required. Owners can manage their public listing profile (photos, hours, location, amenities, FAQs), create and publish exclusive member offers with a live preview that mirrors exactly what members see, manage an offer lifecycle (active/expired/scheduled), view customer reviews with the ability to respond, and track offer performance metrics. The dashboard is built with a custom PHP shell that outputs a complete standalone HTML document with a sticky sidebar, mobile drawer navigation, and responsive bottom tab bar — bypassing the WordPress theme entirely while still firing wp_head/wp_footer for script compatibility.

The Member Application (fava-member) delivers the consumer-facing experience. Members browse a personalized offer feed scored by proximity, preferences, favourited restaurants, and offer popularity. They can claim offers with an instant UI state update, track claimed and redeemed offers in a dedicated My Offers section organized by tabs and sorted by urgency, manage a Favourite Restaurants list, and explore rich restaurant profile pages. The member plugin completely overrides both the Directorist default template and the restaurant dashboard plugin's own listing template using WordPress's template_redirect action at priority 1 — the only mechanism that reliably fires before any competing plugin can claim the request.

Both plugins share a unified data model: the offer Custom Post Type (CPT) defined in the restaurant plugin is consumed by the member plugin's feed engine, which uses WP_Query with tax_query for category filtering, Haversine distance calculations for proximity scoring, and manual search across offer titles, restaurant names, and cities simultaneously. Member offer state (saved/active/redeemed/expired with timestamps) is stored as JSON in user meta and persisted across sessions.

The project spanned multiple development phases — initial plugin architecture, UI builds against approved design mockups, deep debugging of multi-plugin template override conflicts, AJAX cache-related category filter failures, geolocation integration, mobile responsive design, hours format normalization, and a platform integrity audit to ensure no member-facing UI links leave the Fava ecosystem.

Highlights

What mattered most
Two-sided marketplace architecture
Separate plugins for restaurant owners and members, sharing a single offer CPT and Directorist listing data model, with no cross-plugin code dependencies beyond WordPress hooks and shared meta keys.
Custom SaaS restaurant dashboard
Full frontend application bypassing WordPress themes entirely: sticky sidebar navigation, mobile drawer and bottom tab bar, AJAX-powered profile saving, multi-image gallery management, offer lifecycle management with live card preview, reviews dashboard, and FAQ builder — all within a custom HTML shell that still integrates with WordPress's script/style pipeline.
Directorist deep integration
Full read/write integration with the at_biz_dir CPT including meta fields (_address, _city, _phone, _manual_lat/_lng, _bussiness_hours, _listing_img, _directorist_listing_rating), taxonomy (at_biz_dir-category), gallery management, and review system — reverse-engineered from source code and live debug output since Directorist's internal APIs are undocumented.
Offer CPT with state machine
Proprietary fava_offer CPT with types (percentage, flat, BOGO, free item, happy hour, combo), discount values, validity dates, promo codes, cover photos, and save/view counts. Member-side state machine (saved → active → redeemed → expired) stored as timestamped JSON in user meta, persisted across sessions.
Intelligent feed engine
Multi-factor scoring: favourited restaurant boost (+100), preference category match (+50), proximity bands (+40/20/10), expiry urgency (+20), popularity cap (+30). Category filtering via WP_Query tax_query pre-resolving listing IDs before the offer loop — replacing a naive get_the_terms() loop that silently returned empty results in AJAX request contexts due to cold term cache.
Template override system
template_redirect at priority 1 with exit() to serve the member restaurant profile page before Directorist (priority 10) and the restaurant dashboard plugin (priority 999) can intercept the request. The only mechanism that works reliably across all competing plugins.
AJAX-first member UI
Claim, save, favourite, filter, search, and sort all operate without page reloads. Optimistic UI updates on favouriting with automatic revert on failure. Geolocation via window._fmUseGeo flag gating so GPS coordinates only influence results when explicitly requested — preventing stale sessionStorage values from silently filtering all AJAX responses.
Role-based access control
Custom fava_member and restaurant_owner WordPress roles with capability sets. Login redirects by role: restaurant owners → /business-dashboard, members needing onboarding → /fava-preferences, returning members → home feed. All dashboard AJAX endpoints verify nonce → authenticated → correct role → listing ownership in that order.
Live offer preview
Create Offer page renders a pixel-perfect preview card that updates in real time as the owner types — matching exactly what members see on the discovery feed, including offer type badge, cover image, discount text, and promo code pill — built with JS event listeners that mirror the member-facing renderCard() function output.
Responsive design system
Mobile-first layouts across all member pages. Restaurant profile page adapts from a 3-column desktop layout (main content + 280px sidebar + action bar) to a stacked mobile view with Hours/Location in a preserved 2-column grid down to 420px, a mobile contact strip surfaced in place of the hidden sidebar, and hero compression — all via attribute selector CSS to avoid adding class dependencies to dynamically included PHP templates.

Built with

1 technology
PHP - WORDPRESS

Ready to start your project?

Tell me what you're building and I'll get back to you the same day with next steps.