我需要防止两张特定优惠券一起使用。我成功实现了这段代码,它可以防止将这些优惠券堆叠在 cart 页面上:
add_action( 'woocommerce_before_cart', 'check_coupon_stack' );
function check_coupon_stack() {
$coupon_code_1 = 'mycode1';
$coupon_code_2 = 'mycode2';
if ( WC()->cart->has_discount( $coupon_code1 ) && WC()->cart->has_discount( $coupon_code2) ) {
WC()->cart->remove_coupon( $coupon_code2 );
$notice_text = 'Discount code '.$coupon_code1.' cannot be combined with code '.$coupon_code2.'. Code '.$coupon_code2.' removed.';
wc_print_notice( $notice_text, 'error' );
wc_clear_notices();
}
}
但是,这并不能阻止在checkout页面上堆叠,该页面位于cart页面之后。
我尝试简单地添加:
add_action( 'woocommerce_before_checkout_form', 'check_coupon_stack' );
但这并不能让此功能在 checkout 页面上发挥作用。还需要什么?
WooCommerce 包含多个适用于优惠券的挂钩,
woocommerce_applied_coupon
就是其中之一,非常适合您的问题。
此外,您当前的代码仅在一个方向上起作用,即使用
$coupon_code_1
时,$coupon_code_2
被删除。但是,当您在问题中表明您希望防止同时使用两张特定优惠券时,这不适用于相反的方向。
我的回答考虑到了这一点,所以你得到:
function action_woocommerce_applied_coupon( $coupon_code ) {
// Settings
$coupon_code_1 = 'coupon1';
$coupon_code_2 = 'coupon2';
// Initialize
$combined = array( $coupon_code_1, $coupon_code_2 );
// Checks if coupon code exists in an array
if ( in_array( $coupon_code, $combined ) ) {
// Get applied coupons
$applied_coupons = WC()->cart->get_applied_coupons();
// Computes the difference of arrays
$difference = array_diff( $combined, $applied_coupons );
// When empty
if ( empty( $difference ) ) {
// Shorthand if/else - Get correct coupon to remove
$remove_coupon = $coupon_code == $coupon_code_1 ? $remove_coupon = $coupon_code_2 : $remove_coupon = $coupon_code_1;
// Remove coupon
WC()->cart->remove_coupon( $remove_coupon );
// Clear Notices
wc_clear_notices();
// Error message
$error = sprintf( __( 'Discount code "%1$s" cannot be combined with code "%2$s". Code "%2$s" removed.', 'woocommerce' ), $coupon_code, $remove_coupon );
// Show error
wc_print_notice( $error, 'error' );
}
}
}
add_action( 'woocommerce_applied_coupon', 'action_woocommerce_applied_coupon', 10, 1 );