Apply coupon discount via GET method in URL even if cart is empty in WooCommerce Apply coupon discount via GET method in URL even if cart is empty in WooCommerce wordpress wordpress

Apply coupon discount via GET method in URL even if cart is empty in WooCommerce


The correct way to do it should be to:

  • Set the coupon code from the URL in the cart session as custom data.
  • Apply the discount from this coupon code when customer add first item to cart.
  • Remove the discount from this coupon if customer empty cart

You can set any existing coupon code from any Url (like shop page, other archives pages, products pages, my account pages, or any existing pages) adding to this existing url:
?code=DISCOUNTCODE at the end
(where DISCOUNTCODE is your coupon code name).

Here is the code:

// Set coupon code as custom data in cart sessionadd_action('wp_loaded', 'add_coupon_code_to_cart_session');function add_coupon_code_to_cart_session() {    // Exit if no code in URL or if the coupon code is already set cart session    if( empty( $_GET["code"] ) || WC()->session->get( 'custom_discount' ) ) return;    if( ! WC()->session->get( 'custom_discount' ) ) {        $coupon_code = esc_attr($_GET["code"]);        WC()->session->set( 'custom_discount', $coupon_code );        // If there is an existing non empty cart active session we apply the coupon        if( ! WC()->cart->is_empty() ){            WC()->cart->add_discount( $coupon_code );        }    }}// Add coupon code when a product is added to cart onceadd_action('woocommerce_add_to_cart', 'add_coupon_code_to_cart', 10, 6 );function add_coupon_code_to_cart( $cart_item_key, $product_id, $quantity, $variation_id, $variation, $cart_item_data ){    $coupon_code = WC()->session->get( 'custom_discount' );    $applied_coupons = WC()->session->get('applied_coupons');    if( empty($coupon_code) || in_array( $coupon_code, $applied_coupons ) ) return;    WC()->cart->add_discount( $coupon_code );}// Remove coupon code when user empty his cartadd_action('woocommerce_cart_item_removed', 'check_coupon_code_cart_items_removed', 10, 6 );function check_coupon_code_cart_items_removed( $cart_item_key, $cart ){    $coupon_code = WC()->session->get( 'custom_discount' );    if( $cart->has_discount( $coupon_code ) && $cart->is_empty() );        $cart->remove_coupon( $coupon_code );}

Code goes in function.php file of your active child theme (or active theme) or in any plugin file.

This is tested and works


use below code to make the coupan valid in any situation

add_filter('woocommerce_coupon_is_valid','coupon_always_valid',10,1);function coupon_always_valid($valid){     $valid = true;     return $valid ; }


add_action('woocommerce_before_cart', 'discount');function discount( ) {    global $woocommerce;    $code= $_GET["code"];   if(!empty($code)){           if(WC()->session->set( 'applied_coupons', $code )){     echo '<div class="woocommerce_message"><strong>Applied coupon!</strong></div>';        }    }}