
Harvest Sun combines a company profile, a blog, and a full product catalog into a single website, browsable the way an online store would be, with search, category filters, sorting, and a related-products section, minus the checkout. Ordering happens directly over WhatsApp instead. It's built flexible enough to fit almost any retail business, from groceries and clothing to food, electronics, furniture, and home goods, so a new business can launch on the same proven foundation instead of starting from scratch. The products shown on the demo are placeholders, but every feature and flow behind them is already complete, so swapping in real products is all it takes to go live.
A scrollable look at the finished site, exactly as a visitor would browse it.
Desktop
Mobile
The tools and technologies that came together to bring this project to life.










Each project draws on a mix of disciplines: here's how they came together on this one.
A closer look at what the finished product offers, the obstacles along the way, and what came out of it.
A Filter Selection That Silently Returned Nothing
WooCommerce's category archive page doesn't add its own category to the query's filter conditions at the point custom code can hook in, so a custom category filter ended up stacking a second, unrelated condition on top instead of replacing it. Picking any category from the sidebar while already on a category page returned an empty grid with no error to explain why, fixed by explicitly clearing the archive's own condition before the custom filter runs.
A Refactor That Silently Deleted a Section's Spacing
A shared PHP helper that wraps every section with consistent vertical spacing was moved into a new folder during a cleanup, but the build tool that scans for Tailwind classes wasn't told to look there, since it reads files as text rather than running PHP. Its classes dropped out of the compiled CSS with no error anywhere, and the spacing between every section on every page quietly collapsed until it was caught.
A Single Plugin Away From Taking the Whole Site Down
All six pages read their content through one plugin's field function, called directly across dozens of places with no fallback. If that plugin were ever deactivated or failed to load, every page would fail with a fatal error at once instead of degrading, closed by wrapping every call behind a compatibility layer and verifying the site stayed up with the plugin disabled live.
How this project changed things for the business and its users after launch.
Filtering always returns the right products
Zero single point of failure across all 6 pages
Images under 200KB
Full rebrand without touching CSS
One shared source for section spacing sitewide
Before
Picking a second category from the sidebar filter while already viewing a category archive returned zero products, with no error to explain why.
After
The archive's own category condition is explicitly cleared before the custom filter runs, so filtering always reflects what the shopper actually picked.
Before
All six pages read their content through one plugin's field function with no fallback, so a disabled or failing plugin would fatal-error the entire site at once.
After
A compatibility shim wraps every call and returns safely when the plugin is unavailable, verified by disabling it live with the site staying fully up.
Before
Uncompressed images would have made every page, especially the image-heavy product catalog, slow to load.
After
Every image is compressed to WebP and mostly under 200KB before upload.
Before
Standing up a new catalog site for a different brand would mean rewriting hardcoded colors and styles throughout the CSS.
After
Brand colors, hover states, and spacing are centralized in the WordPress Customizer, so a new brand is a configuration change, not a rebuild.
Before
Vertical rhythm between sections could silently drift if the build tool ever lost track of the helper function defining it, as it briefly did during a refactor.
After
The gotcha is documented and guarded against, and every page's section spacing stays consistent by construction from one shared helper.