提问人:Phi Cao 提问时间:11/16/2023 最后编辑:LoicTheAztecPhi Cao 更新时间:11/16/2023 访问量:62
根据 Woocommerce 购物车小计阈值自动应用优惠券
Auto apply coupons based on Woocommerce cart subtotal thresholds
问:
尝试将优惠券自动应用于 WooCommerce 结帐。 尝试了许多片段,但似乎无法让它工作。
它要么抛出严重错误,要么不能可靠地应用优惠券。
我在WooCommerce中创建了以下优惠券:
- black10:如果客户花费> 100 英镑和 < 英镑 199.99 英镑,购物车可享受 10% 的折扣
- black20:如果客户花费 200 英镑>,购物车可享受 20% 的折扣
这是我的相关代码:
add_action( 'woocommerce_checkout_before_order_review' , 'add_coupon_notice' );
function add_coupon_notice() {
$cart_total = WC()->cart->get_subtotal();
$currency_code = get_woocommerce_currency();
wc_clear_notices();
if ( $cart_total > 200 ) {
WC()->cart->remove_coupon( 'black10' );
WC()->cart->apply_coupon( 'black20' );
wc_print_notice( '20% off £200 or more - Discount Applied!', 'notice' );
} elseif ( $cart_total > 100 ) {
WC()->cart->remove_coupon( 'black20' );
WC()->cart->apply_coupon( 'black10' );
wc_print_notice( '10% off £100 or more - Discount Applied!', 'notice' );
}
wc_clear_notices();
}
但它不能可靠地工作。
答:
1赞
LoicTheAztec
11/16/2023
#1
您可以使用以下替换代码,该代码将根据定义的购物车项目小计(包括税费阈值金额)可靠地应用/删除优惠券,并显示自定义通知:
add_action( 'woocommerce_before_calculate_totals' , 'discount_based_on_cart_items_subtotal' );
function discount_based_on_cart_items_subtotal( $cart ) {
if ( is_admin() && !defined('DOING_AJAX') )
return;
$subtotal = 0; // Initializing
// Loop through cart items to get the subtotal excluding taxes
foreach ( $cart->get_cart() as $item ) {
$subtotal += $item['line_subtotal'] + $item['line_subtotal_tax'];
}
if ( $subtotal >= 100 && $subtotal < 200 ) {
if ( ! $cart->has_discount('black10') ) {
$cart->apply_coupon( 'black10' );
$notice = __('10% OFF for '.wc_price(100).' or more - Discount Applied!');
}
if ( $cart->has_discount('black20') ) {
$cart->remove_coupon( 'black20' );
}
} elseif ( $subtotal >= 200 ) {
if ( ! $cart->has_discount('black20') ) {
$cart->apply_coupon( 'black20' );
$notice = __('20% OFF for '.wc_price(200).' or more - Discount Applied!');
}
if ( $cart->has_discount('black10') ) {
$cart->remove_coupon( 'black10' );
}
} else {
if ( $cart->has_discount('black20') ) {
$cart->remove_coupon( 'black20' );
}
if ( $cart->has_discount('black10') ) {
$cart->remove_coupon( 'black10' );
}
wc_clear_notices();
}
if ( isset($notice) ) {
wc_clear_notices();
wc_add_notice( $notice, 'notice' );
}
}
代码位于子主题的函数.php文件中(或插件中)。经过测试并有效。
对于不含税的小计,请替换:
$subtotal += $item['line_subtotal'] + $item['line_subtotal_tax'];
跟:
$subtotal += $item['line_subtotal'];
注意:
没有在优惠券设置中设置最低金额,因为代码正在处理它。
评论
0赞
Phi Cao
11/16/2023
已经尝试过这个,看起来是一个好的开始,我需要添加一些东西,例如如果购物车被调整并最终低于阈值,则删除优惠券(否则用户不断收到他们添加的优惠券无效的提示) if ( $subtotal < 100 ) { if ( $cart->has_discount('black10') ) { $cart->remove_coupon( 'black10' ); } if ( $cart->has_discount('black20') ) { $cart->remove_coupon( 'black20' ); 但继续得到一个错误。
0赞
Phi Cao
11/16/2023
我注意到该代码仅在您在创建优惠券时未定义最低支出时才有效。这在现实世界中是行不通的,因为有人可以手动输入“black20”作为优惠券代码,例如,购物车 20 英镑可享受 50% 的折扣。您可以尝试将最低支出分配给优惠券的代码吗?@LoicTheAztec
0赞
Phi Cao
11/16/2023
此外,Black10 优惠券在优惠券设置中的最低消费为 100 英镑(含税),因此如果 $subtotal(含税)>=100,则代码段应为
0赞
Phi Cao
11/16/2023
是的,你是对的,最新代码不需要在后端设置最低金额。一切都按预期进行。PS 我不得不删除其中一个wc_clear_notices();让它工作
0赞
Phi Cao
11/16/2023
我在isset($notice) ) { @LoicTheAztec
评论