
CartTailor — WooCommerce Product Options, Custom Fields & Swatches
Custom product options, visual swatches, and pricing rules that your customers configure right on the product page. CartTailor adds a visual builder to WooCommerce. You create option groups — sets of fields such as engraving text, size choices, gift wrap, or file uploads — and assign them to all products, selected products, or categories. Customers answer the fields on the product page and see a live price breakdown before they add the item to the cart. Every price is recalculated on the server, so the totals in the cart always come from your saved configuration, not from the browser.What you can build
- Personalized products: engraving text, monograms, gift messages, and custom names, with per-character pricing where a per-letter rate fits.
- Configured products: sizes, materials, finishes, and add-ons as dropdowns, radio buttons, checkboxes, or visual swatches.
- Choice-driven forms: fields that appear or disappear based on earlier answers, so customers only see the options that apply to them.
- Restricted options: fields or whole groups shown only to selected WordPress roles, or only to logged-out visitors.
- Customer uploads: logos, photos, and design briefs attached to the order through a validated, protected upload directory.
14 field types
Text Field, Textarea, Number, Date Picker, Time Picker, Range Slider, Dropdown, Multi-Select, Radio Buttons, Checkboxes, Color Swatches, Image Swatches, Text Swatches, and File Upload. Multi-select fields work by clicking options to select or deselect them — holding Ctrl is not required. Swatches carry tooltips, price badges, and selection checkmarks. Color swatch shape (round, rounded rectangle, or square) and size (24px to 64px) are global settings. Any choice on a choice-based field can be marked Unavailable: it renders with a cross overlay on swatches, greyed out with an “(Unavailable)” note on radio and checkbox choices, or as a disabled option on dropdowns — and the server rejects it at add-to-cart even if it is force-submitted.Pricing that covers the real cases
Six pricing types, set per field or per choice:- No charge — a complimentary option.
- Fixed fee — a one-time charge per line item, regardless of quantity.
- Per unit — an amount multiplied by the purchased quantity.
- Percentage — a percentage of the product base price only (or of the selected variation price), never of other options.
- Per character — a rate multiplied by the number of characters typed into a text field.
- Formula — a math expression using the base price and other numeric fields, for example {base} * 0.1. Formulas are evaluated server-side by a safe parser; eval() is never used. Invalid formulas are rejected at add-to-cart with a clear error instead of being priced at 0.
Conditional logic, done on the server too
Each field can show or hide based on other fields’ values, with match all (AND) or match any (OR) rule sets and seven operators: is, is_not, is_empty, is_not_empty, contains, greater_than, less_than. Rules run in the browser for instant feedback and again on the server, so a hidden field is skipped for required checks and pricing. For choice fields, rule values match the option’s Value column, not its label.Image swap on selection
When a selected choice carries an image, the product gallery main image changes to that image, and returns to the original when the selection is cleared. On variable products with a variation selected, the variation image takes priority and the swap does nothing.Assignments and per-product options
Apply a group to all products, specific products, or categories, exclude specific products, and order groups by priority. Or build options for a single product only, directly in the product editor’s Custom Options tab, without creating a group.Uploads, orders, and compatibility
- File uploads: per-field extension lists or the global default (jpg, jpeg, png, gif, webp, pdf, doc, docx, zip, txt), per-field size limits, MIME checks, randomized filenames, and a protected upload directory. Dangerous extensions are never allowed.
- Orders: option selections are stored on order line items and shown in the admin order view, the customer order view, and order emails.
- Compatibility: declared for WooCommerce HPOS (custom_order_tables) and Cart/Checkout Blocks (cart_checkout_blocks).
- Import/export: back up and migrate option groups as JSON between stores.
- Requirements: WordPress 5.8+, WooCommerce 5.0+, PHP 7.4+.
What is included
The installable plugin ZIP, plus 12 documentation files: Installation, User Guide, Field Types Reference, Pricing Rules and Calculations, Conditional Logic, Variable Products, FAQ, Troubleshooting, Changelog, Screenshots, and a single browsable documentation page.
Changelog:
= 1.0.15 =
* Listing gallery re-verified: the eight screenshots described in SCREENSHOTS.md are attached to the listing's Preview Screenshots field and visible in the listing lightbox (1 of 8). The 1.0.14 review reported an empty gallery, but the saved listing shows all eight images in the documented order.
* INSTALLATION.md version stamp corrected to 1.0.15 (it still read 1.0.10); every per-document version stamp in the documentation now matches 1.0.15.
= 1.0.14 =
* Listing gallery: the eight screenshots described in SCREENSHOTS.md are now uploaded to the WPBay listing gallery (field builder, frontend options, swatches, unavailable choice, conditional logic, price breakdown, order details, role visibility and formula pricing).
* SCREENSHOTS.md updated: the seventh screenshot is now the order-details view (the thank-you page after checkout, showing the chosen options, the formula-priced line total, and the download link for the uploaded file) instead of a mobile view; the intro now states that store-page captures have no admin bar while the field-builder capture shows the admin builder.
CHANGELOG — 1.0.13
* Uninstall now reads and preserves the upload-storage configuration before deleting it, so temporary files stored above the web root are removed when Delete Data on Uninstall is enabled (1.0.10–1.0.12 deleted the option first and could not locate the directory); files attached to retained orders are still kept, and an empty private directory is removed.
* The HTTP probe no longer treats redirects as proof of protection: any 3xx response is now 'unknown' and new uploads are refused, because a redirect can lead to a URL that serves the file. Properly denied directories (403, or 404 with a passing positive control) still work.
CHANGELOG — 1.0.12
* Upload-directory protection is now verified by an HTTP probe on every server, not by trusting the .htaccess file: a unique test file is requested through its public URL, with a positive control proving the URL mapping works, and the directory is accepted only when the test file cannot be retrieved. A 404 is conclusive only because the positive control proves the file exists and the URL works; a 200 that returns the test content means the directory is public and uploads are refused.
* Stored upload-directory protection is re-verified every 24 hours and when the server changes, on Apache/LiteSpeed as well as Nginx; a directory whose protection stops working flips to refused uploads while existing files stay downloadable.
* Documentation updated to describe the probe verification accurately.
## 1.0.11
* File uploads are now linked to their order on the block (Store API) checkout too: the post-save step runs on woocommerce_store_api_checkout_order_created and woocommerce_store_api_checkout_order_processed as well as the classic woocommerce_checkout_order_created — the classic hook never fires for block checkout, so 1.0.10 left files unattached there and guests with a valid order key got a 403.
* The storage upgrade migration now moves existing files even when no prior storage record exists (1.0.9 installs): the uploads directory is used as the previous location instead of skipping the move.
* The one-time recovery now also repairs temporary entries left unattached by the 1.0.10 block-checkout gap, and the download endpoint self-heals them the same way.
## 1.0.9 — Review round 5
* Customer uploads are now protected: the upload directory denies all direct access (Apache `.htaccess`, upgraded automatically on existing installs), and files are served only through an authorization-checked download endpoint — the customer who owns the order (or its order key), store staff, or the shopper's own session for cart files. An Nginx server block snippet is documented in `INSTALLATION.md`.
* Calculated fees can no longer overflow to INF or NaN, or grow into amounts WooCommerce cannot represent: percentage, quantity and per-character fees, quantity multiplication, aggregated fees and the final cart price are all checked — every amount must be finite and no more than $1 trillion (the maximum supported amount; a finite $1e307 fee is rejected just like INF). An extreme value fails cleanly at add-to-cart with an actionable error instead of storing an unsupported price.
* A failed formula recalculation no longer silently removes the fee: the cart line is flagged and checkout is blocked with a clear error telling the shopper to remove the item and add it again. This covers saved carts, quantity changes and catalog price changes after add-to-cart.
= 1.0.8 =
* Conditional-logic builder crash fixed: opening a field with saved rules no longer throws a JavaScript error (the faulty syncRules ran before the builder initialized — the rule list is now read from the DOM after the table is ready, and the Add Condition / Add Condition Group controls work after the fix).
* Base price is no longer frozen at add-to-cart: cart recalculation re-reads the current catalog price, so a price change after add-to-cart is honoured at checkout instead of throwing a stale-price validation error, and the shipping cost shown at checkout uses the same corrected line price.
* Non-finite configured prices are rejected: an imported price, minimum or maximum of 1e999 (or any non-finite value) fails validation with the exact field name, and a formula referencing a non-finite numeric result reports a clear pricing error instead of silently changing the price.
* A negative formula result is rejected at validation instead of clamping the unit price to $0.00.
* SVG, XML, XSL, SWF, XHT and HTA can never be whitelisted for customer uploads, closing the stored-XSS gap that a custom extension list could previously open.
* Import validation hardened: only CartTailor exports are accepted, malformed group entries are skipped with a warning instead of creating empty groups, and duplicate titles are detected in both create-new and update-existing modes.
* Option values are never reused: the builder now uses a monotonic per-field counter, so a freed value is never handed out again after a delete or an import.
* Documentation, license and readme corrections: the real GPL-2.0 license text ships in license.txt, the documentation version stamp is current, the readme install step names the correct plugin folder, and the promised-but-missing screenshots section is removed.
1.0.7 — Follow-ups to the round-4 fixes: option values are never reused after a delete (fresh opt_N past the highest in use); a formula referencing non-finite numeric text such as 1e999 now reports the specific finite-value error.
1.0.5 — WPBay review fixes (round 3): strict input-shape validation (arrays rejected for scalar controls, nested arrays rejected for choice arrays, numbers must be finite); one canonical text value for validation, pricing, storage, recalculation, checkout and order meta; documented builder settings (default, lengths, bounds, step) in both builder contexts; conditional visibility that keeps unavailable choices disabled through hide/show cycles (snapshot-based restore, correcting the 1.0.3/1.0.4 guards). 1.0.4 — corrected the 1.0.3 visibility guard to an attribute check. 1.0.3 — input-shape validation, canonical text value, builder settings, conditional-unavailable fix (see reviewer message for verification details).
Version 1.0.2
Version 1.0.2 — fixes for all 6 round-2 review points: builder XSS (DOM-assigned values, no interpolation), product-tab independent builder instance, duplicate/import fresh field IDs with formula remapping, checkbox scalar-shape rejection + unique-count limits, upload writability probe + failure cleanup, display positions restricted to in-form hooks. Demo: https://tivorenza.com/carttailor/
Version 1.0.1
Version 1.0.1 — fixes for all 5 review points: (1) Option groups now use a dedicated capability type (spo_group) granted only to administrators and shop managers — Authors/Contributors can no longer create, publish, modify or duplicate groups, including via direct admin requests; group saves and duplication enforce the same per-post capability. (2) File uploads now enforce content/MIME matching — a file whose content does not match its extension (e.g. text renamed to .jpg) is rejected at add-to-cart validation and again before the file is moved, so no mismatched file is stored and a required-file purchase cannot go through incomplete. (3) Classic checkout now applies the same role-visibility guard as add-to-cart validation — a required field hidden by role no longer blocks checkout for shoppers outside that role, while eligible shoppers must still supply it. (4) Conditionally hidden checkbox fields are excluded from frontend min/max selection-limit validation and their stale error state is cleared when hidden. (5) Group-level role restrictions now survive export, import and duplication (export schema 1.0.1); files exported before 1.0.1 have no role restrictions, so importing one leaves the group visible to everyone. Also fixed: text swatch rows align on the top. All five fixes were live-verified on the demo site (https://tivorenza.com/carttailor/).
Version 1.0.0 — Initial release.
Only logged in customers who have purchased this product may leave a review.
Support by DigiLink
DigiLink supports this product through WPBay
Questions are handled in WPBay's private ticket system, keeping your purchase details and support conversation together.
After purchase, open this item in My Downloads and choose Get Support.
What support includes
- Answers to product-related questions
- Help with reported bugs and issues
- Guidance for included third-party assets
What support does not include
- Customizations or new features
- Installation or setup services
Maintenance snapshot
See recent updates, compatibility, support, and developer activity.
- Updated today
- Developer active recently
- WPBay support available
- WordPress 7.1 tested
Snapshot updated 8 hours ago
View details Hide details
Maintenance details
This is maintenance data. It does not measure product quality or sales.
- Last update Updated today
- Compatibility WordPress 7.1 tested · PHP 7.4 tested, several versions behind · WooCommerce 11 tested
- Releases 12 releases in the 17 days since listing
- Developer activity Developer active recently
- Support No recent support tickets to measure
- Docs and demo Documentation available · Changelog available · Demo available
Health reflects increased activity during the last 90 days.
How this snapshot works
Plugin Health
The score is out of 100 and uses data WPBay can check. Ratings, popularity, and sales are not used.
- Last update 30 points
-
Plugins receive full recency points under 30 days, then step down at 90, 180, 365, and 545 days.
- Compatibility 20 points
-
WordPress, PHP, and WooCommerce (when relevant) are scored separately. The latest two PHP lines count as current. Nearby previous versions keep most of the points.
- Current version 100%
- One version behind 75%
- Two versions behind 50%
- Three versions behind 25%
- Older or not listed 0%
- Releases 15 points
-
One release earns 10, two or three earn 13, and four or more earn 15. Each accepted product ZIP counts once; reprocessing the same upload and listing-only edits do not count.
- Developer activity 15 points
-
Based on WPBay login and dashboard activity. Exact last-login dates are never shown.
- Support 15 points
-
There are no recent WPBay tickets to measure.
- Docs and demo 5 points
-
Documentation: 2. Changelog: 1. Working demo or preview: 2.
Score ranges
- 90–100 Excellent
- 75–89 Healthy
- 60–74 Fair
- 40–59 Needs attention
- 0–39 Limited
Long gaps
WPBay also checks for long gaps between updates, developer activity, support replies, and releases. Buyers do not see this score.
- Time since update 35 points
- Last developer activity 25 points
- WordPress compatibility 15 points
- Support replies 15 points
- Fewer releases 10 points
More by DigiLink
Explore more bestselling products from this creator.

Reviews
There are no reviews yet.