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 click on 'SHOP NOW' in the e-mail and the coupon will be automatically added.
As of now, for the link under the 'SHOP NOW' button I've entered the following:
websitename.biz/cart__trashed?code=DISCOUNTCODE
To handle $code
I've put this in my functions.php file:
add_action('woocommerce_before_cart', 'discount');
function discount( ) {
global $woocommerce;
$code= $_GET["code"];
if(!empty($code)){
if($woocommerce->cart->add_discount($code)){
echo '<div class="woocommerce_message"><strong>Applied coupon!</strong></div>';
}
}
}
The problem I'm facing here is:
- if there is nothing in the cart when the audience visits the website, the coupon will not be applied.
- If there was something added and stayed there (because of a cookie) then the coupon code is applied perfectly.
I believe its because the cart is empty, the code does not work.
Just want the code to be applied when the audience clicks the link.
How can I make this working?
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 (whereDISCOUNTCODE
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
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>';
}
}
}
来源:https://stackoverflow.com/questions/46814228/apply-coupon-discount-via-get-method-in-url-even-if-cart-is-empty-in-woocommerce