{"id":390796,"date":"2026-10-26T08:40:52","date_gmt":"2026-10-26T08:40:52","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/wpmelon-advanced-product-options-for-woocommerce\/"},"modified":"2026-10-26T08:40:27","modified_gmt":"2026-10-26T08:40:27","slug":"wpmelon-product-customization-fields","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/wpmelon-product-customization-fields\/","author":23444308,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.1.3","requires":"6.5","requires_php":"8.0","requires_plugins":null,"header_name":"WPMelon Product Customization Fields for WooCommerce","header_author":"WPMelon","header_description":"Add option fields to WooCommerce products (text, select, swatches, uploads and more), with per-option pricing that flows through cart, checkout, orders and emails.","assets_banners_color":"f8f7f6","last_updated":"2026-10-26 08:40:27","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wpmelon.com\/product-options\/","header_author_uri":"https:\/\/wpmelon.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":49,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"wpmelon","date":"2026-10-26 08:40:27","revision":3765857}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3765857,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3765857,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3765857,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3765857,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3765857,"resolution":"1","location":"assets","locale":"","width":1100,"height":1180},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3765857,"resolution":"2","location":"assets","locale":"","width":417,"height":1078},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3765857,"resolution":"3","location":"assets","locale":"","width":618,"height":1298},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3765857,"resolution":"4","location":"assets","locale":"","width":1180,"height":326},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3765857,"resolution":"5","location":"assets","locale":"","width":780,"height":568}},"screenshots":{"1":"The option group editor: fields, prices and conditional logic.","2":"Options on a product page with the live total (Storefront theme).","3":"The same options in a block theme (Twenty Twenty-Five).","4":"The selected options and their prices in the block cart.","5":"An order in the admin, with the options and the customer's uploaded file."}},"plugin_section":[],"plugin_tags":[2010,149840,155785,18781,286],"plugin_category":[45],"plugin_contributors":[255349],"plugin_business_model":[],"class_list":["post-390796","plugin","type-plugin","status-publish","hentry","plugin_tags-custom-fields","plugin_tags-product-addons","plugin_tags-product-options","plugin_tags-swatches","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-wpmelon","plugin_committers-wpmelon"],"banners":{"banner":"https:\/\/ps.w.org\/wpmelon-product-customization-fields\/assets\/banner-772x250.png?rev=3765857","banner_2x":"https:\/\/ps.w.org\/wpmelon-product-customization-fields\/assets\/banner-1544x500.png?rev=3765857","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/wpmelon-product-customization-fields\/assets\/icon-128x128.png?rev=3765857","icon_2x":"https:\/\/ps.w.org\/wpmelon-product-customization-fields\/assets\/icon-256x256.png?rev=3765857","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/wpmelon-product-customization-fields\/assets\/screenshot-1.png?rev=3765857","caption":"The option group editor: fields, prices and conditional logic."},{"src":"https:\/\/ps.w.org\/wpmelon-product-customization-fields\/assets\/screenshot-2.png?rev=3765857","caption":"Options on a product page with the live total (Storefront theme)."},{"src":"https:\/\/ps.w.org\/wpmelon-product-customization-fields\/assets\/screenshot-3.png?rev=3765857","caption":"The same options in a block theme (Twenty Twenty-Five)."},{"src":"https:\/\/ps.w.org\/wpmelon-product-customization-fields\/assets\/screenshot-4.png?rev=3765857","caption":"The selected options and their prices in the block cart."},{"src":"https:\/\/ps.w.org\/wpmelon-product-customization-fields\/assets\/screenshot-5.png?rev=3765857","caption":"An order in the admin, with the options and the customer's uploaded file."}],"raw_content":"<!--section=description-->\n<p>WPMelon Product Customization Fields lets you add extra fields to your WooCommerce products. Shoppers fill them in on the product page, each choice can change the price, and everything they picked shows up in the cart, checkout, order, emails and My Account.<\/p>\n\n<p>Included in the free version: file uploads, color and label swatches, prices per option, one-time fees, conditional logic with several rules and number comparisons, WPML and Polylang support, and full support for the block cart and checkout. On the product page it loads one small script (about 4 KB gzipped, no jQuery), and only on products that have options.<\/p>\n\n<p><strong>Field types<\/strong><\/p>\n\n<ul>\n<li>Text and textarea<\/li>\n<li>Email, URL and phone, checked when the product is added to the cart and shown as plain text (never as links) in the cart, orders and emails<\/li>\n<li>Number<\/li>\n<li>Select, radio buttons and checkboxes<\/li>\n<li>Color swatches and label swatches<\/li>\n<li>Date and time (earliest and latest date or time per field; times also take a step in minutes, and a window can run past midnight)<\/li>\n<li>File upload (allowed types and size per field; files are kept private and only shop managers can download them)<\/li>\n<li>Headings and paragraphs to organize longer forms (they can be shown or hidden by conditions too)<\/li>\n<\/ul>\n\n<p><strong>Pricing per option<\/strong><\/p>\n\n<ul>\n<li>No price, a flat amount, or a percentage of the product price<\/li>\n<li>Charge each price per item, or once per cart line as a one-time fee (set-up fees, engraving plates): the fee shows on its own row in the cart and at checkout and does not change with the quantity<\/li>\n<li>Percentages follow the selected variation's price<\/li>\n<li>Option prices include tax the same way your product prices do, and work with quantities and coupons<\/li>\n<\/ul>\n\n<p><strong>Conditional logic<\/strong><\/p>\n\n<p>Show or hide a field depending on the fields above it. Combine several rules and choose whether all or any of them must match; each rule checks whether a field is, is not, is empty or is not empty. Number fields can also be compared: greater than, less than, at least or at most a number (decimals allowed), for example \"show Bulk engraving when Names is at least 10\". Hidden fields are ignored when the order is placed.<\/p>\n\n<p><strong>Where options appear<\/strong><\/p>\n\n<p>Create option groups once and assign them to every product, to products in chosen categories or tags (with exclusions), or attach a group on a single product's edit screen. Works with simple and variable products, classic themes and block themes, and the classic and block cart and checkout.<\/p>\n\n<p><strong>Multilingual stores<\/strong><\/p>\n\n<p>Works with WPML and Polylang. Field labels, descriptions, placeholders, choice labels, headings and paragraphs are registered for translation, and a group assigned to a product, category or tag also applies to their translations.<\/p>\n\n<p><strong>Privacy<\/strong><\/p>\n\n<p>The plugin makes no external requests and collects no usage data.<\/p>\n\n<p><strong>Source code<\/strong><\/p>\n\n<p>The compiled JavaScript and CSS in <code>assets\/dist\/<\/code> are built from the TypeScript and CSS sources in <code>assets\/src\/<\/code>, which ship with the plugin together with the build configuration. To rebuild them, run <code>npm ci &amp;&amp; npm run build:free<\/code> in the plugin folder (Node.js 20.19 or later).<\/p>\n\n<p><strong>Known limitations<\/strong><\/p>\n\n<ul>\n<li>With currency switchers or other price filters, the product page shows option prices before conversion; cart, checkout and orders show converted amounts.<\/li>\n<li>One-time fees are converted with the same factor the price filter applies to the product. A currency switcher that also converts cart fees itself would convert them twice.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate WooCommerce.<\/li>\n<li>Install and activate WPMelon Product Customization Fields for WooCommerce.<\/li>\n<li>Go to Products \u2192 Product Options and create your first option group.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20it%20work%20with%20the%20block%20cart%20and%20checkout%3F\"><h3>Does it work with the block cart and checkout?<\/h3><\/dt>\n<dd><p>Yes. Selected options and their prices show in the classic and block cart and checkout.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20variable%20products%3F\"><h3>Does it work with variable products?<\/h3><\/dt>\n<dd><p>Yes. Percentage prices follow the price of the selected variation.<\/p><\/dd>\n<dt id=\"how%20do%20one-time%20fees%20work%3F\"><h3>How do one-time fees work?<\/h3><\/dt>\n<dd><p>Set an option's charge to \"Once per line\" and its price is added once for each cart line, whatever the quantity, as a cart fee named after the product and the option. A percentage is a percentage of one unit's price. The fee uses the product's tax status and tax class. The same product added twice with different choices is two cart lines, so it pays the fee twice.<\/p><\/dd>\n<dt id=\"do%20coupons%20discount%20one-time%20fees%3F\"><h3>Do coupons discount one-time fees?<\/h3><\/dt>\n<dd><p>No. WooCommerce coupons apply to product prices, not to fees, so one-time fees are charged in full. Options charged per item are part of the product price and are discounted as usual.<\/p><\/dd>\n<dt id=\"why%20don%27t%20apple%20pay%2C%20google%20pay%20or%20paypal%20buttons%20show%20on%20some%20product%20pages%3F\"><h3>Why don't Apple Pay, Google Pay or PayPal buttons show on some product pages?<\/h3><\/dt>\n<dd><p>Express-pay buttons on a product page buy the product directly, without the option fields, so the shopper's choices would be lost. The plugin hides them on the product pages of products that have options (WooCommerce Stripe Gateway, WooPayments and WooCommerce PayPal Payments). They still show in the cart and at checkout, where the options are already in the cart.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20wpml%20or%20polylang%3F\"><h3>Does it work with WPML or Polylang?<\/h3><\/dt>\n<dd><p>Yes. Every text shoppers see in an option group (field labels, descriptions, placeholders, choice labels, headings and paragraphs) is registered for translation in the \"WPMelon Product Customization Fields\" group: with WPML under WPML \u2192 String Translation (WPML String Translation must be active), with Polylang under Languages \u2192 Translations. The option group editor always shows and edits the original texts. Shoppers see the translations on the product page, in the cart and at checkout, and the options are saved on the order in the language the order was placed in. A group assigned to a product, category or tag also applies to their translations, and a group attached to one translation of a product applies to all of them. Polylang translates by text, so two fields with the same label share one translation. With WPML and the block checkout, choose directories or a domain per language under WPML \u2192 Languages \u2192 Language URL format: when the language is a URL parameter (?lang=), the checkout runs in the default language and the whole order, options included, is saved in that language. Option prices are not converted per currency; see \"Known limitations\" for currency switchers.<\/p><\/dd>\n<dt id=\"where%20are%20uploaded%20files%20stored%3F\"><h3>Where are uploaded files stored?<\/h3><\/dt>\n<dd><p>In a private folder inside your uploads directory, under random file names. Customers see only the file name; shop managers download files from the order screen.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20my%20option%20groups%20if%20i%20delete%20the%20plugin%3F\"><h3>What happens to my option groups if I delete the plugin?<\/h3><\/dt>\n<dd><p>They stay, unless you turn on \"Remove all data when the plugin is deleted\" under Products \u2192 Product Options \u2192 Settings. With it on, deleting the plugin removes the option groups, the groups attached to products and the files customers uploaded. Options already saved on orders always stay on the orders, and deactivating the plugin never deletes anything.<\/p><\/dd>\n<dt id=\"is%20customer%20text%20safe%20to%20print%20in%20my%20own%20code%3F\"><h3>Is customer text safe to print in my own code?<\/h3><\/dt>\n<dd><p>Text and textarea values are kept as the customer typed them, except HTML tags are removed (and no \"&lt;\" that could start a tag is kept). They are plain text, not HTML: escape them for the context you print them in (<code>esc_html()<\/code>, <code>esc_attr()<\/code>), as WooCommerce and this plugin do.<\/p><\/dd>\n<dt id=\"my%20store%20is%20behind%20cloudflare%20or%20another%20proxy.%20do%20uploads%20still%20work%3F\"><h3>My store is behind Cloudflare or another proxy. Do uploads still work?<\/h3><\/dt>\n<dd><p>Yes, but upload limits count per visitor IP address, and behind a proxy every visitor arrives from the proxy's address. Return the real visitor IP from the <code>wpm_pcf_upload_client_ip<\/code> filter, read from the header your proxy sets (for example <code>CF-Connecting-IP<\/code>). Without it, all visitors share one limit of 20 uploads per 10 minutes. The <code>wpm_pcf_upload_rate_limit<\/code>, <code>wpm_pcf_pending_max_files<\/code> (default 500) and <code>wpm_pcf_pending_max_bytes<\/code> (default 1 GB) filters change the limits.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First release.<\/li>\n<\/ul>","raw_excerpt":"Add option fields to WooCommerce products: text, select, swatches, dates, file uploads and more, each with its own price.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/390796","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=390796"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/wpmelon"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=390796"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=390796"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=390796"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=390796"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=390796"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=390796"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}