Skip to main content
Back to Portfolio

Salt & Cedar

Boutique brokerage demo with a custom listing CPT, custom-meta, and a shared server-rendered Gutenberg grid block reusable across any future catalog demo.

WordPressPHP 8.3ReactGutenbergFull-Site Editingtheme.jsonCustom Post TypesApacheAWS EC2
Salt & Cedar preview

Overview

A boutique residential brokerage demo built on WordPress's CPT + custom-meta + faceted catalog pattern. Custom listing CPT lives in a demo-local mu-plugin, a home_style taxonomy with six seeded terms, nine show_in_rest meta fields, and a shared Gutenberg block (sfp-blocks/listing-grid) — server-rendered with configurable post type so a future vehicle / rentals / equipment demo reuses the block with zero changes.

Architectural split worth naming:

  • The CPT lives in the demo, not the platform. Real estate has prices and beds; vehicles have mileage and drivetrains — coupling the platform to "what kind of catalog is this" would be the wrong abstraction
  • The block is the generic primitive (query any post type, render cards); the CPT is the domain model
  • A future vehicle-listings demo registers its own vehicle CPT with its own meta, points the listing-grid block at it, and works

CPT details — saltcedar-listing-cpt.php (demo-local mu-plugin):

  • CPT listing with has_archive: 'listings', single permalinks at /listings/{slug}/
  • Taxonomy home_style with 6 seeded terms (mid-century, craftsman, contemporary, cottage, farmhouse, classic)
  • Nine meta fields registered with register_post_meta(..., show_in_rest: true): price, beds, baths, sqft, lot_sqft, year_built, neighborhood, address, mls_id
  • Sanitize callbacks wrapped in single-arg closures (PHP 8 arity-safe)

FSE templates:

  • archive-listing.html — renders /listings/. Hero strip with eyebrow + intro paragraph; listing-grid block below set to query all listings sorted by menu_order. Three-column grid.
  • single-listing.html — renders /listings/{slug}/. core/post-featured-image (16:9), core/post-terms for home_style, core/post-title in Fraunces, core/post-content (which contains an inline facts panel + narrative authored in the seed)

Six fictional PNW listings: Bayview Mid-Century, Madrona Bluff Craftsman, Westcott Bay Cottage, Queen Anne Contemporary, Vashon Forest Cabin, Eastsound Farmhouse — each with structured facts and 200-word narrative.

The Challenge

Real estate brokerages skip WordPress on reflex — "MLS plugins are awful," "faceted search needs a SaaS," "we'll lose six months to plugin compatibility nightmares" — and end up on the bundled MLS site or a $200/month hosted real-estate CMS that ages badly. That narrative confuses boutique brokerages with twelve curated listings for MLS aggregators serving twenty thousand auto-feed listings.

The Solution

For boutique catalog sites — which is most real-estate work agencies actually get asked to build — WordPress's CPT + custom meta + taxonomy + block editor pipeline is more than sufficient. Architecturally clean split: shared generic block in the platform plugin, demo-local CPT in a per-demo mu-plugin. The block stays generic; the domain model lives where it belongs.

Results

  • Lighthouse 99 / 96 / 100 / 92 with placeholder photography

  • Shared sfp-blocks/listing-grid block reusable across any future CPT-driven catalog demo

  • Nine custom meta fields exposed via REST through register_post_meta(..., show_in_rest: true)

  • PHP 8 arity-safe sanitize callbacks wrapped in single-arg closures

  • number_format_i18n for price rendering — correct thousands separators independent of system locale

  • Two custom FSE templates: archive-listing.html + single-listing.html

Gallery

Salt & Cedar screenshot 2
Salt & Cedar screenshot 3
Salt & Cedar screenshot 4

Interested in working together?

Let's discuss how I can help with your project

Get in Touch