WordPress & web · homes.parcelCI passing

Parcel: Real Estate WordPress Theme

A fast, accessible block theme for estate agents, with a listings plugin whose search stays quick at 30,000 properties.

View the code Evaluation report Demo tour Run it ›_ last push 1 day ago

4.7 ms vs 704 msmedian property search at 30,000 listings: the index vs meta_query (150x faster)

0 of 450searches where the two returned different listings or order

0axe-core WCAG 2.1 AA violations on 6 page types at desktop and phone widths

Parcel's home page: a property search, the newest listings, neighbourhoods and a call to book a viewing
Parcel's home page: a property search, the newest listings, neighbourhoods and a call to book a viewing. Screenshot from the project's demo (synthetic data).

demo Demo tour

Screenshots from the running application, with its synthetic demo data. Select one to enlarge.

The home page: the property search, the newest listings and neighbourhoods.
The home page: the property search, the newest listings and neighbourhoods.
Search results: three or more bedrooms for sale, cheapest first, each card with price, rooms, area and town.
Search results: three or more bedrooms for sale, cheapest first, each card with price, rooms, area and town.
A property page: photo, key facts as tiles, the description and a call to book a viewing.
A property page: photo, key facts as tiles, the description and a call to book a viewing.
Evaluation: search times both ways at three catalogue sizes, contrast and axe-core results.
Evaluation: search times both ways at three catalogue sizes, contrast and axe-core results.

01 The problem

Real estate themes search listings with meta_query: one join on wp_postmeta per filter and sorting on cast strings. It is fine in a demo and takes over a second per search at tens of thousands of listings, on the busiest page of the site; themes that register their own listing types also lose every listing when the site changes theme.

02 How it works

  1. Listing saved
  2. Typed index row
  3. Search form (GET)
  4. Indexed query
  5. Cards and pages
  6. Structured data

03 What I built

  • Parcel, a block theme (theme.json, templates for home, the properties archive and a property page, four patterns, about 30 lines of CSS, no theme JavaScript or web fonts) with every text colour pair at WCAG AA.
  • Parcel Listings, a plugin with the property type and facts as registered meta, a typed index table kept in step with every edit (save, fact change, type change, unpublish, trash) and rebuilt by WP-CLI, and a no-JavaScript search with shareable URLs.
  • Dynamic blocks for the search, newest listings and facts (previewed with ServerSideRender, no build step) and schema.org RealEstateListing data on every property page.

04 What I learned

Shortcodes inside patterns never rendered: WordPress expands shortcodes in a block template before the patterns inside it, so the search became a dynamic block.

axe-core flagged every page because the Navigation block's no-menu fallback nests a ul directly in a ul; the theme now ships default links.

05 Known limitations

Every repository documents what it doesn't do yet. The main ones:

  • No map or radius search yet (coordinates are indexed); one property type per listing in the index.
  • A full rebuild takes about 90 seconds for 30,000 listings; SQL edits that bypass WordPress need a reindex.

06 Stack

PHP 8.1WordPressBlock themetheme.jsonMariaDBschema.orgaxe-coreDocker

The repository has the design document, operations runbook, full evaluation report and known limitations. All data is synthetic, generated by code in the repository.

run Run it yourself

Every project runs on a laptop: no cloud account and no paid API needed.

git clone https://github.com/codeROCK-IZZY/real-estate-wordpress-theme.git
cd real-estate-wordpress-theme
docker compose up -d && bash tests/integration/run.sh
php eval/run.php --gate               # writes eval/reports/report.html

↑↓ to move · Enter to open · Esc to close