9 min read
How to Customize Your WooCommerce Store for Unique Products
WooCommerce out of the box assumes you sell a simple physical item with a price, a photo and a stock count. If what you actually sell is made to order, sold by the metre, bundled from parts, delivered as a service, or previewed before purchase, the default product page works against you. The good news is that almost every one of those cases can be handled with a built-in product type, a small amount of configuration, or a targeted extension, without rebuilding the store.
This guide goes through the customisations we make most often for stores with unusual catalogues, in rough order of effort: product types and attributes first, then the product page template, then pricing logic, then the extensions and code that cover the rest. Everything refers to WooCommerce 10.x and 11.0 on WordPress 7.0, which is what most stores are running in August 2026.
Pick the right product type before you customise anything

A lot of “my products don’t fit WooCommerce” problems are really “I used a Simple product for something that is not simple”. The product type selector in Products → Add New → Product data gives you four types, and the choice determines what the page can do.
| Product type | Use it for | Watch out for |
|---|---|---|
| Simple | One SKU, one price. Add the Virtual and Downloadable checkboxes for files and services. | No options. If you need “choose a size”, stop here. |
| Variable | Options that change price, stock or SKU (size, colour, licence tier, duration). | Each combination is its own variation; 4 attributes with 5 values each is 625 variations. Cap at around 50. |
| Grouped | A parent that lists child products bought separately (a kit where parts are optional). | Parent has no price of its own; poor for bundles sold at a set price. |
| External/Affiliate | Listings that buy elsewhere. | No cart, no checkout. |
One note on tooling. The block-based product editor beta that WooCommerce experimented with from 2023 has been removed: 10.9 (June 2026) added deprecation notices and 11.0 (July 2026) dropped it from core. The classic product editor is the only one now, so any tutorial showing the block-based form is out of date. Product data is unchanged either way.
Attributes and variations done properly
Create attributes globally at Products → Attributes rather than per product. Global attributes power layered navigation filters, show up in the Product Filters blocks, and can be reused across the catalogue. Per-product attributes cannot. For a made-to-measure curtain store we set up Width, Drop and Lining as global attributes, then used “Any Width” variations with a price-per-unit add-on, which avoided thousands of variations.
If your options do not change price or stock (engraving text, a gift message, a choice of finish that costs the same), they are not variations at all. Use an add-on field instead (see below).
Rebuild the product page layout without code
On a block theme, the single product page is a template you edit at Appearance → Editor → Templates → Single Product. Every element (gallery, title, price, short description, add to cart, tabs, related products) is a block you can reorder, restyle or remove. For niche products the changes that earn their keep are:
- Move the short description above the price when the buyer needs context before seeing a number (bespoke work, services, high-ticket items).
- Replace the tabs with stacked sections. Tabs hide specifications; a long product with “Materials”, “Dimensions” and “Care” as plain headings reads better and is indexed better.
- Add a Product Details or spec table using the Product Attributes block (or a Block Bindings paragraph bound to post meta) so technical data is structured rather than buried in the description.
- Create a second Single Product template for one category. In the Site Editor choose Add New Template → Single item: Product and pick a category or specific product. A “Services” category can get a consultation-style layout while physical goods keep the default.
On a classic theme, the same work means overriding templates in your-theme/woocommerce/single-product/ or, more safely, moving hooks. This removes the default tabs and prints the attributes table directly under the summary:
add_filter( 'woocommerce_product_tabs', '__return_empty_array', 98 );
add_action( 'woocommerce_single_product_summary', function () {
global $product;
if ( $product->has_attributes() ) {
wc_display_product_attributes( $product );
}
}, 35 );
Priorities on woocommerce_single_product_summary are the map of the page: title 5, rating 10, price 10, excerpt 20, add to cart 30, meta 40, sharing 50. Slot your additions between them.
Let buyers preview before they pay
For audio, documents, courses and anything else where the product is information, the gallery image is the wrong preview. A 30-second sample or a first-page preview converts far better than a cover thumbnail, and WooCommerce has no native way to do it.
Our free Audio Preview for WooCommerce adds a player to the product page and shop loop for any downloadable audio product, with a configurable clip length so the full file is never exposed. Document Preview for WooCommerce does the same for PDFs and office files, showing a page range in an embedded viewer. Both work with the classic and block product templates. For video courses sold through WooCommerce, a protected player such as MediaShield handles the trailer and the post-purchase content from the same library.
Pricing that is not “one number”
Per-unit and measurement pricing
Fabric by the metre, flooring by the square metre, rope by the length: WooCommerce cannot do this natively. The Measurement Price Calculator extension on WooCommerce.com lets the customer enter dimensions and calculates price and stock in the base unit. If the maths is simple (price × quantity in a unit), a cheaper route is a Simple product priced per unit with the quantity input relabelled:
add_filter( 'woocommerce_quantity_input_args', function ( $args, $product ) {
if ( has_term( 'by-the-metre', 'product_cat', $product->get_id() ) ) {
$args['min_value'] = 0.5;
$args['step'] = 0.5;
}
return $args;
}, 10, 2 );
Fractional quantities also need woocommerce_stock_amount filtered to floatval so stock is not rounded.
Customer-supplied options and add-ons
For engraving, gift wrap, upload-your-artwork or “add a frame for £20”, use an add-on plugin rather than variations. WooCommerce Product Add-Ons (official, $79 a year at the time of writing) covers text fields, checkboxes, file uploads and flat or percentage surcharges. Free alternatives such as Advanced Product Fields for WooCommerce exist and are fine for a handful of fields. Add-on data is stored as order item meta, which means it appears on the order screen, the packing slip and the customer email without extra work.
Quotes instead of prices
When the product cannot have a price until you know the spec (custom fabrication, bulk orders, commissioned work), hiding the price and adding a quote request is the right move. Woo Product Inquiry and Quote replaces the add-to-cart button with an enquiry form on selected products or categories, and the Pro version adds volume quote bands. We wrote up the decision process in more detail in our piece on B2B quote and RFQ flows for WooCommerce.
Selling services and bookings as products

A consultation, a design package or a monthly retainer is a product with a workflow attached: the buyer pays, then someone has to deliver, ask questions, send files and close the job. A Virtual Simple product handles the payment but nothing after it.
Woo Sell Services adds the delivery side: a requirements form the buyer fills in after checkout, a conversation thread per order, file exchange, delivery and completion states, and a seller dashboard that also works with multi-vendor setups like Dokan and WCFM. For time-slot bookings, the official WooCommerce Bookings extension or Amelia is the better fit. Do not try to model bookings with variations; the calendar logic is the hard part and it is not in core.
Custom fields and data on the product
Niche products often carry data that has no home in the default form: ABV for drinks, ISBN for books, energy rating for appliances, dimensions for art. Two approaches:
- Register product meta with
register_post_meta( 'product', 'isbn', array( 'show_in_rest' => true, 'single' => true, 'type' => 'string' ) )and add a field to the Inventory or Advanced tab viawoocommerce_product_options_inventory_product_datausingwoocommerce_wp_text_input(). Save onwoocommerce_process_product_meta. Output it on the page with a Block Bindings paragraph or a small hook. - Use global attributes when the value should be filterable in the shop. ISBN is meta; “Region” or “Grape” for a wine store are attributes.
Either way, sanitise on save (sanitize_text_field, absint) and escape on output (esc_html). Product meta is editable by anyone with the edit_products capability, which on a multi-vendor store means vendors.
Theme choice and the shop archive
A good theme for a niche catalogue does three things: it lets you change the archive card (what shows in the grid), it supports the product filter blocks, and it does not fight the Site Editor. Block themes built for WooCommerce (Twenty Twenty-Five with Woo’s patterns, or a purpose-built store theme) give you the Product Collection block, which can show different cards per category and per page. For a store with a community or marketplace angle, our Reign theme ships WooCommerce layouts plus vendor and member profiles, which matters when sellers are part of the product.
Two archive tweaks that help unusual products: change the number of columns per category (a jewellery grid wants 4, a large-format art grid wants 2) and show a key attribute in the card, such as “Edition of 50” or “Ships in 3 weeks”, so buyers qualify themselves before clicking through.
Frequently asked questions
Should I use a page builder for product pages?
We would not start a new store that way. The Site Editor’s Single Product template does the layout work, the page stays portable, and you avoid a second rendering engine on every product page. Builders still make sense for landing pages that feed the store.
How many variations is too many?
WooCommerce loads variation data as JSON on the page up to 30 variations (the woocommerce_ajax_variation_threshold filter), and switches to AJAX lookups above that. Beyond a couple of hundred the admin screen and imports become painful. If you are there, the attribute that does not change price belongs in an add-on, not a variation.
Will custom product code break on WooCommerce updates?
Hooks and filters are stable; template overrides are the fragile part. If you override templates, keep the version header current and check WooCommerce → Status → Templates after each update for “out of date” warnings.
Where does WooCommerce document all of this?
The official developer docs at developer.woocommerce.com cover product types, hooks and the block templates, and the Managing Products guide on WooCommerce.com covers the admin side.
What we’d do

Start by auditing the catalogue and sorting each product into a type: simple, variable, per-unit, add-on, quote, service, preview. Fix the type mismatches first, because they cause most of the friction. Then edit the Single Product template once, make a category-specific template if one group of products is genuinely different, and only after that reach for extensions. Most stores need one or two, not six. If the catalogue needs something none of this covers, a custom product type or a bespoke add-on is a few days of work for a WooCommerce developer, and it is usually cheaper than living with a workaround.
Related reading