-
Notifications
You must be signed in to change notification settings - Fork 0
Changelog
All notable changes to Hooked on Facets are documented in this file.
The format is based on Keep a Changelog, and the project follows Semantic Versioning. As of 1.0.0 the public API and index schema are stable; breaking changes bump the major version. Each version links to its full GitHub release notes.
-
Pretty faceted URLs (opt-in) — filtered WooCommerce views get clean,
crawlable paths:
/shop/?hof[brand]=nikebecomes/shop/filter/brand/nike/on the shop and product category/tag/attribute archives. Includes canonical URLs in a deterministic order, 301 redirects from legacy query-string and non-canonical URLs, hard 404s for unresolvable filter paths, crawlable<a>links in the checkbox, radio, dropdown, hierarchy, and swatch displays, and a client-side encoder — byte-for-byte matched to the server's canonical encoding — so AJAX filtering pushes the same pretty URLs. Configure on the SEO screen; requires non-plain permalinks. New filters:hof_pretty_urls_bases,hof_pretty_urls_max_values,hof_slugmap_cache_ttl.
1.1.0 - 2026-07-21
-
Free/Pro split. The six signature facets — Ask (AI natural language),
Visual DNA, swipe deck, spin-the-wheel, intersection matrix, and the saved
comparison bin — moved to the separate Hooked on Facets Pro add-on, together
with the AI settings screen, the
/askand/visual-dnaREST endpoints, and the entire licensing/self-update stack. The free core now ships ten facet types at full resolver speed, contacts no external service, and contains no license code — it is the WordPress.org artifact as-is. Extension seams for add-ons:hof_available_displays,hof_facet_renderers,hof_pro_active, and thehof_bootedcontainer hook. Stored Pro facet configs are preserved (and simply don't render) while the add-on is inactive. -
Tested up to: 7.0after a smoke test on WordPress 7.0.2. - Documented MariaDB 10.3+ support alongside MySQL 8.0.31+ (both provide
INTERSECT; the plugin feature-uses it without version-sniffing).
- The public
/visual-dnaendpoint is now rate-limited (30 requests/min per IP), completing the hardening that capped its palette at 8 colors — the cap bounded per-request DB cost but not request rate.
- The REST rate limiter is now a true fixed window: the reset time is anchored
at the window's first hit and the transient TTL is set to the remaining
window on each increment. Previously every under-limit hit reset the TTL to
the full window, so steady below-limit traffic (e.g. one
/askrequest every 50 seconds) never let the window expire, accumulated to the cap, and was blocked despite being far under the allowed rate. - Elements toggled with the HTML
hiddenattribute (Visual DNA result row and palette, eyedropper button, swiper done-card) could stay visible because authordisplayrules beat the browser's[hidden] { display: none }default. The public stylesheet now ships a scoped, cascade-final guard with a regression test that models the cascade from the parsed stylesheet. (#38, also shipped in 1.0.1)
1.0.1 - 2026-07-21
Hotfix release cut from v1.0.0 (branch hotfix/1.0.1), deployed to
hookedonfacets.com ahead of the 1.1.0 split.
- The
[hidden]-attribute CSS guard described under 1.1.0. (#38) - The Visual DNA color map read the legacy
swatch_colorterm-meta key, so palettes saved through the swatch fields UI never matched. (#35)
1.0.0 - 2026-06-04
First stable release. Promotes the feature-complete 0.13.x line to general availability with a committed public API and index schema. No functional changes from 0.13.1-alpha.
0.13.1-alpha - 2026-05-29
-
Counts query optimization — the drill-down counts now
GROUP BY facet_valuealone (picking the display viaMIN(facet_display)) instead of(facet_value, facet_display). The value→display mapping is 1:1 so results are identical, but dropping the second 191-char column from the GROUP BY shrinks the aggregation temp table:resolve()p95 dropped from ~465ms to ~63ms (7.5×) on 100k products, uncached.
0.13.0-alpha - 2026-05-29
First round of post-feature-complete enhancements — SEO, analytics, and resolver caching.
-
SEO for filtered pages (
src/Seo/SeoManager.php) —rel=canonicalto the filter-stripped URL,noindex,followonce a configurable number of facets are stacked (default 2), and an active-filters title suffix. Defers canonical to an active general SEO plugin (Yoast / Rank Math / AIOSEO / SEOPress). New admin SEO screen andGET|POST /seo-settings. -
Analytics dashboard — the Telemetry recorder now captures per-facet/value
usage and zero-result filter combinations;
snapshot()adds p50/p95/p99 resolver latency. The admin Dashboard renders most-used facets, "filters that find nothing," latency percentiles, and a dead-facets callout.
-
Resolver result-set cache —
resolve()andresolve_ids()cache their output in the object cache, keyed by(index version, filter state). The Indexer bumpshof_index_versionon every write for O(1) invalidation. Benchmarking showed the IDs+counts/filterpath was ~465ms on 100k products; cached repeat hits are sub-millisecond. Kill switch:hof_resolver_cache_enabled.
0.12.0-alpha - 2026-05-29
Feature-complete milestone — the full "wow kit" plus the AND-within-facet resolver.
-
Spin-the-wheel facet (
spin_the_wheel) — a gamified single-select picker: a cosmetic conic-gradient dial over a real, accessible radiogroup that degrades to a plain single-select with JS off. -
Saved-bin facet (
saved_bin) — a drag-and-drop / click comparison bin. Items are pinned to a per-sitelocalStoragebin (via the new[hof_bin_button]shortcode or anydata-hof-bin-addelement) and filtered to with a "show only saved" toggle, backed by the reserved_bin_idsresolver key. -
Intersection matrix facet (
matrix) — the Venn/UpSet matrix returns on real AND-within-facet semantics, paired with an explicit selected-state dot, per-row count bars, and the active-filters chip strip. -
AND-within-facet resolver mode —
settings.match = 'all'makes a facet require objects to carry every selected value (one single-valueINTERSECTleg per value), exposed as an any/all control on multi-value facets. -
Multisite support — network-aware activation, new-site table seeding
(
wp_initialize_site), theplugins_loadedschema auto-heal, and per-site opt-in uninstall. Validated on a liveWP_ALLOW_MULTISITEnetwork.
0.11.0-alpha - 2026-05-29
Custom-field source line — ACF, Meta Box, and Pods.
- ACF, Meta Box, and Pods suggestion providers — one-click facet configs from registered custom fields, gated so only in-use fields are offered.
-
Indexer resolve mechanism — ID→label resolution for
post/user/termreferences, serialized-array and comma-separated-ID adapters, and ACFdate_picker(Ymd) → epoch normalization. - Divi bridge — query helper plus a native module for placement.
-
Action Scheduler-backed background reindex, with a
wp_cronfallback.
0.10.0-alpha - 2026-05-26
- Third page-builder bridge: Breakdance (Array Query recipe).
0.9.0-alpha - 2026-05-26
- Second page-builder bridge: Bricks (query binding by CSS class).
0.8.0-alpha - 2026-05-24
- Polish pass: theming foundation (CSS variable tokens), admin clarity, and a numbered pagination facet.
0.7.0-alpha - 2026-05-24
- First page-builder bridge: Elementor (Query ID binding).
0.6.1-alpha - 2026-05-24
- Test harness and CI hygiene.
0.6.0-alpha - 2026-05-21
- Customer-ready foundation.
0.5.0-alpha - 2026-05-21
- Premium licensing scaffold.
0.4.0-alpha - 2026-05-21
- Admin SPA expansion ("admin grows up").
0.3.0-alpha - 2026-05-21
- Visual DNA v3 — palette matching.
0.2.0-alpha - 2026-05-21
- Visual DNA lands — color-extraction-driven filtering.
0.1.0-alpha - 2026-05-21
- First public alpha.
hooked on facets · Filtering, finally fun. · GitHub · hookedonfacets.com
Filtering, finally fun.
📖 docs
🧠 concepts
🎛️ facet types
- All Types
- Checkbox
- Radio
- Dropdown
- Range Slider
- Date Range
- Search
- Hierarchy
- Color Swatch
- Swipe Deck
- Spin the Wheel
- Intersection Matrix
- Ask
- Visual DNA
- Toggle
- Saved Bin
- Pagination
🔧 develop
🗺️ project