{"id":364681,"date":"2026-09-08T02:05:18","date_gmt":"2026-09-08T02:05:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/flexa-extra-extra-product-options-for-woocommerce\/"},"modified":"2026-09-08T07:38:25","modified_gmt":"2026-09-08T07:38:25","slug":"flexa-extra","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/flexa-extra\/","author":23412324,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.1.1","stable_tag":"1.1.1","tested":"7.1","requires":"5.0","requires_php":"7.4","requires_plugins":null,"header_name":"Flexa Extra \u2013 Extra Product Options For WooCommerce","header_author":"FlexaTech","header_description":"Add customizable extra options and personalization fields to WooCommerce products (text, checkbox, radio, dropdown, swatches, buttons, date and colour pickers) with optional extra fees.","assets_banners_color":"b9c0ca","last_updated":"2026-09-08 07:38:25","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/flexa-extra","header_author_uri":"https:\/\/profiles.wordpress.org\/flexatech\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":62,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.1":{"tag":"1.0.1","author":"flexatech","date":"2026-09-08 02:05:03","revision":3685792},"1.1.0":{"tag":"1.1.0","author":"flexatech","date":"2026-09-08 05:18:13","revision":3685910},"1.1.1":{"tag":"1.1.1","author":"flexatech","date":"2026-09-08 07:38:25","revision":3686141}},"upgrade_notice":{"1.1.1":"<p>Fixes the YayExtra importer, which previously brought nothing over and ignored product assignment. Recommended if you import from YayExtra.<\/p>","1.1.0":"<p>Big feature release: import from YayExtra\/ThemeHigh, analytics, headless read API, a Gutenberg block, live builder preview, conditional fees\/discounts, per-option stock, and more. No breaking changes.<\/p>","1.0.1":"<p>Hardens swatch image output against CSS injection. Recommended update.<\/p>","1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3685911,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3685911,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3685804,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3685804,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"flexa-extra\/configurator":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"flexa-extra\/configurator","version":"1.0.0","title":"Flexa Extra \u2013 Options configurator","category":"widgets","icon":"forms","description":"Show an interactive option-set configurator with live price on any page. Display only: selections are not added to the cart.","textdomain":"flexa-extra","keywords":["woocommerce","product options","addons","configurator","flexa"],"attributes":{"optionSetId":{"type":"number","default":0},"productId":{"type":"number","default":0}},"supports":{"html":false,"align":["wide","full"]},"editorScript":"flexa-extra-configurator-editor"}},"tagged_versions":["1.0.1","1.1.0","1.1.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3685911,"resolution":"1","location":"assets","locale":"","width":1170,"height":658},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3685911,"resolution":"2","location":"assets","locale":"","width":1170,"height":658},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3685911,"resolution":"3","location":"assets","locale":"","width":1170,"height":658},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3685911,"resolution":"4","location":"assets","locale":"","width":1170,"height":658},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3685911,"resolution":"5","location":"assets","locale":"","width":1170,"height":658},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3685911,"resolution":"6","location":"assets","locale":"","width":1170,"height":658},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3685911,"resolution":"7","location":"assets","locale":"","width":1170,"height":658},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3685911,"resolution":"8","location":"assets","locale":"","width":1170,"height":658}},"screenshots":{"1":"All your option fields on one product page: swatches, buttons, radio and checkbox choices, priced live.","2":"Add-ons that charge automatically: per-option fees, a colour dropdown, and a date picker on the product page.","3":"One option set reused across products: the same gift options assigned wherever you need them.","4":"Build option sets by drag and drop: pick a field from the palette, drop it in, and configure it in the inspector.","5":"Conditional fees and discounts: apply a fixed or percentage amount when the shopper's selections match your rules.","6":"Decide where each set applies: all products, a hand-picked list, or by category, tag, price and stock conditions.","7":"Control what shoppers see: toggle the extra subtotal, total price, itemized breakdown, and mini-cart values.","8":"Start from a ready-made template: six starters you can edit before turning the set on."}},"plugin_section":[],"plugin_tags":[163084,10685,149840,155785,286],"plugin_category":[45],"plugin_contributors":[255540],"plugin_business_model":[],"class_list":["post-364681","plugin","type-plugin","status-publish","hentry","plugin_tags-extra-product-options","plugin_tags-personalization","plugin_tags-product-addons","plugin_tags-product-options","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-flexatech","plugin_committers-flexatech"],"banners":{"banner":"https:\/\/ps.w.org\/flexa-extra\/assets\/banner-772x250.png?rev=3685804","banner_2x":"https:\/\/ps.w.org\/flexa-extra\/assets\/banner-1544x500.png?rev=3685804","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/flexa-extra\/assets\/icon-128x128.png?rev=3685911","icon_2x":"https:\/\/ps.w.org\/flexa-extra\/assets\/icon-256x256.png?rev=3685911","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/flexa-extra\/assets\/screenshot-1.png?rev=3685911","caption":"All your option fields on one product page: swatches, buttons, radio and checkbox choices, priced live."},{"src":"https:\/\/ps.w.org\/flexa-extra\/assets\/screenshot-2.png?rev=3685911","caption":"Add-ons that charge automatically: per-option fees, a colour dropdown, and a date picker on the product page."},{"src":"https:\/\/ps.w.org\/flexa-extra\/assets\/screenshot-3.png?rev=3685911","caption":"One option set reused across products: the same gift options assigned wherever you need them."},{"src":"https:\/\/ps.w.org\/flexa-extra\/assets\/screenshot-4.png?rev=3685911","caption":"Build option sets by drag and drop: pick a field from the palette, drop it in, and configure it in the inspector."},{"src":"https:\/\/ps.w.org\/flexa-extra\/assets\/screenshot-5.png?rev=3685911","caption":"Conditional fees and discounts: apply a fixed or percentage amount when the shopper's selections match your rules."},{"src":"https:\/\/ps.w.org\/flexa-extra\/assets\/screenshot-6.png?rev=3685911","caption":"Decide where each set applies: all products, a hand-picked list, or by category, tag, price and stock conditions."},{"src":"https:\/\/ps.w.org\/flexa-extra\/assets\/screenshot-7.png?rev=3685911","caption":"Control what shoppers see: toggle the extra subtotal, total price, itemized breakdown, and mini-cart values."},{"src":"https:\/\/ps.w.org\/flexa-extra\/assets\/screenshot-8.png?rev=3685911","caption":"Start from a ready-made template: six starters you can edit before turning the set on."}],"raw_content":"<!--section=description-->\n<p>Flexa Extra lets you attach extra option fields to WooCommerce products so shoppers can personalize what they buy and you can charge for it. Build an <strong>Option Set<\/strong> once, assign it to products (all, a hand-picked list, or by category\/tag\/price\/stock conditions), and the fields appear on the product page with live price updates.<\/p>\n\n<p>Every price is recomputed on the server from your saved field definitions when the product is added to the cart \u2014 a client-submitted price is never trusted \u2014 so the amount a shopper pays always matches what you configured.<\/p>\n\n<h4>Field types (free)<\/h4>\n\n<ul>\n<li>Text, textarea, number (with min\/max\/step and email\/URL\/regex validation)<\/li>\n<li>Date picker and colour picker<\/li>\n<li>Checkbox, radio, dropdown<\/li>\n<li>Colour\/image swatches<\/li>\n<li>Button group<\/li>\n<li>Heading \/ description block<\/li>\n<li>Minimum and maximum number of choices on any multi-select field<\/li>\n<\/ul>\n\n<h4>Pricing<\/h4>\n\n<ul>\n<li>Per-field or per-option surcharge<\/li>\n<li>Fixed amount or a percentage of the product price<\/li>\n<li>Conditional fees and discounts applied to the item when selections match a rule<\/li>\n<\/ul>\n\n<h4>Inventory<\/h4>\n\n<ul>\n<li>Optional stock limit per choice option: sold-out options are disabled, over-selling is blocked at add-to-cart, and paid orders draw the stock down (restored on cancel or refund)<\/li>\n<\/ul>\n\n<h4>Templates<\/h4>\n\n<ul>\n<li>Start from a template: pick a ready-made starter (gift wrapping, engraving, size &amp; colour, installation service, warranty plan, product add-ons) and it creates an option set, switched off, that you can edit before turning it on<\/li>\n<\/ul>\n\n<h4>Assignment &amp; logic<\/h4>\n\n<ul>\n<li>Target all products, a manual list, or conditions (category, tag, product, price, stock)<\/li>\n<li>Conditional logic to show\/hide fields based on other selections<\/li>\n<li>Duplicate an option set, and import or export sets as a JSON file<\/li>\n<li>Import your existing option sets from YayExtra or ThemeHigh \"Extra Product Options\" (added switched off for review)<\/li>\n<li>Live preview in the builder: see the option set render (and price) exactly as the storefront will, updating as you edit<\/li>\n<\/ul>\n\n<h4>Store insights<\/h4>\n\n<ul>\n<li>Analytics screen ranking which options and choices sell, and the add-on revenue they bring, filterable by date range and order status<\/li>\n<\/ul>\n\n<h4>Headless &amp; integrations<\/h4>\n\n<ul>\n<li>Gutenberg \"Flexa Extra Configurator\" block to show an option set with live pricing on any page or post (display only, does not add to cart)<\/li>\n<li>Public read-only REST API for decoupled\/headless storefronts: fetch a product's option sets, prices, and logic to render the same configurator and subtotal elsewhere. Open by default, closable with a filter<\/li>\n<\/ul>\n\n<h4>Cart<\/h4>\n\n<ul>\n<li>Edit a line's options straight from the cart: the product page reopens with the\nsaved selections filled in, and re-adding replaces the line instead of stacking a\nduplicate<\/li>\n<\/ul>\n\n<h4>Display &amp; accessibility<\/h4>\n\n<ul>\n<li>Position fields before or after the add-to-cart button<\/li>\n<li>Live \"extra subtotal\" and \"total price\" readouts<\/li>\n<li>Itemized price breakdown: each selected option and conditional fee\/discount listed with its own price, updating live<\/li>\n<li>Swatch size\/shape and button colour styling<\/li>\n<li>Accessible markup (fieldset\/legend groups, <code>aria-required<\/code>, keyboard focus), responsive, and reduced-motion aware<\/li>\n<\/ul>\n\n<h3>Source code for compiled JavaScript and CSS<\/h3>\n\n<p>The admin app ships as a compiled bundle in <code>assets\/dist\/admin\/<\/code>. The\nhuman-readable source is included in this package under <code>apps\/admin\/src\/<\/code>\n(with its build config) and is built with pnpm + Vite:<\/p>\n\n<ol>\n<li><code>cd apps\/admin<\/code><\/li>\n<li><code>pnpm install<\/code><\/li>\n<li><code>pnpm build<\/code>   (or <code>pnpm dev<\/code> for a watched dev build)<\/li>\n<\/ol>\n\n<p>The storefront assets in <code>assets\/frontend\/<\/code> are plain, unminified JS\/CSS and need\nno build step.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin does not connect to any external services. All data is stored locally in your WordPress database.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin to <code>\/wp-content\/plugins\/flexa-extra<\/code> or install it through the Plugins screen.<\/li>\n<li>Activate it. WooCommerce must be active.<\/li>\n<li>On activation a short quick-start guide points you at the template gallery so you can build your first Option Set in a couple of minutes. It is skippable, and you can replay it later from Advanced settings.<\/li>\n<li>Open <strong>Flexa Extra<\/strong> in the admin menu to configure settings and build Option Sets.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20it%20require%20woocommerce%3F\"><h3>Does it require WooCommerce?<\/h3><\/dt>\n<dd><p>Yes. Flexa Extra stays inactive (with an admin notice) until WooCommerce is active.<\/p><\/dd>\n<dt id=\"can%20a%20customer%20tamper%20with%20the%20surcharge%3F\"><h3>Can a customer tamper with the surcharge?<\/h3><\/dt>\n<dd><p>No. The extra price is recomputed server-side from your stored option definitions on add-to-cart and on every cart totals pass; the posted values are sanitized against the field schema.<\/p><\/dd>\n<dt id=\"is%20it%20compatible%20with%20high-performance%20order%20storage%20%28hpos%29%3F\"><h3>Is it compatible with High-Performance Order Storage (HPOS)?<\/h3><\/dt>\n<dd><p>Yes. The plugin declares HPOS compatibility.<\/p><\/dd>\n<dt id=\"can%20developers%20extend%20it%3F\"><h3>Can developers extend it?<\/h3><\/dt>\n<dd><p>Yes, see <code>docs\/HOOKS.md<\/code> for the available actions and filters.<\/p><\/dd>\n<dt id=\"can%20i%20import%20from%20another%20options%20plugin%3F\"><h3>Can I import from another options plugin?<\/h3><\/dt>\n<dd><p>Yes. The Import screen reads option sets from YayExtra and from ThemeHigh \"Extra Product Options\" (free) and re-creates them in Flexa Extra, switched off. They appear in the Option Sets list for review; the storefront ignores them until you turn each one on. Field types, per-option prices, swatches and product assignment are mapped where an equivalent exists; anything that cannot be mapped 1:1 is listed per set so you can re-create it. Keep the source plugin active during the import so its data is readable.<\/p><\/dd>\n<dt id=\"can%20i%20use%20it%20with%20a%20headless%20or%20decoupled%20front%20end%3F\"><h3>Can I use it with a headless or decoupled front end?<\/h3><\/dt>\n<dd><p>Yes. Two open, read-only REST routes (<code>\/wp-json\/flexa-extra\/v1\/public\/config<\/code> and <code>\/public\/product\/{id}<\/code>) return the option sets, prices, and logic a front end needs to render the configurator and compute the live subtotal. They expose only what the on-page configurator already ships, and you can close the API with the <code>flexa_extra\/public_api\/enabled<\/code> filter. Add-to-cart and the final price are always recomputed server-side.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Fixed: YayExtra import brought nothing over. Field types (and per-option names) are stored by YayExtra as <code>{ value, label }<\/code> pairs, not the flat <code>fieldType<\/code> key the converter expected, so every field was skipped and each set dropped as empty. The real saved shape is now read, with the older flat form still accepted.<\/li>\n<li>Fixed: conditional product assignment is now migrated from YayExtra instead of falling back to \"all products\". Category and tag names are resolved to term IDs and each \"is one of\" list becomes one targeting rule per term; anything that cannot be mapped is reported per set.<\/li>\n<li>Fixed: plain button fields no longer import as colour swatches. Colour and image are now carried only for swatch field types, per option according to its swatch type.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Import option sets from YayExtra and ThemeHigh \"Extra Product Options\" (free): auto-detected, added switched off through the schema sanitizer, with a per-set report of anything that could not be mapped 1:1.<\/li>\n<li>Headless read API: two open, read-only REST routes (<code>\/public\/config<\/code> and <code>\/public\/product\/{id}<\/code>) so a decoupled front end can render the configurator and compute the subtotal. Closable with the <code>flexa_extra\/public_api\/enabled<\/code> filter.<\/li>\n<li>Sales analytics screen: rank options\/choices by picks and add-on revenue, filterable by date range and order status (HPOS-safe).<\/li>\n<li>Gutenberg \"Flexa Extra Configurator\" block: show an option set with live pricing on any page or post (display only).<\/li>\n<li>Live preview in the builder: render and price an option set as the storefront will, updating as you edit.<\/li>\n<li>Conditional fees and discounts: set-level rules that add a fixed or percentage fee or discount when selections match (a discount never drops the line below zero).<\/li>\n<li>Per-option stock: give a choice a limited quantity; sold-out options are disabled, over-selling is blocked, and paid orders draw stock down (restored on cancel or refund).<\/li>\n<li>Min and max choices per multi-select field, enforced again on the server at add-to-cart.<\/li>\n<li>Edit options in cart: reopen the product page with the saved selections and replace the line instead of stacking a duplicate.<\/li>\n<li>Template library: start a new option set from a ready-made starter.<\/li>\n<li>Itemized price breakdown on the product page, listing each option and fee or discount with its own price.<\/li>\n<li>First-run quick-start guide, replayable from Advanced settings.<\/li>\n<li>Date picker and colour picker field types.<\/li>\n<li>Duplicate an option set, and import or export sets as JSON.<\/li>\n<li>Fixed: admin dropdown arrows no longer crowd the text.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Security: escape swatch image URLs for the CSS <code>url()<\/code> context on the product page and in the cart, preventing CSS injection through crafted URLs.<\/li>\n<li>Removed the \"Tested up to\" line from the main plugin file so compatibility is declared only in readme.txt.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release: option-set builder with text, number, date picker, colour picker, choice, swatch and button fields; storefront render engine; server-authoritative pricing\/cart engine; UX &amp; style settings; and a two-tier automated test suite.<\/li>\n<\/ul>","raw_excerpt":"Extra product options for WooCommerce: text, choices, swatches, buttons, date and colour pickers, plus optional per-option fees priced server-side.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/364681","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=364681"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/flexatech"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=364681"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=364681"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=364681"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=364681"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=364681"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=364681"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}