=== HS Product Filters for WooCommerce ===
Contributors: hookspark
Requires at least: 6.8
Requires PHP: 8.2
Requires Plugins: woocommerce
Stable tag: 0.8.1-dev
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Internal development preview of variation-aware catalog filtering.

== Description ==
Create named filter configurations in HookSpark > Product Filters. Preview categories, tags, native brands and global attributes against the actual WooCommerce catalog, with price and stock constraints.

Embed an enabled set using [hs_product_filters set="SET_ID"]. One set per dedicated page is supported in this development version. GET forms work without JavaScript; AJAX replaces only the catalog fragment and updates browser history. No archive replacement yet. Named SEO landings use native WordPress pages. Full-page HTML is fetched from the same URL; no separate public write endpoint is exposed. Pretty permalinks are the tested route.

OR within a dimension; AND across dimensions; all constraints must match the same variation. Counts are distinct parent products with the counted dimension's selection omitted. Prices follow WooCommerce display taxation. FOX Currency Switcher 1.5.4 passed scoped USD/EUR fixed-rate filtering checks on WordPress 6.8/WooCommerce 10.6.0 using its default transient storage. Its selector reload clears AJAX selections. Cookie storage, GeoIP, fixed product prices, cached shops, checkout conversion and other providers remain unverified.

The native adapter streams the selected catalog in batches and supports currencies with zero to six decimal places. It no longer truncates at 500 products or 5,000 candidate rows. It still reads every eligible product per request: large-catalog response time is not release-ready. Request-local cache memory is released when the cache provider explicitly supports that operation; persistent cache is never flushed. Cache-provider compatibility remains to be verified. Preview shows six cards and up to 30 values per dimension. Simple and variable products only. Configuration allows up to eight taxonomy filters and 100 sets.

== SEO landing pages ==
In Product Filters > SEO landing pages, connect an existing WordPress page containing exactly one [hs_product_filters] shortcode to an enabled set and one taxonomy term. Write its SEO title and description. Use the native page editor for its readable URL, heading, content and publication status. The SEO editor never publishes or rewrites page content. Enable indexing only for useful, distinct editorial pages; default is noindex. Up to 100 page bindings are supported.

Additional filters, price/stock constraints, nondefault sorting and pagination remain noindex and do not inherit the editorial metadata. Exact equivalent selections use the native page canonical when indexing is permitted. Empty/invalid filtered HTML returns 404 while preserving usable controls; AJAX can render that recovery state. Temporary catalog failures return 503. Global noindex and existing SEO-provider restrictions are never removed. robots.txt is not modified: blocking crawling can prevent crawlers from reading noindex.

Native sitemap excludes noindex, unavailable and empty configured landings. Installed Yoast SEO 28.5 and Rank Math 1.0.278 passed the metadata, robots, canonical and sitemap acceptance matrix on WordPress 7.1.1, WooCommerce 11.1.0 and PHP 8.2.29. Other versions remain unverified. Provider sitemap caches are refreshed after filter settings, catalog or site-visibility changes. Other SEO plugins or themes producing their own descriptions require verification. Arbitrary filter URLs are not automatically converted to pretty URLs: readable URLs belong to deliberately created WordPress pages. Generated filter parameters are normalized. Mass landing generation and automatic metadata for combinations are not provided.

== Data policy ==
Settings are site-scoped and retained on deactivation or removal. This build writes no product, stock, cart or order data. No external services or telemetry. No stable public developer API is provided yet.

== Changelog ==

= 0.8.1-dev =
* Explain invalid prices beside the affected field, preserve input and focus correction in desktop, mobile and admin previews.
* Reject conflicting page slugs or published landing URLs that do not resolve to their selected page before saving SEO settings.
* Review native pages and SEO bindings using a set before moving it to Trash.
* Explain admin preview matching and show attributes of the matching variation alongside its ID.
* Inherit theme typography and WordPress base/contrast colors, with scoped merchant color overrides.
* Reconcile a page restored from browser memory with its active filter URL without adding history entries.
* Associate configuration and SEO errors with their fields, link the summary to invalid controls and retain valid draft values.

= 0.8.0-dev =
* Keep mobile retry controls in view and distinguish explicit admin form submissions from leaving unsaved changes.
* Preview draft SEO landing URL, metadata, matching count and indexing constraints before saving or publishing anything. Explain landing permission, site visibility, planned canonical and external checks separately.
* Choose whether category boundaries and category filters include descendants, preserving existing defaults.
* Normalize generated filter URLs and retry the exact failed catalog update while ignoring stale network errors.

= 0.7.1-dev =
* Prime missing WordPress and WooCommerce metadata caches from one bounded native read, preserving warm caches and native metadata hooks.

= 0.7.0-dev =
* Keep the last ten changed configurations per filter set and load previous versions as inactive drafts, with validation and conflict protection.

= 0.6.2-dev =
* Reuse one native facet-count scan per filter set while generating page sitemaps. Retain only configured landing terms in request memory.
* Invalidate request counts after catalog/configuration changes and leave product sitemap entries untouched.

= 0.6.1-dev =
* Refresh provider page sitemaps after filter configuration and catalog changes; exclude configured landings when the site discourages indexing.
* Keep native descriptions available while an installed SEO provider has not initialized its head output.
* Verify Yoast 28.5 and Rank Math 1.0.278 using actual HTTP pages and XML sitemaps.

= 0.6.0-dev =
* Mobile filter drawer with native modal focus handling, draft selections, explicit apply and cancel/Escape restoration.
* Without JavaScript, the existing page-navigation filter controls remain available.

= 0.5.3-dev =
* Batch missing native WooCommerce metadata reads and prime variation batches, preserving native metadata filters, IDs and CRUD invalidation. Custom product data stores retain their own reads.
* Reduces database query count; complete-catalog scanning remains and large-catalog response time is not certified.
* Respect page-authoring capabilities when showing SEO setup actions; existing page bindings remain editable when authorized.

= 0.5.1-dev =
* Show removable active taxonomy values, price limits and availability above the catalog.
* Removal preserves other selections and sorting, returns to page one, and works with or without JavaScript.
* Removing a landing default broadens browsing without inheriting index permission.

= 0.5.0-dev =
* Add editorial single-filter landing bindings with opt-in indexing, native readable page URLs and custom title/description.
* Apply scoped noindex to combinations; preserve global restrictions and exclude unavailable landings from the native sitemap.
* Return 404 for empty/invalid filtered HTML, update metadata with AJAX/history, and preserve plain-permalink GET routing.
* Add preliminary Yoast and Rank Math metadata/sitemap adapters; integration certification remains open.

= 0.4.0-dev =
* Stream native catalog candidates and retain only the requested result window.
* Preserve same-variation matching and distinct-parent facet counts across batches.
* Remove fixed catalog caps; benchmark confirms large-catalog latency still needs optimization.

= 0.3.0-dev =
* Search saved sets, duplicate as inactive, move to Trash with exact-name confirmation, restore as inactive.
* Preserve saved sets across concurrent actions; reject malformed registry documents.
* Price filtering supports zero to six decimal places; admin preview now uses matched variation images.

= 0.2.0-dev =
* Public shortcode, progressive GET/AJAX filtering, history, sorting and pagination.
* Matched variation images and links. Responsive scoped frontend controls.
* Company demo with five original images (not included in the customer plugin).

= 0.1.0-dev =
* First internal configuration editor with privately bundled HookSpark Core.
* Canonical state and variation-aware matching, contextual distinct-parent counts.
* Native read-only catalog preview and atomic versioned settings.
* Italian interface, responsive admin and unsaved-change guard.
