WooCommerce gives you the flexibility to do almost anything. This includes creating a custom link to add several products to the cart.

Use cases of adding multiple products to url in WooCommerce

As a business owner you may want to give the customer the opportunity to add several products to the cart with just one link. Lets say your support team arranges a sale and instead navigating the customer to a product pages. Another example to use adding products to cart directly via URL is when you create a landing page for product or service and add the link to the CTA buttons, navigating the customers directly to cart/checkout.

PHP snippet: add multiple products to cart via link

function webroom_add_multiple_products_to_cart( $url = false ) {
	// Make sure WC is installed, and add-to-cart qauery arg exists, and contains at least one comma.
	if ( ! class_exists( 'WC_Form_Handler' ) || empty( $_REQUEST['add-to-cart'] ) || false === strpos( $_REQUEST['add-to-cart'], ',' ) ) {

	// Remove WooCommerce's hook, as it's useless (doesn't handle multiple products).
	remove_action( 'wp_loaded', array( 'WC_Form_Handler', 'add_to_cart_action' ), 20 );

	$product_ids = explode( ',', $_REQUEST['add-to-cart'] );
	$count       = count( $product_ids );
	$number      = 0;

	foreach ( $product_ids as $id_and_quantity ) {
		// Check for quantities defined in curie notation (<product_id>:<product_quantity>)
		$id_and_quantity = explode( ':', $id_and_quantity );
		$product_id = $id_and_quantity[0];

		$_REQUEST['quantity'] = ! empty( $id_and_quantity[1] ) ? absint( $id_and_quantity[1] ) : 1;

		if ( ++$number === $count ) {
			// Ok, final item, let's send it back to woocommerce's add_to_cart_action method for handling.
			$_REQUEST['add-to-cart'] = $product_id;

			return WC_Form_Handler::add_to_cart_action( $url );

		$product_id        = apply_filters( 'woocommerce_add_to_cart_product_id', absint( $product_id ) );
		$was_added_to_cart = false;
		$adding_to_cart    = wc_get_product( $product_id );

		if ( ! $adding_to_cart ) {

		$add_to_cart_handler = apply_filters( 'woocommerce_add_to_cart_handler', $adding_to_cart->get_type(), $adding_to_cart );

		// Variable product handling
		if ( 'variable' === $add_to_cart_handler ) {
			woo_hack_invoke_private_method( 'WC_Form_Handler', 'add_to_cart_handler_variable', $product_id );

		// Grouped Products
		} elseif ( 'grouped' === $add_to_cart_handler ) {
			woo_hack_invoke_private_method( 'WC_Form_Handler', 'add_to_cart_handler_grouped', $product_id );

		// Custom Handler
		} elseif ( has_action( 'woocommerce_add_to_cart_handler_' . $add_to_cart_handler ) ){
			do_action( 'woocommerce_add_to_cart_handler_' . $add_to_cart_handler, $url );

		// Simple Products
		} else {
			woo_hack_invoke_private_method( 'WC_Form_Handler', 'add_to_cart_handler_simple', $product_id );

// Fire before the WC_Form_Handler::add_to_cart_action callback.
add_action( 'wp_loaded', 'webroom_add_multiple_products_to_cart', 15 );

 * Invoke class private method
 * @since   0.1.0
 * @param   string $class_name
 * @param   string $methodName
 * @return  mixed
function woo_hack_invoke_private_method( $class_name, $methodName ) {
	if ( version_compare( phpversion(), '5.3', '<' ) ) {
		throw new Exception( 'PHP version does not support ReflectionClass::setAccessible()', __LINE__ );

	$args = func_get_args();
	unset( $args[0], $args[1] );
	$reflection = new ReflectionClass( $class_name );
	$method = $reflection->getMethod( $methodName );
	$method->setAccessible( true );

	//$args = array_merge( array( $class_name ), $args );
	$args = array_merge( array( $reflection ), $args );
	return call_user_func_array( array( $method, 'invoke' ), $args );

How to use

Copy and paste the above snippet directly to your child theme’s functions.php. That’s all. Now lets see the front end part. Your single URL for adding multiple products to cart will look like:


Take a look at the ?add-to-cart=12345,43453 part. Here is where you add your product ids. If you want to add twice the same product, just type twice it’s product id:


or add the following string: &quantity=3, so the URL will become


How to add product to cart via url and redirect to checkout


Note: for this to work you must tick the “Enable AJAX add to cart buttons on archives” option under WooCommerce –> Settings –> Products -> General and also disable “Redirect to the cart page after successful addition”.

How to add Variable Products to cart via URL

All you need to do is get the variation ID and place it in the ?add-to-cart= url. Remember you can also add &quantity=3 so you add the product several times. Redirecting to Cart or Checkout is also valid here.

How to get Product id in WooCommerce

Go ahead and edit a product. Now take a look at the url, it will look like: 1


You will find the product id in ?post=1493.

If you want to further customize your WooCommerce store check out our other articles:

Recent Articles

Related Articles

If you enjoyed reading this, then please explore our other articles below:


Leave a comment
  1. Alexandru September 12, 2021 at 8:37 am - Reply

    Great job!

    Is there any way we can also add variation_id and attributes for every item that is added to the cart via URL? It would be great.


  2. Antje July 8, 2021 at 5:50 pm - Reply

    Thank you! This saved me from purchasing yet another plugin :)
    Worked super well straight away!

  3. Sebastian October 20, 2020 at 12:33 am - Reply

    the only thing that does not work is multiple IDs with X-Quantities,
    such as:
    Got around it with a very very very long URL though. Thank god for Excel :)

  4. Andrey April 22, 2020 at 10:51 am - Reply

    У меня происходило дублирование, можно решить так: от так можно https://site.com/cart?add-to-cart=7944,7807,7949:5&quantity=1

    Moderator translate: “I had duplication, you can solve it this way: from that you can https://site.com/cart?add-to-cart=7944,7807,7949:5&quantity=1

Leave a Reply

Comment policy: We love comments and appreciate the time that readers spend to share ideas and give feedback. However, all comments are manually moderated and those deemed to be spam or solely promotional will be deleted.