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

后端 未结 3 1667
余生分开走
余生分开走 2020-12-31 18:27

I have a plugin that sends an advocates referral coupon code to e-mails that they enter. When the audience receives this email I\'d like to create a flow where they can clic

相关标签:
3条回答
  • 2020-12-31 18:59

    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 session
    add_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 once
    add_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 cart
    add_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

    0 讨论(0)
  • 2020-12-31 19:04
    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>';
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-31 19:05

    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 ; 
    }
    
    0 讨论(0)
提交回复
热议问题