Add Product to Cart Programmatically
Usually when I work with any WordPress or WooCommerce projects, if I face with something new during the development process, I usually try to share what I learnt immediately on my blog, here. But not always I did that. In 2014 I began my work with the awesome and super complicated project with WooCommerce, WooCommerce Memberships and WooCommerce Subscriptions. Let me share with you a piece of that work.
In this tutorial I am going to show you a different ways of adding a product to WooCommerce cart via code.
And by the way, if you were looking how to add product to an order, you need a completely different tutorial β here it is.
Add Product to the Cart
Let’s begin with something simple, as always. First of all let me show you how to add a product with a specific ID to the cart.
Please keep in mind that if this specific product item is already in the cart, its quantity will be increased by 1.
WC()->cart->add_to_cart( $product_id ); // you can also pass a number here
You can also do it another way with global variable $woocommerce
:
global $woocommerce;
$woocommerce->cart->add_to_cart( $product_id );
To keep the things simple I am going to use the first one during this whole tutorial. But you can use any way you like the most.
Add Product to Cart with Custom Quantity
I hope you’re not expecting something tricky here, all we have to do is to add one more parameter to the function which is going to present the quantity of a product added to the cart.
Nothing tricky here as well, all we have to do is to add one more parameter to the method what allows to set product quantity programmatically.
WC()->cart->add_to_cart( $product_id, $quantity );
Okay, let’s suppose that we want to add five products with ID 500. How our code is going to look like?
Here is how:
WC()->cart->add_to_cart( 500, 5 );
Add Product Variation to Cart Programmatically
If you want to add a product variation to the cart, you have to know not only a product ID but also a product vaiation ID. Both of them should be passed to add_to_cart()
method.
Example:
WC()->cart->add_to_cart( $product_id, $quantity, $variation_id );
Add Product to Cart with Custom Price
One of the ways of doing that is in two steps. First of all we need to pass a custom price of a product as cart item data in WC()->cart->add_to_cart()
method. Like this.
WC()->cart->add_to_cart( 14, 1, 0, array(), array( 'misha_custom_price' => 1000 ) );
Once you did that, fire woocommerce_before_calculate_totals
action hook and refresh a new custom price there.
add_action( 'woocommerce_before_calculate_totals', 'rudr_custom_price_refresh' );
function rudr_custom_price_refresh( $cart_object ) {
foreach ( $cart_object->get_cart() as $item ) {
if( array_key_exists( 'misha_custom_price', $item ) ) {
$item[ 'data' ]->set_price( $item[ 'misha_custom_price' ] );
}
}
}
A little bit more about overriding product prices in the cart.
How to Check if a Specific Product is Already in the Cart?
As you probably remember, I already mentioned, that if we are using add_to_cart()
method for the same product twice, the product quantity in the cart will be increased.
But what if we do not want to increase the product quantity?
The most logical way seems to check if a certain product is already in the cart before using add_to_cart()
. Ok, let’s do it! I am going to use method find_product_in_cart()
.
if( WC()->cart->find_product_in_cart( $product_cart_id ) ){
}
Here we must have an understanding of a difference between $product_id
and $product_cart_id
. When a certain product is in the cart it also has an ID which represents it in the cart. And this ID is different from its product ID. How to get the product cart ID? With generate_cart_id()
method of course. Let me just show you the ready to use code!
$product_id = 55;
$product_cart_id = WC()->cart->generate_cart_id( $product_id );
if( ! WC()->cart->find_product_in_cart( $product_cart_id ) ){
// Yep, the product with ID 55 is NOT in the cart, let's add it then!
WC()->cart->add_to_cart( $product_id );
}
Not so difficult, right?
There is also another option β to empty the cart every time before using add_to_cart()
. Like this:
WC()->cart->empty_cart();
WC()->cart->add_to_cart( $product_id );
In some cases in could be a better decision.
Automatically Add a Product to the Cart on a Custom Page
The idea is to add a specific product to customer’s cart when he/she visits a certain page on your website. It can be easily achieved inside template_redirect
action hook.
add_action( 'template_redirect', 'misha_add_to_cart_on_custom_page');
function misha_add_to_cart_on_custom_page(){
if( is_page( 'my-page' ) ) { // "my-page" is a page slug
WC()->cart->add_to_cart( 72 ); // add to cart product with ID 72
}
}
- This code will work out not only on
template_redirect
action hook, but I recommend to use it. - On line 5 we used a conditional tag
is_page()
, it accepts not only a page slug, but also a page ID, or an array of IDs / slugs - There are also many other conditional tags like
is_front_page()
,is_category()
,is_search()
etc, you can read more about them in official WordPress Codex here.
Add to Cart and then Redirect to Checkout
I have a kind of similar tutorial where I describe how to automatically send users to checkout when a product has been added to the cart. But now we add products to the cart in code and the methods described there doesn’t apply for this case.
Let’s just modify our previous piece of code slightly.
add_action( 'template_redirect', 'misha_add_to_cart_on_custom_page_and_redirect');
function misha_add_to_cart_on_custom_page_and_redirect(){
if( is_page( 'my-page' ) ) { // you can also pass a page ID instead of a slug
WC()->cart->add_to_cart( 72 ); // add to cart product with ID 72
wp_safe_redirect( wc_get_checkout_url() );
exit();
}
}
- If you want to redirect to external domain, use
wp_redirect()
instead ofwp_safe_redirect()
or extend the list of safe domains withallowed_redirect_hosts
filter.
Add Items to Cart using JavaScript (AJAX)
The last but not least, I wanted to show you how do the similar things in JS. Sometimes you may need it.
In order to use the function below, add-to-cart.min.js
should be enqueued to the page you are going to use the code on. We will definitely check it inside the function as well, but I think it is worth mentioning so when nothing is working you will know why.
You could also notice jQuery. Stop hate please! WooCommerce uses it anyway, so there is no point to remove it at all.
function rudrAddToCart( product_id, quantity = 1 ) {
// let's check is add-to-cart.min.js is enqueued and parameters are presented
if ( 'undefined' === typeof wc_add_to_cart_params ) {
return false;
}
jQuery.post(
wc_add_to_cart_params.wc_ajax_url.toString().replace( '%%endpoint%%', 'add_to_cart' ),
{
product_id: product_id,
quantity: quantity, // quantity is hardcoced her
},
function( response ) {
if ( ! response ) {
return;
}
// redirect is optional and it depends on what is set in WooCommerce configuration
if ( response.error && response.product_url ) {
window.location = response.product_url;
return;
}
if ( 'yes' === wc_add_to_cart_params.cart_redirect_after_add ) {
window.location = wc_add_to_cart_params.cart_url;
return;
}
// refresh cart fragments etc
jQuery( document.body ).trigger( 'added_to_cart', [ response.fragments, response.cart_hash ] );
}
);
}
That’s it. Now you can use this function anywhere in JavaScript rudrAddToCart( 500, 1 );
If you’re interested in a kind of tutorial on how to get number of items in the cart, here it is.

Misha Rudrastyh
Hey guys and welcome to my website. For more than 10 years I've been doing my best to share with you some superb WordPress guides and tips for free.
Need some developer help? Contact me
Hi Misha,
Thank you for this article.
I have a WoocCommerce shopping that my product gets from another site API.
Is there a way to add an item to my cart without being on the Woocommers product list?
Hi,
Yes, you can still use
WC()->cart->add_to_cart( $product_id )
WC()->cart->add_to_cart
function accept only product ID. I want to add a product that not exists in Woocommerce Product List for example:In this case you have to create that product first, I hope this guide will help you.
What if I want to automatically add an item to cart, if an item with a specific variation is added to cart?
You can try this:
Hi Misha, you saved my day ))
There’s a few similar questions on stackoverflow, but none answered.
wc_get_product_variation_attributes( $variation_id ) worked just as needed.
Hi Mondo,
You’re always welcome! ππΌπ
Thanks!
As always, great woocommerce tips, thank you Misha!
Always welcome! ;)
Really helped me.
Thanks!!
Thank you for the clarifications.
I have one question though. How does the cart get attached to a user?
Where is the notion of the cart belonging to some customer in the examples above? I find it very odd to fill a cart in such an “anonymous” matter.
How does WC “know” which cart belongs to which user?
Thx
One word β sessions
How to add attributes to the product? Code:
WC()->cart->add_to_cart($pid, 1, 0, array( 'attribute_pa_color': 'red' ), null)
Don’t work for me :(
Please, check this part.
The problem is, that this product don’t have variants, only attributes – so the variant ID is 0, and with that, I can’t pass attributes into cart (I can display them in cart by custom code in functions.php, but can’t send them to cart by add_to_cart()).
Hello Misha! One question, do you have an example of this code but that also adds custom fields?
Hey Maria,
Probably it could help.
Thank you Misha, this is very useful and help me a lot!
Thank you so much! I was trying to figure out how to add a product to the cart using JS, and this worked out of the box! Much appreciated
Isnt `global $woocommerce;` deprecated since WooCommerce 2.1+ ?
Not sure about that, do you have a link mentioning it?