If you have a complex WooCommerce product with many different options, it may be a good idea to split those options in a multi-step form. This tutorial will show how to achieve multi-step product options in your WooCommerce store.
What we’re building

We’ll create product options, split into multiple steps. A progress bar indicates how far the user is in the process before being able to add the product to their cart.
What you’ll need
- A store with WooCommerce (5.0 or higher) installed and configured. We assume this is already done on your end but just in case it’s not, you can read this article to get started with WooCommerce.
- Our Advanced Product Fields for WooCommerce plugin. This plugin is capable of adding options to your product and creating the multi-step product form
Let’s get started!
1. Configure the options on your product
If you have our plugin up & running, edit your WooCommerce product and find the Custom fields
section under Product Data
:

Here, you can add all options that belong to your product. The important part is to wrap your options in different sections. Each section will represent one step on your product page.
You can add sections by clicking New Field
and then choosing Section
and Section End
as field types. Adding fields to a section is as simple as dragging them between the Section
and Section End
fields.
Make sure to add a class name to each section, called “step”. You can do that in the section field settings:

Below is an example of 2 sections each containing a few options:

In a later step, we’ll transform these sections into steps with CSS.
2. Add progress bar & buttons
Next, we need to add some HTML to display a progress bar and buttons to navigate between the steps. That’s done by adding the code below to your site. Are you unsure how to add this code? Check out this article explaining two easy ways to add it to your site.
add_action('wapf_before_wrapper', 'wapf_before_wrapper');
function wapf_before_wrapper($product) {
?>
<div class="wapf-progress">
<div class="wapf-progress-bar"></div>
<div class="wapf-progress-steps"></div>
</div>
<?php
}
add_action('wapf_before_product_totals', 'wapf_before_product_totals');
function wapf_before_product_totals($product) {
?>
<div class="wapf_step_buttons">
<button class="button wapf_btn_prev" style="display:none"><?php _e('Previous','sw-wapf'); ?></button>
<button class="button wapf_btn_next"><?php _e('Next','sw-wapf'); ?></button>
</div>
<?php
}
Code language: JavaScript (javascript)
Note this code will add a progress bar & buttons to all your products. If you’d like to limit the products that require a multi-step form, you can use this code instead:
add_action('wapf_before_wrapper', 'wapf_before_wrapper');
function wapf_before_wrapper($product) {
$product_ids = array(123,987,630);
if( ! in_array($product->get_id(), $product_ids) ) return;
?>
<div class="wapf-progress">
<div class="wapf-progress-bar"></div>
<div class="wapf-progress-steps"></div>
</div>
<?php
}
add_action('wapf_before_product_totals', 'wapf_before_product_totals');
function wapf_before_product_totals($product) {
$product_ids = array(123,987,630);
if( ! in_array($product->get_id(), $product_ids) ) return;
?>
<div class="wapf_step_buttons">
<button class="button wapf_btn_prev" style="display:none"><?php _e('Previous','sw-wapf'); ?></button>
<button class="button wapf_btn_next"><?php _e('Next','sw-wapf'); ?></button>
</div>
<?php
}
Code language: HTML, XML (xml)
In the code above, note the two lines $product_ids = array(123,987,630);
. You should edit those lines to include the product ID’s you want the multi-step form working on.
3. Add styling
In this step, we’ll add CSS to style the progress bar, buttons, and sections. Add the CSS below to your theme via Appearance > Customize > Additional CSS
.
Please note the CSS may be a little different for your WordPress theme, but it should be pretty close. I’ve added some comments that may be useful to look at.
div.quantity, .woocommerce .button[name=add-to-cart] {
display:none; /*Hide Add to Cart button until last step*/
}
.wapf-wrapper {
border-radius: 4px;
border: 1px solid #ededed;
padding: 15px 20px;
margin-bottom:20px;
}
.wapf-field-group .step{
display:none;
}
.wapf-field-group .step:first-child{
display:flex;
}
.wapf_step_buttons {
margin-bottom:20px;
overflow:hidden;
}
.wapf_btn_next {
float:right !important;
}
.wapf-progress {
position:relative;
max-width:450px;
width:100%;
margin: 0 auto;
}
.wapf-progress:before, .wapf-progress-bar {
content:'';
position:absolute;
height:3px;
width:100%;
background:#ededed;
top:14px;
left:0;
}
.rtl .wapf-progress-bar{
right:0;
left:unset;
}
.wapf-progress-steps {
margin-bottom: 30px;
overflow: hidden;
counter-reset: step;
display: flex;
justify-content: space-between;
}
.wapf-progress-steps div {
position:relative;
}
.wapf-progress-steps div:before {
content: counter(step);
counter-increment: step;
width: 30px;
height:30px;
font-size:16px;
line-height:30px;
border-radius:50%;
text-align:center;
display: block;
font-size: 10px;
background: #ededed;
}
.wapf-progress-steps div.active:before {
background:#f0632b; /*The finished step color. Feel free to change*/
color:white;
}
.wapf-progress-bar {
background:#f0632b; /*The finished step color. Feel free to change*/
width:0%;
}
Code language: CSS (css)
Note this CSS will change the appearance for all product pages. If you want to limit the products that have a multi-step form, some of the CSS should be changed to only affect those products. This can easily be done if you know your product ID.
The below code only adds multi-step styling to a product with ID 123
. Note that you only need to change the first two styling blocks (as shown in the example below). All other CSS from the code above remains the same:
.postid-123 div.quantity, .postid-123.woocommerce .button[name=add-to-cart] {
display:none;
}
.postid-123 .wapf-wrapper {
border-radius: 4px;
border: 1px solid #ededed;
padding: 15px 20px;
margin-bottom:20px;
}
Code language: CSS (css)
As you can see, the CSS above contains an extra portion to every rule: .postid-123
where 123 is the ID of your product. If you need it for more than 1 product, you can do it like this:
.postid-123 .wapf-wrapper,.postid-345 .wapf-wrapper, .postid-678 .wapf-wrapper{ ... }
Code language: CSS (css)
4. Make things dynamic
By now, you’ll see the multi-step form is displayed nicely on your Woo product page. But it needs some Javascript logic to make things work. Add the following code to your theme (remember this article from earlier on how to do it):
add_action('wp_footer', 'wapf_steps_script', 1000);
function wapf_steps_script(){
?>
<script>
jQuery( function($) {
var steps = $('.wapf-section.step');
if(!steps.length) return;
var maxSteps = steps.length;
var $prev = $('.wapf_btn_prev');
var $next = $('.wapf_btn_next');
var $stepList = $('.wapf-progress-steps');
var $bar = $('.wapf-progress-bar');
var $cart = $('div.quantity,[name="add-to-cart"]');
var $progress = $('.wapf-progress');
var currentStep = 1;
for(var i = 1; i <= maxSteps; i++) {
var $div = $('<div>');
if(i === 1) $div.addClass('active');
$stepList.append($div);
}
var post = function(e) {
var visibleStepLi = $stepList.find('div:visible');
var idx = $stepList.find('div').index(visibleStepLi.eq(currentStep-1));
idx = Math.max(0,idx);
var max = visibleStepLi.length;
if(e) e.preventDefault();
steps.hide().removeClass('stepActive');
steps.eq(idx).css('display','flex').addClass('stepActive');
$stepList.find('div').removeClass('active').eq(idx).addClass('active').prevAll().addClass('active');
if(currentStep >= max) {
$cart.show();
} else $cart.hide();
$bar.css('width', (currentStep-1)*(100/(max-1))+'%');
$prev.hide();
$next.hide();
if(currentStep < max) $next.show();
if(currentStep > 1) $prev.show();
$(document).trigger('wapf_step', [currentStep, max] );
}
var isValid = function() {
var $inputs = steps.filter('.stepActive').find(':input');
for(var i = 0; i < $inputs.length; i++) {
if(!$inputs[i].checkValidity()) return false;
}
return true;
}
$prev.on('click', function(e) {
currentStep--;
post(e);
});
$next.on('click', function(e) {
var valid = isValid();
if(isValid()) {
currentStep++;
post(e);
}
});
$(document).on('wapf/dependencies', function(){
$stepList.find('div').removeClass('wapf-hide');
steps.each(function(i,s) {
var $s = $(s);
if($s.hasClass('wapf-hide')) $stepList.find('div:eq('+i+')').addClass('wapf-hide');
});
if($stepList.find('div:not(.wapf-hide)').length <= 1)
$progress.hide();
else $progress.show();
post();
});
// Block enter key to prevent jumping to another step on accident.
steps.find('input, select').keypress(function(event) { return event.key != 'Enter'; });
});
</script>
<?php
}
Code language: PHP (php)
The script will make sure the progress bar is updated correctly, and the “previous” and “next” buttons do show the correct section.
That’s it! Now you should have a working multi-step product options form on your WooCommerce store!
How do I add an automatic progress bar? I don’t want to click the next button. This will automatically take me to the next step.
Hi there,
That would require additional custom coding I’m afraid.
How to translate the Previous and Next buttons ?
Hi Philippe,
You can edit the code from step 2 to add your own wording. I have highlighted the words in this screenshot: https://i.snipboard.io/6Ct47s.jpg
Thanks Maarten !
Can i add a video of instruction on any step to guide users how to fill up fields for that particular step ?
Can i also show automated options after selecting specific height?
Hi there,
Our plugin allows you to add text/html to your products so you can link to a video with instruction. I’m not sure what you mean with your 2nd question.
We need to know if the plugin can work with conditional products. That is, if I choose option X it offers me a selection of products, if I choose option Y it offers me another selection.
Our plugin works with conditional fields, but not products. You can show/hide fields based on values of other fields. You can not show products based on field values.
Thanks for your quick response . We insist on the possibility of using this plugin.
However, we have the following question.
Can we associate costs to those fields? . So that they add to the final product.
Thanks in advance .
Yes, that is possible.
Hello, I want to show prices in the last step, except showing at the end of each step. Is that possible?
Not without additional custom coding, sorry!
Good morning, look at this
https://preprod-slagon.fr/mamy-eyewear/produit/product-example-2/
I have 4 steps on my form.
The last two choices of the first step Screen glasses and Non-prescription don’t need any configuration.
For these two choices the next steps are empty how to solve this problem sir ?
I would like to know how to skip empty steps.
Hi there,
This sounds like a technical request. Please use the support form here to get in touch with us so we have all the necessary information to help you out.
Thank you!
Hello i have a list of hundrends of products where i want the multistep to display and a list of hundrends of products where i dont want the multistep to display. Is there a way without hardcoding?
Yes, it’s possible by altering the code snippets. Send us a technical support request here and we’ll help you out.
Hello
With this plugin, i can add some custom fields on variations of products with variation on value?
Example:
Product 1> Variation 1> Insert 2 custom fields with diferent values
Product 2> Variation 1 and 2> Insert 3 custom fields, with one without any value
Hi there,
Yes, that’s possible :).
Hi!
Can I add conditions in multi-step product options?
Yes you can, but depending on how far you want to take it.
Hi,
I’ve tried this but not getting a result, does it only work with the pro version of the plugin?
Hi Dylan,
Yes, you’ll need our pro version for this.
Hi Maarten,
Ok, this works great now.
Is it possible to hide all the info above the step solution once you click next?
So we would essentially be hiding short description once you click next.
Regards,
Dylan
Hi Dylan,
I’m not sure what you mean by that as usually there wouldn’t be any fields above the steps? If I misunderstood, please contact us through our support page so we can help out there!
Hello,
Do you have an option to export all product fields for another website?
Thank you!
Hi Angela,
The plugin doesn’t have specific import/export settings yet (though it’s on our to-do list!). You can perform a database migration to copy fields from one site to another.
Is there a good way I can show a summary of what the user has chosen at the last step? How can I find these variables if I have to modify the code?
There’s currently no way of doing that but it is a much requested feature so it’s high on our to-do list :).
Hello, amazing plugin, just a query, how can I get this transition effect when I change steps, as this page shows that uses the same method.
https://preprod-slagon.fr/mamy-eyewear/produit/albert/
thank you.
Hi there!
That would require custom coding 🙂
Is there a way to change the way pricing is displayed from US standard to European standard, so . is 1,000 separator and not , ?
Yes, WooCommerce has settings for that. Go to WooCommerce > Settings > General > Currency Options to change the separators.
Is there a way to integrate it with Google maps API? I working at transport calculator and the cost depends from distance of two points.
Hi there,
Unfortunately, that’s not possible with our plugin, sorry!
Hi! Can I have this work on a group of products based on a tag so I can just add a tag to the products I want to use this step process?
I’m hoping to not have to keep editing the codes every time I add a new product.
Thank you for your help.
Oh! I can’t use the all products option. I do have many that are not in need of this step process. Thanks!
Hi there,
We’ll turn this into an addon plugin soon and then you’ll have more options to apply this to multiple products in one go :).
Hello, my customers often find themselves stuck on final step (not being able to click add to cart button). The issue seems to be [upload photo] field on previous step is not finished uploading or didn’t uploaded at all. Is there a way to restrict customer from clicking next button until they successfully uploaded? Similar to other input fields.
I hope there’s a fix for this as it’s costing a lot of potential customers.
Thank you and more power!
Hi there!
This sounds like a technical request so please contact our support department via the Technical Request form here.
Hi, thanks for the amazing tutorial. Is there a way I can use it without the progress bar? How can I hide it ? whenever I hide it with every step it shows back.
Thank You!
Hi Remi,
This sounds like a technical request for us to look into. Please send us a support request here.
Thanks!
Hi Maarten,
I’m just checking the multi-step form, and I just wondering if the variables that are asked for height and width can be used for a cost calculator. In my case, I just want a client to choose a cover for a swimming pool and height, width and length are a needed to create a cost. So I don’t know if your plugin can do this or we can add some another function to do this extra calculator.
Please let me know as I need to quote this for a job.
Thanks,
Hi Fernando,
Our plugin allows for formula-based pricing where you can create a cost based on fields filled out by your customers. So yes, this is possible :).
Hi!
We made the decision to purchase your plugin because of this neat tutorial, but we’re having issues. The initial HTML provided doesn’t display anything on our store page, and it seems like the very first function isn’t doing anything at all. We followed every step exactly without changing anything and used the Snippets plugin, but even copying & pasting the shortcode for that HTML snippet onto our store page doesn’t work. Instead it throws an error about there being an unexpected end bracket on line 12 but, as you can see when looking at the code you posted, there is no such bracket?
Hi Amber,
This sounds like a technical request. Can you contact us through our technical support form? That will send it to the correct people 🙂
Hello,
is it possible to include names and display it in the progress bar instead of numbers?
So instead of numbers it could be something like “1.Colour” “2. Size” etc.
And the other question is it possible to jump between sections for example when you are at 1 and want to watch number 3 without doing something in 1?
Thank you 🙂
P.S Your Plugin is great
Hi there!
This is currently not possible but we’re working on something that will be able to do both your questions 🙂
Hi, I’ve also bought your plugin. I need to know if there’s the possibility in the steps to transfor the add to cart button into a “Ask for information” button.
For example if I add a field “Choose color” and in the option I set “Red”, “Blue”, “Green” and “Custom”, if the user choose “Custom” the Add to cart button should become “Ask for information” so the user can’t be able to buy that product but I receive an email with the information that he chose.
Thank’s in advance
Hi there,
What you’re looking for is called a “Request a Quote” plugin. We integrate with the one from Yith. The problem is that you want want both states at the same time: sometimes “add to cart” and sometimes “ask for info”. Unfortunately, that’s not possible I’m afraid. Such plugins can only do it for a whole product, or not at all.
I have the “Pro” plugin. I am getting the following error with the last code snippet. “The snippet has been deactivated due to an error on line 4:
Cannot redeclare function wapf_steps_script.”
Hi there,
Please fill out our technical support form so we can help out better :).
Thanks!
Hi, My client wants to sell custom picture frames, user will select various static options and then enter width and height, Can I calculate a specific price based on the width and height using a formula? Do I need another plugin to do this?
i.e. 1cm = £1.00
width = 100cm
height = 50 cm
cost = 100+50x£1 = £150.00
Hi there,
Our plugin can do this :-). Even better, you can do that with the cheapest version of the plugin.
Hi there,
I have a website with this method and it is not working correctly. Can you please help how to fix it?
Hi there,
Can you open a technical support ticket here? Include a link to the product so we can check.
Thanks!
Is this plugin WPML compatible? And if so, can ‘Next’ and ‘previous’ be translated with WPML?
Yes and yes 🙂
Hello,
Can I ceate something like this: https://www.diyblinds.com.au/blinds/roller-blinds/order ?
Hi there,
In terms of options: yes. But of course it will not look exactly like the example you sent.
Is it possible to use product variations and attributes as fields?
No, that’s not possible, sorry.
How can you change the size of the thumbnails in the Multi-Select image swatches field? They show too big, I tried changing the size of the image itself but it scales them up and look low quality
Can you send us a technical support request here please? Thanks!
Hello, is it possible to automatically get to the top of the page when you click next step?
Yes, that would be possible by editing the code. If you contact us through our support form, we can help out!
Hello!
Can I create similar multi-step coffee subscription flow?
https://prestocoffee.com/pages/subscription-flow
Hi!
You can create the options and multi-step format with our plugin, yes! Of course, it won’t look exactly the same as the example you linked. It looks like you would also need WooCommerce Subscriptions.
Hi Maarten,
I’ve followed your steps to create the multi-step product options, however when I set conditional fields, the number of steps reduces as it should, but when you click on the ‘next’ button it shows an empty step.
What piece of code can I add so that when there is a conditional field, the next button skips correctly to the next field.
Thanks!
Hi there,
This sounds like a technical support request. Can you please create a ticket here?
Thank you!