问题
I am making coupon dynamically to use user email as coupon but how can I restrict user to use only one coupon per cart. If use multiple auto removed the previous one from cart.
add_filter ( 'woocommerce_get_shop_coupon_data', 'generate_coupons', 10, 2 );
function generate_coupons( $data, $code) {
global $wpdb, $woocommerce;
$vpm_options = get_option( 'vpm_email_coupon_option_name' ); // Array of All Options
$amount = $vpm_options['coupon_value_3']; // coupon_discount
$offer_type = $vpm_options['offer_type_2']; // Type: fixed_cart, percent, fixed_product, percent_product
//getting the coupon input value
if (filter_var($code, FILTER_VALIDATE_EMAIL) && email_exists( $code )) {
$code = $code ;
}else{
$code = '';
}
// Check if the coupon has already been created in the database
$sql = $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_title = %s AND post_type = 'shop_coupon' AND post_status = 'publish' ORDER BY post_date DESC LIMIT 1;", $code );
$coupon_id = $wpdb->get_var( $sql );
if ( empty( $coupon_id ) ) {
// Create a coupon with the properties you need
$data = array(
'discount_type' => $offer_type,
'coupon_amount' => $amount, // value
'product_ids' => array(),
'exclude_product_ids' => array(),
'usage_limit' => '',
'usage_limit_per_user' => '',//Limit
'limit_usage_to_x_items' => '',
'usage_count' => '',
'expiry_date' => '2020-12-31', // YYYY-MM-DD
);
// Save the coupon in the database
$coupon = array(
'post_title' => $code,
'post_content' => '',
'post_status' => 'publish',
'post_author' => 1,
'post_type' => 'shop_coupon'
);
$new_coupon_id = wp_insert_post( $coupon );
// Write the $data values into postmeta table
foreach ($data as $key => $value) {
update_post_meta( $new_coupon_id, $key, $value );
}
//apply the coupon
$woocommerce->cart->add_discount( $code );
return $data;
}
}
回答1:
The following code will remove the first applied coupon, if customer applies another coupon code, so there will be only one applied coupon in cart (the last applied coupon):
add_action( 'woocommerce_before_calculate_totals', 'one_applied_coupon_only', 10, 1 );
function one_applied_coupon_only( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
// For more than 1 applied coupons only
if ( sizeof($cart->get_applied_coupons()) > 1 && $coupons = $cart->get_applied_coupons() ){
// Remove the first applied coupon keeping only the last appield coupon
$cart->remove_coupon( reset($coupons) );
}
}
Code goes in function.php file of your active child theme (active theme). Tested and works.
来源:https://stackoverflow.com/questions/53238413/limit-to-one-applied-coupon-removing-other-previous-applied-coupons-in-woocomme