*** Laqi Product Data Checks Changelog ***

2026-09-12 - version 1.2.2
* Fix - Category exclusions are read as array_map( 'intval', ... ) against the rule keys this plugin registers, so a key posted by the browser is never read at all rather than read and then sanitised.
* Tweak - phpcs.xml.dist no longer registers a custom sanitising function. Plugin Check runs its own ruleset and does not know ours, so a sanitiser named only here makes local linting agree with nobody: it reported clean while Plugin Check still flagged the read. Our ruleset must never be softer than the one the directory runs.

2026-09-12 - version 1.2.1
* Fix - The posted form is sanitised before it reaches laqi_lpdc_checks_saved or laqi_lpdc_rule_bulk. Both hooks used to hand over $_POST itself, with a comment explaining that each listener sanitises its own fields; WordPress.org review rejected that reasoning and was right, since a listener is third-party code this plugin cannot vouch for. Values are sanitised as text, keys become sanitize_key() slugs, and this request's nonce and referer are dropped rather than passed to anyone.
* Fix - Category exclusions on the Checks screen are read as term ids rather than as raw form values validated further down. CheckScope still validates them, deliberately, because it is reachable from code that never came through the form.
* Tweak - phpcs.xml.dist names wc_clean as a sanitiser instead of the code silencing the sniff. A phpcs:ignore is invisible to review and to Plugin Check, which is how the unsanitised payload above survived four releases.

2026-09-11 - version 1.2.0
* Add - First seen, on every product listed under a check. The date a fault first appeared was recorded from the beginning and never shown, so a fault that had been there for months was indistinguishable from one this scan found. A returning fault keeps its original date, which is what the readme means by a regression.
* Add - Shipping class check. Where the rates charge per shipping class and set no cost for items without one, WooCommerce adds nothing to the rate for an unclassified product, so the merchant absorbs the difference on every order containing it. Gated twice, on the rates being configured that way and on some product already carrying a class, because having no shipping class is correct on almost every store and reporting it everywhere would be noise.

2026-09-10 - version 1.1.2
* Tweak - Rewrites plugin copy to follow the Laqi Logistics house style without em dashes.

2026-09-09 - version 1.1.1
* Fix - Declares compatibility with WooCommerce 11.1. The header had stood at 10.9, so WooCommerce told merchants on anything newer that this plugin had not been tested with their version.
* Fix - The Skip categories picker announced itself incorrectly to screen readers. The control WooCommerce renders carries ARIA attributes that are only valid alongside a role it does not set, which made the control's own name invalid too.

2026-09-09 - version 1.1.0
* Add - Skip categories is now a searchable picker. A plain list showed the same first three categories on every check with none of them selected, which read as "every check skips these" when nothing was skipped at all.
* Add - Extension points for add-ons to offer bulk actions on a check's list of affected products. Nothing in this plugin uses them, so the screen is unchanged unless an add-on is installed.
* Add - laqi_lpdc_checks_saved, so a field added to the checks form can be saved rather than silently discarded while the screen reports "Saved".
* Fix - A dependency notice could render on every wp-admin page instead of only the Plugins screen.
* Fix - An add-on's action on the findings screen overlapped the view navigation instead of sitting beside it.

2026-09-08 - version 1.0.1
* Tweak - Adds the screenshots and captions shown on the WordPress.org listing. No functional change to the plugin.

2026-09-07 - version 1.0.0
* Initial release.
* Add - Missing price and no-purchasable-variations checks.
* Add - Missing SKU and missing image checks, each gated on whether the store uses them at all.
* Add - Downloadable-with-no-file check.
* Add - Stock status contradicting the stock quantity, in both directions.
* Add - Missing GTIN check, gated on whether the store records identifiers.
* Add - Products left only in the default category, gated on whether the store files things elsewhere.
* Add - Every check states whether it applies to products, variations, or both.
* Add - Findings show the value behind them where that is the point, such as the weight or which dimension is missing.
* Add - Dismiss a finding for one product, which a rescan never undoes.
* Add - Switch individual checks off, keeping their findings for when they are switched back on.
* Add - Missing weight check for products that are shipped directly.
* Add - Missing weight check for variations with no parent weight to inherit.
* Add - Background catalogue scanning through Action Scheduler, walking by product ID.
* Add - Findings screen under WooCommerce, grouped by check and then by product.
* Add - Findings are remembered between scans, so a problem that returns reads as a regression.
* Add - Incomplete dimensions check, which runs only on stores that use dimensions.
* Add - Implausible weight check with a unit-aware bound.
* Add - Stock managed with no quantity check.
* Add - Virtual products carrying shipping data check.
* Fix - Do not report external, grouped or variable-parent products as missing a weight; none of them is handed to a carrier, and a variable parent was double-reported with its own variations.
