{"id":398026,"date":"2026-11-06T11:47:01","date_gmt":"2026-11-06T11:47:01","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/shadimetry-for-woocommerce\/"},"modified":"2026-11-06T13:33:55","modified_gmt":"2026-11-06T13:33:55","slug":"shadimetry-for-woocommerce","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/shadimetry-for-woocommerce\/","author":23598395,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.2.1","stable_tag":"0.2.1","tested":"7.1.4","requires":"6.6","requires_php":"8.1","requires_plugins":null,"header_name":"Shadimetry for WooCommerce","header_author":"ExotomicDev","header_description":"Sell made-to-measure shades using width and drop pricing bands.","assets_banners_color":"d1c9c9","last_updated":"2026-11-06 13:33:55","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":94,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.1.3":{"tag":"0.1.3","author":"exotomicdev","date":"2026-11-06 11:46:35","revision":3787821},"0.2.1":{"tag":"0.2.1","author":"exotomicdev","date":"2026-11-06 13:33:55","revision":3788006}},"upgrade_notice":{"0.2.1":"<p>Adds a versioned extension API (1.1) for add-ons; prices, grids, carts and orders are kept. Back up first. Do not downgrade to 0.1.3 once an option extension has been used.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3787983,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3787983,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3787983,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3787983,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.1.3","0.2.1"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Manual width and drop pricing grid in the native WooCommerce product editor. Local demonstration data.","2":"Customer measurements and a server-generated unit price preview. Browser viewport simulation at 390 px; not a physical-phone test.","3":"Classic WooCommerce cart retaining actual measurements, unit price and quantity. Local tax-disabled virtual test product; shipping is not illustrated.","4":"Field-specific validation for a width outside the supported grid. Browser viewport simulation; not a screen-reader certification."}},"plugin_section":[],"plugin_tags":[219492,63223,4399,291144,286],"plugin_category":[45],"plugin_contributors":[291145],"plugin_business_model":[],"class_list":["post-398026","plugin","type-plugin","status-publish","hentry","plugin_tags-blinds","plugin_tags-custom-dimensions","plugin_tags-pricing-grid","plugin_tags-shades","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-exotomicdev","plugin_committers-exotomicdev"],"banners":{"banner":"https:\/\/ps.w.org\/shadimetry-for-woocommerce\/assets\/banner-772x250.png?rev=3787983","banner_2x":"https:\/\/ps.w.org\/shadimetry-for-woocommerce\/assets\/banner-1544x500.png?rev=3787983","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/shadimetry-for-woocommerce\/assets\/icon-128x128.png?rev=3787983","icon_2x":"https:\/\/ps.w.org\/shadimetry-for-woocommerce\/assets\/icon-256x256.png?rev=3787983","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Shadimetry Free lets merchants configure a complete width \u00d7 drop price matrix for a simple WooCommerce product. Customers enter finished measurements in cm. The server selects the first inclusive upper bands and uses that cell as the product's base unit price.<\/p>\n\n<p>Includes a native product editor, strict validation, server price preview, separate cart lines for different measurements, quantity handling, current-grid repricing and visible order item dimensions. All included functionality is unlocked, with no account, trial limit, tracking, external API or paid service.<\/p>\n\n<p>Grid prices replace regular and sale prices. Saving a valid grid sets the product's regular price to the lowest grid price and removes any sale price, so catalog sorting, price filters, feeds and search-engine structured data (published as a low\u2013high price range) stay consistent with the grid. Coupons remain handled by WooCommerce. Grid prices follow the store's normal inclusive\/exclusive tax entry mode. The store owns currency, display tax and rounding. Decimal dimensions allow at most one decimal digit; no inches conversion is included.<\/p>\n\n<p>Use the classic WooCommerce product editor and native simple-product form. Cart and Checkout blocks can process items added using that form. Direct Store API configured-product additions, newer interactive add-to-cart blocks, variations, bundles, composites and subscriptions are not supported. Requires 64-bit PHP.<\/p>\n\n<p>Local port tests covered WordPress 6.6 \/ PHP 8.1.34 \/ WooCommerce 9.3.3 \/ MariaDB 11.4.13 with Twenty Twenty-Four 1.2, and WordPress 7.1.4 \/ PHP 8.5.12 \/ WooCommerce 11.2.1 \/ MariaDB 11.4.13 or SQLite 3.53.4 (integration 3.1.2) with Twenty Twenty-Five 1.5. Classic orders, HPOS, taxes, shipping and classic\/Store API checkout were exercised. These exact combinations do not establish compatibility with every intervening release, extension or theme.<\/p>\n\n<p>Historical theme-control tests recorded Cart block overflow at 320\/375 px even without the pricing plugin. That full block\/theme comparison was not repeated for this port. The classic cart fitted the tested 320, 375, 390 and 768 px viewports. Check your chosen theme and cart layout on staging. No global theme CSS override is included.<\/p>\n\n<p>Keyboard navigation, focus, field labels and error recovery were checked in desktop browsers, with automated accessibility checks on the measurement form. Physical phones and screen readers have not been tested yet, and no WCAG conformance is claimed. No CSV import is included. Test the product, cart, taxes and checkout on a staging copy of your store before taking orders.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate WooCommerce.<\/li>\n<li>Install Shadimetry for WooCommerce from Plugins \u2192 Add Plugin, or upload the plugin ZIP, then activate it.<\/li>\n<li>Edit a simple product and open Product data \u2192 General.<\/li>\n<li>Enable Shadimetry, enter semicolon-separated bands and complete price rows, then save. The regular price is set to the lowest grid price.<\/li>\n<li>Test the product, cart, taxes and an offline checkout before store use.<\/li>\n<\/ol>\n\n<p>See README.md for an illustrated text example and detailed rules.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"which%20cart%20layout%20is%20recommended%3F\"><h3>Which cart layout is recommended?<\/h3><\/dt>\n<dd><p>Use the native simple-product measurement form with the classic Cart and Checkout shortcodes. Assign those pages in WooCommerce settings and check all navigation links. Historical theme-control tests recorded narrow-screen Cart block overflow even without the pricing plugin. No global theme CSS fix is included.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20the%20grid%20changes%3F\"><h3>What happens if the grid changes?<\/h3><\/dt>\n<dd><p>Every request reprices carts with the current grid. If the price changes while a shopper is already on the checkout page, the order is created at the current grid price, as WooCommerce does for a normal price change; Shadimetry only rejects a change detected within the checkout request itself. Avoid editing grids during busy trading hours. Invalid\/removed grids or disabling custom pricing remove old configured cart lines. New purchases of a disabled product use the product's regular price, which is the lowest price of its last saved grid.<\/p><\/dd>\n<dt id=\"can%20i%20create%20orders%20for%20configured%20products%20in%20the%20admin%3F\"><h3>Can I create orders for configured products in the admin?<\/h3><\/dt>\n<dd><p>Not yet. Orders created manually in the WooCommerce admin or through the REST API use the product's regular price and contain no measurements. Have the customer order through the product page, or enter the line price and the measurements yourself.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20currency%20switchers%2C%20dynamic%20pricing%20or%20role-based%20pricing%20plugins%3F\"><h3>Does it work with currency switchers, dynamic pricing or role-based pricing plugins?<\/h3><\/dt>\n<dd><p>Not supported. Plugins that change a configured product's price after Shadimetry, or show prices in another currency, make the configured product impossible to order: checkout stops with a price-change error rather than charging an unchecked amount. Test any pricing extension on staging first.<\/p><\/dd>\n<dt id=\"does%20%22order%20again%22%20work%3F\"><h3>Does \"Order again\" work?<\/h3><\/dt>\n<dd><p>Native WooCommerce Order again restores saved measurements and option choices for an authorized customer, then validates them against current prices and available providers. Invalid configurations and missing required providers are rejected. Third-party cart-recovery tools are not covered.<\/p><\/dd>\n<dt id=\"how%20do%20i%20upgrade%20from%20shadimetry%200.1.3%20or%20switch%20from%20shadegrid%3F\"><h3>How do I upgrade from Shadimetry 0.1.3 or switch from ShadeGrid?<\/h3><\/dt>\n<dd><p>Shadimetry 0.1.3 updates in place under the same plugin folder and main file. Back up the database and plugin before updating on staging. Legacy grids, cart dimensions and orders retain their historical technical keys. When switching from a private ShadeGrid package, deactivate that package before activating Shadimetry; do not run both copies. This package keeps the public shadegrid_* API hooks.<\/p><\/dd>\n<dt id=\"can%20i%20downgrade%20to%200.1.3%20after%20using%20option%20extensions%3F\"><h3>Can I downgrade to 0.1.3 after using option extensions?<\/h3><\/dt>\n<dd><p>Do not downgrade a live store with required providers or option-bearing carts. Version 0.1.3 ignores required providers and option selections, so a previously surcharged item can be priced at its base grid price. Use maintenance mode, stop purchases, and restore a consistent database-and-plugin backup made before options were introduced. Never treat uninstall\/reinstall or a plugin-only rollback as a safe migration. Existing historical order evidence must be preserved. No automatic downgrade cleanup is performed.<\/p><\/dd>\n<dt id=\"can%20i%20change%20store%20currency%20or%20precision%3F\"><h3>Can I change store currency or precision?<\/h3><\/dt>\n<dd><p>Review and explicitly save each grid in the new currency\/precision. Until then configured purchases fail validation. No automatic conversion occurs.<\/p><\/dd>\n<dt id=\"does%20this%20import%20supplier%20spreadsheets%3F\"><h3>Does this import supplier spreadsheets?<\/h3><\/dt>\n<dd><p>No. This release provides manual grid entry only. A future add-on would be a separate plugin, without locking features in Free.<\/p><\/dd>\n<dt id=\"are%20taxes%20calculated%20by%20shadimetry%3F\"><h3>Are taxes calculated by Shadimetry?<\/h3><\/dt>\n<dd><p>No. Enter grid prices in the same tax mode as normal WooCommerce product prices. WooCommerce calculates and formats all taxes and totals.<\/p><\/dd>\n<dt id=\"is%20anything%20sent%20to%20external%20services%3F\"><h3>Is anything sent to external services?<\/h3><\/dt>\n<dd><p>Shadimetry sends no outgoing requests and loads its own assets locally. Its same-origin price preview does not persist measurements. WooCommerce and other installed plugins retain their own behavior.<\/p><\/dd>\n<dt id=\"what%20data%20is%20retained%20after%20uninstall%3F\"><h3>What data is retained after uninstall?<\/h3><\/dt>\n<dd><p>Saved product grids and historical order metadata remain to protect merchant pricing and order evidence.<\/p><\/dd>\n<dt id=\"for%20developers%3A%20how%20can%20extensions%20integrate%3F\"><h3>For developers: how can extensions integrate?<\/h3><\/dt>\n<dd><p>API version 1.1 is announced by shadegrid_loaded after WooCommerce-dependent modules are ready. Register Option_Provider implementations through shadegrid_register_option_providers. Use Quote_Service::quote for complete grid-plus-options quotes. Product_Config::quote remains the legacy grid-only helper and must not be used to bypass purchase validation.<\/p>\n\n<p>Grid_Store::validate is read-only. Grid_Store::save requires product edit permission and a product-bound shadegrid_save_ID nonce in its context; use expected_revision to detect stale writes. Since 0.2.1 a save keeps the product's Shadimetry activation unchanged unless the context passes enable=true or enable=false, and a save whose grid was committed is reported as saved even if another plugin fails during the same product save. With persist=false, events fire only after WooCommerce saves the staged object. shadegrid_grid_saved and the legacy shadegrid_product_grid_saved are retained; provider IDs and monetary adjustments are strictly validated. No supplier importer, templates or history storage is included in Free.<\/p>\n\n<p>Options use the parent product tax\/shipping rules. Catalog ranges and structured offers describe the grid before any extension options. Extensions must not set cart prices directly. Other independent price-modifier plugins are not a supported combination. Development sources contain the hook reference and provider guide; no development fixtures are included in the installation ZIP.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.2.1<\/h4>\n\n<ul>\n<li>Configuration notices (WooCommerce missing, conflicting copy, 32-bit PHP) are shown only to administrators on the Plugins screen, as in 0.1.3.<\/li>\n<li>Port Free 0.2.1 to the Shadimetry identity; retain API 1.1 and historical data\/hooks.<\/li>\n<li>Scope coexistence checks to candidate activation; unrelated plugins remain manageable when conflicting flags exist.<\/li>\n<li>Grid writes, including required-extension changes, no longer re-enable a product the merchant disabled; a disabled product keeps its native price.<\/li>\n<li>A grid committed during a product save is reported as saved, with its history event, even when another plugin fails in the same save.<\/li>\n<li>The product editor lists required option extensions, shows inactive ones and lets the merchant remove those requirements without the extension.<\/li>\n<li>Store managers can release a save lock abandoned by an interrupted request (after 15 minutes) and repair a corrupted revision counter from the editor.<\/li>\n<li>Option labels are stored as plain text, so plain-text e-mails no longer show HTML entities; labels starting with an underscore are refused.<\/li>\n<li>Marking required extensions on a product without a grid is rejected with a validation error instead of a PHP type error.<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>Add a versioned grid write API with revision checks and post-persistence events.<\/li>\n<li>Add generic option-provider and complete-quote contracts; no option provider is bundled.<\/li>\n<li>Reject missing required providers and revalidate full prices through checkout and order creation.<\/li>\n<li>Store private structured quote evidence and readable option selections on new orders.<\/li>\n<li>Revalidate Order Again using current grids\/options and retain invalid editor input privately for 10 minutes.<\/li>\n<\/ul>\n\n<h4>0.1.3<\/h4>\n\n<ul>\n<li>Introduce the Shadimetry public identity while preserving historical ShadeGrid data keys and financial rules.<\/li>\n<\/ul>\n\n<h4>0.1.2<\/h4>\n\n<ul>\n<li>Saving a valid grid sets the regular price to the lowest grid price and clears sale prices, so catalog sorting, price filters and feeds no longer use an unrelated price.<\/li>\n<li>Publish the grid's low\u2013high range as an AggregateOffer in product structured data.<\/li>\n<li>Disable Shadimetry automatically when a product is changed to an unsupported type, instead of leaving a hidden enabled setting.<\/li>\n<li>Show shoppers a neutral message instead of merchant configuration instructions.<\/li>\n<li>Do not flag a measurement as invalid before the shopper has filled in both fields.<\/li>\n<li>Document unsupported admin-created orders, pricing plugins, \"Order again\" and grid changes during checkout.<\/li>\n<\/ul>\n\n<h4>0.1.1<\/h4>\n\n<ul>\n<li>Reject a grid change detected within the checkout request instead of silently mutating the unit price.<\/li>\n<li>Give every measurement form unique label and description targets.<\/li>\n<li>Identify the invalid measurement without falsely flagging a valid field, and improve touch targets\/focus.<\/li>\n<li>Handle malformed saved editor values without a PHP error.<\/li>\n<li>Preserve WooCommerce tax suffixes and dynamic amounts in catalog grid price ranges.<\/li>\n<li>Exclude developer documentation and test files from the installation package.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Initial development version with server pricing, validation, classic and block checkout integration and HPOS-safe order metadata.<\/li>\n<\/ul>","raw_excerpt":"Sell made-to-measure shades with width and drop bands, server pricing and saved order dimensions.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/398026","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=398026"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/exotomicdev"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=398026"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=398026"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=398026"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=398026"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=398026"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=398026"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}